本文主要内容是:为什么要使用网关,整合Gateway,Gateway核心学习:Route,Predicate,Filter,最后使用Gateway聚合微服务请求
先总结至此的架构
不使用网关行嘛?
各个请求直接打在各个微服务
小规模看起来还行,如果微服务很多呢?上百个呢?带来哪些问题呢
要解决以上这些问题,业界普遍做法就是构建一个网关,外部请求经过网关转发再打到相应的微服务,有以下好处
◆ 是Spring Cloud的网关(第二代) , 未来会取代Zuul(第一代)◆ 基于Netty、 Reactor以及WebFlux构建
◆ 性能强劲是第一代网关Zuul 1.x的1.6倍!性能PK :
推荐阅读
纠错帖:Zuul & Spring Cloud Gateway & Linkerd性能对比◆ 功能强大
◆ 设计优雅,易扩展
◆ 依赖Netty与Webflux ,不是Servlet编程模型,有一定的学习成本◆ 不能在Servlet容器下工作,也不能构建成WAR包◆ 不支持Spring Boot 1.x,至少都得2.x版本
新建项目并启动
◆ Route(路由)
Spring. Cloud. Gateway的基础元素,可简单理解成一条转发的规则。
包含: ID、目标URL、Predicate集合以及 Filter集合。
◆Predicate (谓词)
即java.util.function.Predicate , Spring Cloud Gateway使用
Predicate实现路由的匹配条件。
◆ Filter (过滤器)
然而我们并未如此配置路由哦!而是如下
对应源码
推荐阅读
Spring Cloud Gateway-路由谓词工厂详解(Route Predicate Factories) ◆ 继承: AbstractGatewayFilterFactory◆ 参考示例: org.springframework.cloud.gateway.filter.factory.RequestSizeGatewayFilterFactory
配置形式
◆ 继承 : AbstractNameValueGatewayFilterFactory◆ 参考示例: org.springframework.cloud.gateway.filter.factory.AddRequestHeaderGatewayFilterFactory
配置形式
这种方式其实是第一种的简化版
◆ exchange.getRequest().mutate().xxx //修改request◆ exchange.mutate().xxx //修改exchange◆ chain.filter(exchange) //传递给下一个过滤器处理◆ exchange.getResponse() //拿到响应
记录日志功能
配置文件,两个参数
有执行顺序哦!
推荐阅读
Spring Cloud Gateway-全局过滤器(Global Filters)悬念:如何为Spring Cloud Gateway整合Sentinel?Sentinel在V1.6+才支持gateway!
Spring Cloud Gateway监控
Spring Cloud Gateway排错、调试技巧总结
Spring Cloud Gateway限流详解
◆ 路由、路由谓词工厂、过滤器工厂、全局过滤器...
◆ 网关集大成
● 注册到Nacos
● 集成Ribbon
● 容错(默认Hystrix ,也可用Sentinel )