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
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐