Spring Gateway断言工厂与过滤器工厂
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Gateway断言工厂与过滤器工厂相关的知识,希望对你有一定的参考价值。
文章目录
1.断言工厂
我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
例如下面的断言:
Path=/user/**是按照路径匹配,这个规则是由
org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory
类来处理的,进入源码我们能看到他对路径字符串的一系列处理
像这样的断言工厂在SpringCloudGateway还有十几个:
名称 | 说明 | 示例 |
---|---|---|
After | 是某个时间点后的请求 | - After=2037-01-20T17:42:47.789-07:00[America/Denver] |
Before | 是某个时间点之前的请求 | - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] |
Between | 是某两个时间点之前的请求 | - Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] |
Cookie | 请求必须包含某些cookie | - Cookie=chocolate, ch.p |
Header | 请求必须包含某些header | - Header=X-Request-Id, \\d+ |
Host | 请求必须是访问某个host(域名) | - Host=.somehost.org,.anotherhost.org |
Method | 请求方式必须是指定方式 | - Method=GET,POST |
Path | 请求路径必须符合指定规则 | - Path=/red/segment,/blue/** |
Query | 请求参数必须包含指定参数 | - Query=name, Jack或者- Query=name |
RemoteAddr | 请求者的ip必须是指定范围 | - RemoteAddr=192.168.1.1/24 |
Weight | 权重处理 |
我们也都可以追踪到源码,例如AfterRoutePredicateFactory
其他断言配置可以参考这一篇博文
Gateway(四)Spring Cloud Gateway过滤器(GatewayFilter)工厂
链接:https://blog.csdn.net/zhuocailing3390/article/details/123151458
2.过滤器工厂
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
当有请求访问时,gateway网关回对请求路由做层层的过滤筛选,之后才能传达到微服务。
过滤器的作用:
① 对路由的请求或响应做加工处理,比如添加请求头
② 配置在路由下的过滤器只对当前路由的请求生效
2.1.路由过滤器的种类
Spring提供了31种不同的路由过滤器工厂。
例如下面几个常用的:
名称 | 说明 |
---|---|
AddRequestHeader | 给当前请求添加一个请求头 |
RemoveRequestHeader | 移除请求中的一个请求头 |
AddResponseHeader | 给响应结果中添加一个响应头 |
RemoveResponseHeader | 从响应结果中移除有一个响应头 |
RequestRateLimiter | 限制请求的流量 |
2.2.1 AddRequestHeader
需求:给所有进入userservice的请求添加一个请求头:Truth=yyl is good!
只需要修改gateway服务的application.yml文件,添加路由过滤即可:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters: # 过滤器
- AddRequestHeader=Truth,yyl is good! # 添加请求头
当前过滤器写在userservice路由下,因此仅仅对访问userservice的请求有效。
我们在controller里加上获取请求头的代码
@GetMapping("/id")
public User queryById(@PathVariable("id") Long id,@RequestHeader("Truth") String truth)
System.out.println("truth="+truth);
return userService.queryById(id);
重启服务器,请求查看打印结果:
下面的配置就不一 一进行测试了,只展示结果
2.2.2 RemoveRequestHeader
RemoveRequestHeader是一个header名称的参数,它是要删除的标头的名称。
yaml配置:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters:
- RemoveRequestHeader=Color
配置为:在请求中,设置需要删除的header名称;然后过滤器将该header信息在传递到下游服务之前将其删除。
2.2.3 SetRequestHeader
SetRequestHeader由两个参数组成:第一个是header名称,第二个是header值。
yaml配置:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters:
- SetRequestHeader=Color, Blue
配置为:SetRequestHeader将替换原有的header名称的值,在请求的header中,设置name为Color,value为blue;然后过滤器将该header的原有Value值替换为blue再传递到下游的header中。
2.2.4 AddRequestParameter
AddRequestParameter由两个参数组成:第一个是参数的名称,第二个是参数的值。
yaml配置:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters:
- AddRequestParameter=color, blue
配置为:在请求时,网关过滤器中新增一组name为color,value为blue的参数;然后过滤器将该组参数传递到下游服务中。
2.2.5 RemoveRequestParameter
RemoveRequestParameter是一个指定参数名称的参数,它是要删除的查询参数的名称。
yaml配置:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters:
- RemoveRequestParameter=color
配置为:在请求中,设置需要删除的参数名称;然后过滤器将该参数信息在传递到下游服务之前将其删除。
2.2.6 AddResponseHeader
AddResponseHeader由两个参数组成:第一个是header名称,第二个是header值。
yaml配置:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters:
- AddResponseHeader=Color, Blue
配置为:设置name为Color,value为Blue;然后过滤器将该header信息传递到下游服务的响应header中。
2.2.7 RemoveResponseHeader
RemoveResponseHeader是一个header名称的参数,它是要在响应时被删除的标头的名称。
yaml配置:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters:
- RemoveResponseHeader=Color
配置为:在请求中,设置需要删除的header名称;然后过滤器将该header信息在返回到网关客户端之前从响应中删除标头。
2.2.8 SetResponseHeader
SetResponseHeader由两个参数组成:第一个是header名称,第二个是新的header值。
yaml配置:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters:
- SetRequestHeader=Color, Blue
配置为:SetResponseHeader将替换原有的header名称的值,在请求的header中,设置name为Color,value为Blue;然后过滤器将该header信息在返回到网关客户端之前把原有Value值替换为Blue。
2.3.默认过滤器
如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
default-filters: # 默认过滤项
- AddRequestHeader=Truth,yyl is good!
以上是关于Spring Gateway断言工厂与过滤器工厂的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Alibaba - 25 Gateway-路由断言工厂Route Predicate Factories谓词工厂示例及源码解析