前面的例子是通过路径(Path)方式配置路由转发,gateway还还有其他的配置,下面做个简单的介绍
Route 主要由:路由id、目标uri、断言集合、过滤器集合组成。前面的实例用到了id、uri、断言。
断言Predicate是java8引入的新特性,它接收一个输入参数,返回布尔值结果。我们代码中也可以使用Predicate,通过Predicate可以让你的代码更加的简洁。
gateway的Predict决定了请求由哪一个路由处理。它Spring WebFlux的HandlerMapping实现。Gateway包含了很多路由断言工厂,这些工厂对HTTP请求的很多属性进行了处理,当客户端请求时,HandlerMapping会获取请求参数,并与Gateway中配置的Predicates进行比对,满足规则就按规则约定进行路由放行,否则拒绝访问或报404。源码在 org.springframework.cloud.gateway.handler.predicate 包中,感兴趣或者排查问题的时候可以阅读或跟踪。
断言是一个数组,路由下可以配置多个断言,多个断言之间是“and”关系
gateway在处理请求时,在路由处理之前需要经过“pre”类型的过滤器处理,处理后,在返回响应之前,可以由“post”类型的过滤器处理。微服务场景下,我们各个服务处理请求时有些事情是都要做的,比如鉴权、限流、日志输出等,这样逻辑如果写到各自的应用上会有很多重复的代码,所以可以考虑把这些功能放在gateway上。
Gateway 过滤器从作用范围可分为两种:
由于过滤器有 pre 和 post 两种类型,pre 类型过滤器如果 order 值越小,那么它就应该在pre过滤器链的顶层,post 类型过滤器如果 order 值越小,那么它就应该在 post 过滤器链的底层
过滤规则 | 实例 | 说明 |
---|---|---|
StripPrefix | - StripPrefix=1 | 去掉URL路径中的部分前缀 |
PrefixPath | - PrefixPath=/app | 在请求路径前加上app |
RewritePath | - RewritePath=/test, /app/test | 访问localhost:8000/test,请求会转发到localhost:8080/app/test |
SetPath | SetPath=/app/{path} | 通过模板设置路径,转发的规则时会在路径前增加app,{path}表示原请求路径 |
RedirectTo | 重定向 | |
RemoveRequestHeader | 去掉某个请求头信息 |
通过访问路径匹配。另一篇里写的"pattern": "/app2/**"就是path方式
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]
与before类似,只是限定为指定时间之后
- Path=/app2/** - After=2023-08-01T09:00:00+08:00[Asia/Shanghai]
与before、after类似
- Path=/app2/** - Between=2023-08-01T09:00:00+08:00[Asia/Shanghai], 2023-08-05T09:00:00+08:00[Asia/Shanghai]
请求头传递了cookie并且值与gateway设置的相等。下面这个要求cookie里有some值且等于thing。
predicates: - Cookie=some, thing
请求头属性与设置的匹配,支持正则。下面这个要求My-Cust-Request-Id是数字串。
- Header=My-Cust-Request-Id, \d+
根据前请求的host匹配,当前请求头中的host满足设定规则才会放行
- Path=/app1/** - Host=localhost,**.xxx.com,127.0.0.1:8000
请求方法,比如GET、POST、PUT等。
- Path=/app1/** - Method=GET,POST
用于限制允许访问接口的客户端IP网段
- RemoteAddr=192.168.1.1/24
请求参数与配置的相同。下面这个配置要求请求参数some=thing。
- Query=some,thing
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