springcloudgetaway简介及配置(2)
⼀个⽐较详细的参考:Spring cloud gateway 详解和配置使⽤:
1.  为什么是Spring Cloud Gateway
⼀句话,Spring Cloud已经放弃Netflix Zuul了。现在Spring Cloud中引⽤的还是Zuul 1.x版本,⽽这个版本是基于过滤器的,是阻塞IO,不⽀持长连接。Zuul 2.x版本跟1.x的架构⼤⼀样,性能也有所提升。既然Spring Cloud已经不再集成Zuul 2.x了,那么是时候了解⼀下Spring Cloud Gateway了。
2.  API⽹关
API⽹关是⼀个服务器,是系统的唯⼀⼊⼝。从⾯向对象设计的⾓度看,它与外观模式类似。API⽹关封装了系统内部架构,为每个客户端提供⼀个定制的API。它可能还具有其它职责,如⾝份验证、监控、负载均衡、缓存、请求分⽚与管理、静态响应处理。API⽹关⽅式的核⼼要点是,所有的客户端和消费端都通过统⼀的⽹关接⼊微服务,在⽹关层处理所有的⾮业务功能。通常,⽹关也是提供REST/HTTP的访问API。
⽹关应当具备以下功能:
性能:API⾼可⽤,负载均衡,容错机制。
安全:权限⾝份认证、脱敏,流量清洗,后端签名(保证全链路可信调⽤),⿊名单(⾮法调⽤的限制)。
⽇志:⽇志记录(spainid,traceid)⼀旦涉及分布式,全链路跟踪必不可少。
缓存:数据缓存。
监控:记录请求响应数据,api耗时分析,性能监控。
限流:流量控制,错峰流控,可以定义多种限流规则。
灰度:线上灰度部署,可以减⼩风险。
路由:动态路由规则。
⽬前,⽐较流⾏的⽹关有:Nginx 、 Kong 、Orange等等,还有微服务⽹关Zuul 、Spring Cloud Gateway等等
对于 API Gateway,常见的选型有基于 Openresty 的 Kong、基于 Go 的 Tyk 和基于 Java 的 Zuul。这三个选型本⾝没有什么明显的区别,主要还是看技术栈是否能满⾜快速应⽤和⼆次开发。
以上说的这些功能,这些开源的⽹关组件都有,或者借助Lua也能实现,⽐如:Nginx + Lua
那要Spring Cloud Gateway还有什么⽤呢?
其实,我个⼈理解是这样的:
像Nginx这类⽹关,性能肯定是没得说,它适合做那种门户⽹关,是作为整个全局的⽹关,是对外的,处于最外层的;⽽Gateway这种,更像是业务⽹关,主要⽤来对应不同的客户端提供服务的,⽤于聚合业务的。各个微服务独⽴部署,职责单⼀,对外提供服务的时候需要有⼀个东西把业务聚合起来。
像Nginx这类⽹关,都是⽤不同的语⾔编写的,不易于扩展;⽽Gateway就不同,它是⽤Java写的,易于扩展和维护
Gateway这类⽹关可以实现熔断、重试等功能,这是Nginx不具备的
所以,你看到的⽹关可能是这样的:
2.1.  Netflix Zuul 1.x  VS  Netflix Zuul 2.x
3.  Spring Cloud Gateway
3.1.  特性
基于Spring Framework 5、Project Reactor和Spring Boot 2.0构建
能够在任意请求属性上匹配路由
predicates(谓词)和 filters(过滤器)是特定于路由的
集成了Hystrix断路器
集成了Spring Cloud DiscoveryClient
易于编写谓词和过滤器
请求速率限制
路径重写
3.2.  术语
Route :路由是⽹关的基本组件。它由ID、⽬标URI、谓词集合和过滤器集合定义。如果聚合谓词为true,则匹配路由Predicate : This is a Java 8 Function Predicate
Filter :是GatewayFilter的⼀个实例,在这⾥,可以在发送下游请求之前或之后修改请求和响应
3.3.  原理
客户端向Spring Cloud Gateway发出请求。如果Gateway Handler Mapping确定请求与路由匹配,则将其发送给Gateway Web Handler。这个Handler运⾏通过特定于请求的过滤器链发送请求。过滤器可以在发送代理请求之前或之后执⾏逻辑。执⾏所有的“pre”过滤逻辑,然后发出代理请求,最后执⾏“post”过滤逻辑。
3.4.  Route Predicate Factories
Spring Cloud Gateway 包含许多内置的 Route Predicate Factories
所有这些predicates⽤于匹配HTTP请求的不同属性
多个 Route Predicate Factories 可以通过逻辑与(and)结合起来⼀起使⽤
3.4.1.  After Route Predicate Factory
spring:
cloud:
gateway:
routes:
- id: after_route
uri:
predicates:
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
这个路由匹配“美国丹佛时间2017-01-20 17:42”之后的任意请求
3.4.2.  Header Route Predicate Factory
spring:
cloud:
gateway:
routes:
-
id: header_route
uri:
predicates:
- Header=X-Request-Id, \d+
这个路由匹配“请求头包含X-Request-Id并且其值匹配正则表达式\d+”的任意请求
3.4.3.  Method Route Predicate Factory
spring:
cloud:
gateway:
routes:
- id: method_route
uri:
predicates:
- Method=GET
这个路由匹配任意GET请求
3.4.4.  Path Route Predicate Factory
spring:
cloud:
gateway:
routes:
- id: host_route
uri:
predicates:
- Path=/foo/{segment},/bar/{segment}
这个路由匹配这样路径的请求,⽐如:/foo/1 或 /foo/bar 或 /bar/baz
3.4.5.  Query Route Predicate Factory
这个Predicate有两个参数:⼀个必须的参数名和⼀个可选的正则表达式
spring:
cloud:
gateway:
routes:
- id: query_route
uri:
predicates:
- Query=baz
这个路由匹配“查询参数中包含baz”的请求
spring:
cloud:
gateway:
routes:
- id: query_route
uri:
predicates:
- Query=foo, ba.
这个路由匹配“查询参数中包含foo,并且其参数值满⾜正则表达式ba.”的请求,⽐如:bar,baz
3.4.6.  RemoteAddr Route Predicate Factory
这个路由接受⼀个IP(IPv4或IPv6)地址字符串。例如:192.168.0.1/16,其中192.168.0.1,16是⼦⽹掩码
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri:
predicates:
- RemoteAddr=192.168.1.1/24
这⾥路由匹配远程地址是这样的请求,例如:192.168.1.10
3.5.  GatewayFilter Factories(⽹关过滤器)
路由过滤器允许以某种⽅式修改传⼊的HTTP请求或传出HTTP响应。路由过滤器的作⽤域是特定的路由。Spring Cloud Gateway包含许多内置的⽹关过滤器⼯⼚。
3.5.1.  AddRequestHeader GatewayFilter Factory
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri:
filters:
- AddRequestHeader=X-Request-Foo, Bar
对于所有匹配的请求,将会给传给下游的请求添加⼀个请求头 X-Request-Foo:Barreactor spring
3.5.2.  AddRequestParameter GatewayFilter Factory
spring:
cloud:
gateway:
routes:
- id: add_request_parameter_route
uri:
filters:
- AddRequestParameter=foo, bar
对于所有匹配的请求,将给传给下游的请求添加⼀个查询参数 foo=bar
3.5.3.  AddResponseHeader GatewayFilter Factory
spring:
cloud:
gateway:
routes:
- id: add_response_header_route
uri:
filters:
- AddResponseHeader=X-Response-Foo, Bar
对于所有匹配的请求,添加⼀个响应头 X-Response-Foo:Bar
3.5.
4.  Hystrix GatewayFilter Factory
Hystrix⽹关过滤器允许你将断路器引⼊⽹关路由,保护你的服务免受级联失败的影响,并在下游发⽣故障时提供预备响应。
为了启⽤Hystrix⽹关过滤器,你需要引⼊ spring-cloud-starter-netflix-hystrix
Hystrix⽹关过滤器需要⼀个name参数,这个name是HystrixCommand的名字
spring:
cloud:
gateway:
routes:
- id: hystrix_route
uri:
filters:
- Hystrix=myCommandName
给这个过滤器包装⼀个名字叫myCommandName的HystrixCommand
Hystrix⽹关过滤器也接受⼀个可选的参数fallbackUri,但是⽬前只⽀持forward:前缀的URL。也就是说,如果这个fallback被调⽤,请求将被重定向到匹配的这个URL。
spring:
cloud:
gateway:
routes:
- id: hystrix_route
uri: lb://backing-service:8088
predicates:
- Path=/consumingserviceendpoint
filters:
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/incaseoffailureusethis
- RewritePath=/consumingserviceendpoint, /backingserviceendpoint
当fallback被调⽤的时候,请求将被重定向到/incaseoffailureusethis
spring:
cloud:
gateway:
routes:
- id: ingredients
uri: lb://ingredients
predicates:
- Path=//ingredients/**
filters:
- name: Hystrix
args:
name: fetchIngredients
fallbackUri: forward:/fallback

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。