一、基本功能
网关核心功能是路由转发,因此不要有耗时操作在网关上处理,让请求快速转发到后端服务上
网关还能做统一的熔断(Hystrix断路器)、请求限流(接口、用户)、安全认证、日志监控、路径重写、服务注册发现、可针对路由设置Predicate(断言)和 Filter(过滤器)等
匹配的注册中心:Eureka、Consul、Nacos
Zuul对比gateway:Zuul1.x是阻塞的,2.x的版本中,Zuul也是基于Netty,也是非阻塞的,差别不大
Gateway是基于WebFlux的(协调上下游各个组件提供响应式编程支持,非阻塞)
代理 | 延迟 | 平均请求/秒/线程 |
---|---|---|
gateway | 6.61ms | 3.24k |
linkered | 7.62ms | 2.82k |
zuul | 12.56ms | 2.09k |
none | 2.09ms | 11.77k |
二、工作原理
原理说明:客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指 定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
注: Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,
在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
三、predicate(决定了一个请求走哪一个路由)
用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。add–与、or–或、negate–非。
配置示例:
1)After Route Predicate Factory 时间匹配,只有当前时间大于设定时间,路由才会匹配
spring:
cloud:
gateway:
routes:
- id: after_route
predicates:
- After=2018-12-25T14:33:47.789+08:00
这个路由规则会在东8区的2018-12-25 14:33:47后,将请求都转跳到google。
2)Before Route Predicate Factory 时间匹配,只要当前时间小于设定时间,路由才会匹配请求
spring:
cloud:
gateway:
routes:
- id: before_route
predicates:
- Before=2018-12-25T14:33:47.789+08:00
这个路由规则会在东8区的2018-12-25 14:33:47前,将请求都转跳到google。
3)Between Route Predicate Factory 时间匹配,只要当前时间大于第一个设定时间,并小于第二个设定时间,路由才会匹配请求。
spring:
cloud:
gateway:
routes:
- id: between_route
predicates:
- Between=2018-12-25T14:33:47.789+08:00, 2018-12-26T14:33:47.789+08:00
这个路由规则会在东8区的2018-12-25 14:33:47到2018-12-26 14:33:47之间,将请求都转跳到google。
4)Cookie Route Predicate Factory 参数匹配 使用的是cookie名字和正则表达式的value作为两个输入参数,请求的cookie需要匹配cookie名和符合其中value的正则
spring:
cloud:
gateway:
routes:
- id: cookie_route
predicates:
- Cookie=cookiename, cookievalue
路由匹配请求存在cookie名为cookiename,cookie内容匹配cookievalue的,将请求转发到google。
5)Header Route Predicate Factory 参数匹配,正则匹配header的name,value
spring:
cloud:
gateway:
routes:
- id: header_route
predicates:
- Header=X-Request-Id, \d+
路由匹配存在名为X-Request-Id,内容为数字的header的请求,将请求转发到google。
6)Host Route Predicate Factory host匹配
spring:
cloud:
gateway:
routes:
- id: host_route
predicates:
- Host=**.somehost.org,**.anotherhost.org
路由会匹配Host示例:www.somehost.org 或 beta.somehost.org或www.anotherhost.org等请求。
7)Method Route Predicate Factory HTTP的method来匹配路由
spring:
cloud:
gateway:
routes:
- id: method_route
predicates:
- Method=GET
路由会匹配到所有GET方法的请求。根据请求的方式来匹配
8)Path Route Predicate Factory 使用path列表作为参数,使用Spring的PathMatcher匹配path,可以设置可选变量。
spring:
cloud:
gateway:
routes:
- id: host_route
predicates:
- Path=/foo/{segment},/bar/{segment}
上面路由可以匹配诸如:/foo/1 或 /foo/bar 或 /bar/baz等 其中的segment变量可以通过下面方式获取:
PathMatchInfo variables = exchange.getAttribute(URI_TEMPLATE_VARIABLES_ATTRIBUTE);
Map uriVariables = variables.getUriVariables();
String segment = uriVariables.get(“segment”);
9)Query Route Predicate Factory 可以通过一个或两个参数来匹配路由,一个是查询的name,一个是查询的正则value。
spring:
cloud:
gateway:
routes:
- id: query_route
predicates:
- Query=baz
路由会匹配所有包含baz查询参数的请求
spring:
cloud:
gateway:
routes:
- id: query_route
predicates:
- Query=foo, ba.
路由会匹配所有包含foo,并且foo的内容为诸如:bar或baz等符合ba.正则规则的请求。
10)RemoteAddr Route Predicate Factory 通过无类别域间路由(IPv4 or IPv6)列表匹配路由
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
predicates:
- RemoteAddr=192.168.1.1/24
上面路由就会匹配RemoteAddr诸如192.168.1.10等请求,默认情况下获取