一文彻底搞懂Gateway的应用、谓词、过滤器和限流

gateway构建在Spring5、SpringBoot2和Reactor基础之上。

前言

Spring Cloud中集成了很多常用的功能,如服务、降级和熔断等,如果要集成Spring Cloud的功能,首先要注意的就是版本问题:

Spring Cloud和Spring Boot的版本对应表
Cloud版本 Boot版本 描述
2021.0.x aka Jubilee 2.6.x
2020.0.x aka Ilford 2.4.x, 2.5.x (Starting with 2020.0.3)
Hoxton 2.2.x, 2.3.x (Starting with SR5)
Greenwich 2.1.x 不再支持
Finchley 2.0.x 不再支持
Edgware 1.5.x 不再支持
Dalston 1.5.x 不再支持

使用Spring Cloud Gateway

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

如果想禁用Gateway,可使用spring.cloud.gateway.enabled=false

基本组件

  1. Route: 路由,一个完整的Route由id、uri、predicates和filters构成,当predicates匹配当前请求时,该Route生效;
  2. Predicate: 谓词,判断某个请求是否命中该Route,是一个参数为 Spring Framework ServerWebExchange的类型 Java 8 Function Predicate
  3. Filter: 当匹配到Route后,这些过滤器将应用到当前请求,执行顺序用Ordered控制。

工作流程

Gateway高级视图

  1. Gateway Client发起一个请求;
  2. 如果Gateway Handler Mapping匹配当前请求,会转发到 Gateway Web Handler进行处理;
  3. Gateway Web Handler会按顺序执行 filters,并把结果向上返回;

filtersprepost,其中pre在实际业务服务之前执行,post是在实际业务服务之后执行。

注意事项

Gateway是构建在Spring Boot 2.x、Spring
webflux和Reactor之上,这就意味着和我们常用的Spring-boot-starter-web并不兼容,所以像Spring dataSpring Security等组件也不兼容。

谓词 Predicate

Predicate:谓词,用于判断当前请求是否命中该Route

定义方式

定义谓词有两种方式:完整定义和快捷定义。

完整定义

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://imdony.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue

predicates是一个数组,包括两个key:nameargsname表示该predicate的类型(即采用哪种匹配策略,示例中表示判断Cookie),args是判断的参数,是一个key-value映射表(示例中表示要包括Cookie键值是mycookie=mycookievalue才会命中该Route。

快捷定义

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

快捷方式省略了nameargs两个key,直接用name=args的方式把两部分连接起来,其中args部分第一个表示args中的name,逗号(,)后面表示regexp

预置的Predicate

Spring Cloud Gateway预置了很多可以直接使用的Predicate,而且可以组合使用。

After:在某个时间点(ZonedDateTime)之后的请求会命中该Route

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://imdony.org
        predicates:
        - After=2017-01-20T17:42:47[Asia/Shanghai]

2017-01-20 17:42:47之后所有的请求,都将转调 https://imdony.org,可用于控制规划新服务上线时间。

Before:在某个时间点(ZonedDateTime)之前的请求会命中该Route

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2017-01-20T17:42:47[Asia/Shanghai]

2017-01-20 17:42:47之前所有的请求,都将转调 https://imdony.org,可用于控制服务下线时间。

Between:在某时间之间的请求会命中该Route

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2017-01-20T17:42:47[Asia/Shanghai], 2017-01-21T17:42:47[Asia/Shanghai]

2017-01-20 17:42:472017-01-21 17:42:47之间所有的请求,都将转调 https://imdony.org,可用于控制

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值