GateWay是什么
上一代zuul 1.x官网[https://github.com/Netflix/zuul/wiki]
Gateway官网[https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/]
概述
Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;
但在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关替代Zuul,那就是SpringCloud Gateway—句话:gateway是原zuul1.x版的替代
Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和Project Reactor等技术。
Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。
SpringCloud Gateway是Spring Cloud的一个全新项目,基于Spring 5.0+Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在为微服务架构提供—种简单有效的统一的API路由管理方式。
SpringCloud Gateway作为Spring Cloud 生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway的目标提供统一的路由方式且基于 Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
微服务架构中网关的位置
GateWay非阻塞异步模型
有Zuull了怎么又出来Gateway?我们为什么选择Gateway?
- netflix不太靠谱,zuul2.0一直跳票,迟迟不发布。
一方面因为Zuul1.0已经进入了维护阶段,而且Gateway是SpringCloud团队研发的,是亲儿子产品,值得信赖。而且很多功能Zuul都没有用起来也非常的简单便捷。
Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心。虽然Netflix早就发布了最新的Zuul 2.x,但Spring Cloud貌似没有整合计划。而且Netflix相关组件都宣布进入维护期;不知前景如何?
多方面综合考虑Gateway是很理想的网关选择。
- SpringCloud Gateway具有如下特性
基于Spring Framework 5,Project Reactor和Spring Boot 2.0进行构建;
动态路由:能够匹配任何请求属性;
可以对路由指定Predicate (断言)和Filter(过滤器);
集成Hystrix的断路器功能;
集成Spring Cloud 服务发现功能;
易于编写的Predicate (断言)和Filter (过滤器);
请求限流功能;
支持路径重写。
Gateway工作流程
三大核心概念
Route(路由) - 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由;
Predicate(断言) - 参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由;
Filter(过滤) - 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。
predicate就是我们的匹配条件;而fliter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了。
项目搭建
1.新建Module - cloud-gateway-gateway9527
2.pom
1 |
|
3.yml
1 | server: |
4.主启动类
1 | import org.springframework.boot.SpringApplication; |
5.9527网关如何做路由映射
cloud-provider-payment8001看看controller的访问地址
- get
- lb
我们目前不想暴露8001端口,希望在8001外面套一层9527
6.YML新增网关配置
1 | server: |
8.测试
启动7001
启动8001-cloud-provider-payment8001
启动9527网关
访问说明
Gateway配置路由的两种方式
1.配置文件.yml、.properties配置
2.lamda表达式,代码中注入RouteLocator的Bean
1 | RemoteAddressResolver resolver = XForwardedRemoteAddressResolver |
GateWay配置动态路由
默认情况下Gateway会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能(不写死一个地址)。
启动
- eureka7001
- payment8001/8002
需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。
lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri。
配置文件
1 | server: |
测试
浏览器输入 - http://localhost:9527/payment/lb
结果
不停刷新页面,8001/8002两个端口切换。
GateWay常用的Predicate
Route Predicate Factories这个是什么
Spring Cloud Gateway matches routes as part of the Spring WebFlux HandlerMapping infrastructure. Spring Cloud Gateway includes many built-in route predicate factories. All of these predicates match on different attributes of the HTTP request. You can combine multiple route predicate factories with logical and statements. link[https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-request-predicates-factories]
Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。
Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个RoutePredicate工厂可以进行组合。
Spring Cloud Gateway创建Route 对象时,使用RoutePredicateFactory 创建 Predicate对象,Predicate 对象可以赋值给Route。Spring Cloud Gateway包含许多内置的Route Predicate Factories。
所有这些谓词都匹配HTTP请求的不同属性。多种谓词工厂可以组合,并通过逻辑and。
1 | predicate |
常用的Route Predicate Factory
1.The After Route Predicate Factory
2.The Before Route Predicate Factory
3.The Between Route Predicate Factory
4.The Cookie Route Predicate Factory
5.The Header Route Predicate Factory
6.The Host Route Predicate Factory
7.The Method Route Predicate Factory
8.The Path Route Predicate Factory
9.The Query Route Predicate Factory
10.The RemoteAddr Route Predicate Factory
11.The weight Route Predicate Factory
讨论几个Route Predicate Factory
The After Route Predicate Factory
1 | spring: |
可以通过下述方法获得上述格式的时间戳字符串
1 | import java.time.ZonedDateTime; |
The Between Route Predicate Factory
1 | spring: |
The cookie route predicate factory takes two parameters, the cookie name and a regular expression.
This predicate matches cookies that have the given name and whose values match the regular expression.
测试
1 | # 该命令相当于发get请求,且没带cookie |
The Header Route Predicate Factory
1 | spring: |
The header route predicate factory takes two parameters, the header name and a regular expression.
This predicate matches with a header that has the given name whose value matches the regular expression.
测试
1 | # 带指定请求头的参数的CURL命令 |
小结
说白了,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。
GateWay的Filter
Route filters allow the modification of the incoming HTTP request or outgoing HTTP response in some manner. Route filters are scoped to a particular route. Spring Cloud Gateway includes many built-in GatewayFilter Factories.
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生。
Spring Cloud Gateway的Filter:
生命周期:
- pre
- post
种类(具体看官方文档):
- GatewayFilter - 有31种
- GlobalFilter - 有10种
常用的GatewayFilter:AddRequestParameter GatewayFilter
自定义全局GlobalFilter:
两个主要接口介绍:
- GlobalFilter
- Ordered
能干什么:
- 全局日志记录
- 统一网关鉴权
- …
自定义过滤器Filter 实现GlobalFilter,Ordered接口
代码案例:
GateWay9527项目添加MyLogGateWayFilter类:
1 | import lombok.extern.slf4j.Slf4j; |
测试:
启动:
EurekaMain7001
PaymentMain8001
GateWayMain9527
PaymentMain8002
浏览器输入:
http://localhost:9527/payment/lb - 反问异常
http://localhost:9527/payment/lb?uname=abc - 正常反问
...
...
This is copyright.