springCloud (一)gateway (整理&转发)
Spring Cloud Gateway
是基于 Spring5.0、SpringBoot2.0 和 Project Reactor 开发的网关,旨在提供一种简单而有效的方式来对 API 进行路由,基于过滤器链的方式提供:安全,监控 / 埋点,和限流。
Spring Cloud Gateway 基于 Spring Boot2.x、Spring WebFlux 和 Project Reactor 构建,属于异步非阻塞模型。
Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
核心观念
(1)Route(路由):
网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。
单个 URI 的地址的 schema 协议,一般为 http 或者 https 协议。 和注册中心相结合的路由配置的 schema 协议部分为自定义的 lb: 类型,表示从微服务注册中心(如 Eureka)订阅服务,并且进行服务的路由。
(2)Predicate(断言):
这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。
路由匹配规则, Predicates 工厂通过不同的 HTTP 请求参数来匹配,多个 Predicates 工厂可以组合使用。
路由谓词工厂(Route Predicate Factories)
类型 | 路由谓词 | 路由谓词工厂 | 描述 |
---|---|---|---|
时间相关 | After | AfterRoutePredicateFactory | 在某个时间之后的请求才会被转发,如:`- After=2017-01-20T17:42:47.789-07:00 [America/Denver]` |
Before | BeforeRoutePredicateFactory | 在某个时间之前的请求才会被转发,如:`- Before=2017-01-20T17:42:47.789-07:00 [America/Denver]` | |
Between | BetweenRoutePredicateFactory | 在某个时间段之间的才会被转发,如:`- Between=2017-01-20T17:42:47.789-07:00 [America/Denver], 2017-01-21T17:42:47.789-07:00 [America/Denver]` | |
Cookie 相关 | Cookie | CookieRoutePredicateFactory | `- Cookie=chocolate, ch.p` 名为 chocolate 的表单或者满足正则 ch.p 的表单才会被匹配到进行请求转发 |
Header 相关 | Header | HeaderRoutePredicateFactory | `- Header=X-Request-Id, \d+` 携带参数 X-Request-Id 或者满足 \d + 的请求头才会匹配 |
Host | HostRoutePredicateFactory | `- Host=**.somehost.org,**.anotherhost.org` 当主机名为 somehost.org 或 anotherhost.org 的时候才会被转发 | |
请求相关 | Method | MethodRoutePredicateFactory | `- Method=GET,POST` 只有 GET 和 POST 方法才会匹配转发请求 |
Path | PathRoutePredicateFactory | `- Path=/red/{segment},/blue/{segment}` 当请求的路径为 /red/、/blue/ 开头的时才会被转发 | |
Query | QueryRoutePredicateFactory | `- Query=green` 只要请求中包含 green 参数即可 | |
RemoteAddr | RemoteAddrRoutePredicateFactory | `- RemoteAddr=192.168.1.1/24` 主机 IP | |
Weight | WeightRoutePredicateFactory | `- Weight=group1, 2` 权重是按组计算的,两个参数:group 和 weight(int) |
(3)Filter(过滤器):
可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的实例。
StripPrefix网关过滤器工厂采用一个参数StripPrefix。 StripPrefix参数表示在将请求发送到下游之前从请求中剥离的路径个数。
PrefixPath 过滤器,它的作用和StripPrefix正相反,是在URL路径前面添加一部分的前缀。
工作流程
客户端向 Spring Cloud Gateway 发出请求。 由网关处理程序 Gateway Handler Mapping 映射确定请求与路由匹配,则将其发送到网关 Web 处理程序 Gateway Web Handler。 Web 处理程序通过指定的过滤器链将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器被虚线分隔的原因是过滤器可以在发送代理请求之前和之后运行逻辑。执行所有 pre 过滤器逻辑,然后发出代理请求;发出代理请求后,将运行 post 过滤器逻辑。
相关配置示例:
spring:
redis:
host: localhost
port: 6379
password:
cloud:
gateway:
discovery:
locator: # 是否与服务发现组件进行结合,通过 serviceId 转发到具体的服务实例。
lowerCaseServiceId: true # 将请求路径的服务名配置改成小写
enabled: true #默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能
routes:
# 认证中心
- id: aei-auth #### 自定义的路由 ID,保持唯一性
uri: lb://aei-auth ### 从注册中心获取服务,且以lb(load-balance)负载均衡方式转发,请求schema一般是http或https
predicates:
- Path=/auth/** ### 将以/auth/开头的请求转发到uri为lb://aei-auth的地址上
filters: ##过滤器拦截处理
# 验证码处理
- CacheRequestFilter
- ValidateCodeFilter
- StripPrefix=1 #将请求发送到下游之前从请求中剥离的1个路径,比如外部请求的url(比如http:/192.168.1.1/auth/login)最后转发到注册中心的服务为:lb://aei-auth/login
参考学习网址:
网关配置 https://my.oschina.net/chaoo/blog/5291146
SpringCloud gateway (史上最全) https://blog.csdn.net/a1036645146/article/details/106383883
备注:以上信息仅个人学习整理,部分内容摘抄优秀博主