Spring cloud Gateway常用配置
作者:mmseoamin日期:2023-12-18

gateway里的常用配置

前面的例子是通过路径(Path)方式配置路由转发,gateway还还有其他的配置,下面做个简单的介绍

1 路由 route

Route 主要由:路由id、目标uri、断言集合、过滤器集合组成。前面的实例用到了id、uri、断言。

  1. id:路由标识,要求唯一,名称任意(默认值 uuid,一般不用,需要自定义)
  2. uri:请求最终被转发到的目标地址
  3. order: 路由优先级,数字越小,优先级越高
  4. predicates:断言数组,即判断条件,如果返回值是boolean,则转发请求到 uri 属性指定的服务中
  5. filters:过滤器数组,在请求传递过程中,对请求做一些修改

2 断言 predicate

断言Predicate是java8引入的新特性,它接收一个输入参数,返回布尔值结果。我们代码中也可以使用Predicate,通过Predicate可以让你的代码更加的简洁。

gateway的Predict决定了请求由哪一个路由处理。它Spring WebFlux的HandlerMapping实现。Gateway包含了很多路由断言工厂,这些工厂对HTTP请求的很多属性进行了处理,当客户端请求时,HandlerMapping会获取请求参数,并与Gateway中配置的Predicates进行比对,满足规则就按规则约定进行路由放行,否则拒绝访问或报404。源码在 org.springframework.cloud.gateway.handler.predicate 包中,感兴趣或者排查问题的时候可以阅读或跟踪。

断言是一个数组,路由下可以配置多个断言,多个断言之间是“and”关系

3 过滤器 filter

gateway在处理请求时,在路由处理之前需要经过“pre”类型的过滤器处理,处理后,在返回响应之前,可以由“post”类型的过滤器处理。微服务场景下,我们各个服务处理请求时有些事情是都要做的,比如鉴权、限流、日志输出等,这样逻辑如果写到各自的应用上会有很多重复的代码,所以可以考虑把这些功能放在gateway上。

  • PRE:这种过滤器在请求路由之前调用。可以用这种过滤器实现身份验证、参数校验、权限校验、流量监控、日志输出、协议转换等、记录调试信息等。
  • POST:这种过滤器在路由到微服务以后执行。可以用这种过滤器实现响应内容/响应头的修改,日志的输出,流量监控、收集统计信息等。

    Gateway 过滤器从作用范围可分为两种:

    • GatewayFilter:应用到单个路由或者一个分组的路由上(需要在配置文件中配置)
    • GlobalFilter:应用到所有的路由上(无需配置,全局生效)
      1. 局部过滤器 GatewayFilter:Gateway 中内置了许多的局部过滤器;局部过滤器需要在指定路由配置才能生效。
      2. GlobalFilter 全局过滤器: GlobalFilter 的功能其实和 GatewayFilter 是相同的,只是 GlobalFilter 的作用域是所有的路由配置,而不是绑定在指定的路由配置上。多个 GlobalFilter 可以通过 @Order 或者 getOrder() 方法指定执行顺序,order值越小,执行的优先级越高。

      由于过滤器有 pre 和 post 两种类型,pre 类型过滤器如果 order 值越小,那么它就应该在pre过滤器链的顶层,post 类型过滤器如果 order 值越小,那么它就应该在 post 过滤器链的底层

      1. 常用过滤器规则(Filter)
      过滤规则实例说明
      StripPrefix- StripPrefix=1去掉URL路径中的部分前缀
      PrefixPath- PrefixPath=/app在请求路径前加上app
      RewritePath- RewritePath=/test, /app/test访问localhost:8000/test,请求会转发到localhost:8080/app/test
      SetPathSetPath=/app/{path}通过模板设置路径,转发的规则时会在路径前增加app,{path}表示原请求路径
      RedirectTo重定向
      RemoveRequestHeader去掉某个请求头信息

      4 常用断言(predicate)方法

      4.1 Path方式

      通过访问路径匹配。另一篇里写的"pattern": "/app2/**"就是path方式

      4.2 Before方式

      Before只接受一个时间参数,即DateTime格式时间,客户端访问Gateway接口的时间在此时间之前。当部署有访问时间限制的接口,可以使用Before、After、Between断言。

      通过源码(org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory)发现,Before断言使用的时间对象是ZonedDateTime

      - Path=/app2/**
      - Before=2023-08-01T09:00:00[Asia/Shanghai]
      

      4.3 After方式

      与before类似,只是限定为指定时间之后

      - Path=/app2/**
      - After=2023-08-01T09:00:00+08:00[Asia/Shanghai]
      

      4.4 Between方式

      与before、after类似

      - Path=/app2/**
      - Between=2023-08-01T09:00:00+08:00[Asia/Shanghai], 2023-08-05T09:00:00+08:00[Asia/Shanghai]
      

      4.5 Cookie方式

      请求头传递了cookie并且值与gateway设置的相等。下面这个要求cookie里有some值且等于thing。

      predicates:
      - Cookie=some, thing
      

      4.6 Header方式

      请求头属性与设置的匹配,支持正则。下面这个要求My-Cust-Request-Id是数字串。

      - Header=My-Cust-Request-Id, \d+
      

      4.7 Host方式

      根据前请求的host匹配,当前请求头中的host满足设定规则才会放行

      - Path=/app1/**
      - Host=localhost,**.xxx.com,127.0.0.1:8000
      

      4.8 请求方法方式

      请求方法,比如GET、POST、PUT等。

      - Path=/app1/**
      - Method=GET,POST
      

      4.9 请求IP方式 RemoteAddr

      用于限制允许访问接口的客户端IP网段

      - RemoteAddr=192.168.1.1/24
      

      4.10 请求参数方式 Query

      请求参数与配置的相同。下面这个配置要求请求参数some=thing。

      - Query=some,thing
      

      4.10 权重Weight

      Weight是用来指定当前请求被路由的权重的,其接收两个参数:分组和权重,参与权重路由的地址必须在同一个分组,否则weight无效果,权重为整型数字

      - id: app1
        uri: http://127.0.0.1:81
        predicates:
          - Path=/app1/**
          - Weight=group1,9
      - id: app2
        uri: http://127.0.0.1:82
        predicates:
          - Path=/app2/**
          - Weight=group1,1