Spring Cloud Gateway高级特性之过滤器(Hoxton版本)
共 21017字,需浏览 43分钟
·
2021-01-27 17:10
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
1.高级特性—过滤器(Filter)
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生,下面将对各个过滤器进行一一说明
Spring Cloud Gateway 内置的过滤器工厂一览表如下:
锋哥最新SpringCloud分布式电商秒杀课程发布
👇👇👇
👆长按上方微信二维码 2 秒
1.1 AddRequestHeader GatewayFilter
通过配置name和value可以增加请求的header。
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 给请求增加Header X-Request-red
# 访问http://localhost:9100/provider/demo/hello-> eureka-client-provider/demo/hello
- AddRequestHeader=X-Request-red, blue
请求http://localhost:9100/provider/demo/hello ,我们可以从后端获取到添加的header头
1.2 AddRequestParameter GatewayFilter
通过配置name和value可以增加请求的参数
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 给请求增加参数name
# 访问http://localhost:9100/provider/demo/feign -> eureka-client-provider/demo/feign
- AddRequestParameter=name, Trazen
通过请求http://localhost:9100/provider/demo/feign ,相当于http://localhost:9100/provider/demo/feign?name=Trazen
1.3 AddResponseHeader GatewayFilter
AddResponseHeader GatewayFilter Factory通过配置name和value可以增加响应的header。
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 给请求增加响应的header
# 访问http://localhost:9100/provider/demo/hello-> eureka-client-provider/demo/hello
- AddResponseHeader=X-Response-Foo, Bar
通过请求http://localhost:9100/provider/demo/hello 可以看到返回的header中带有配置的值。
1.4 DedupeResponseHeader GatewayFilter
剔除重复的响应头。
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
#剔除重复的响应头
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_FIRST
例如:
我们在Gateway以及微服务上都设置了CORS(解决跨域)header,如果不做任何配置,请求 -> 网关 -> 微服务,获得的响应就是这样的:
Access-Control-Allow-Credentials: true, true
Access-Control-Allow-Origin: https://hxmec.com, https://hxmec.com
也就是Header重复了。要想把这两个Header去重,只需设置成如下即可。
filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
也就是说,想要去重的Header如果有多个,用空格分隔即可;
去重策略:
RETAIN_FIRST: 默认值,保留第一个值
RETAIN_LAST: 保留最后一个值
RETAIN_UNIQUE: 保留所有唯一值,以它们第一次出现的顺序保留
1.5 Hystrix GatewayFilter
Hystrix 过滤器允许你将断路器功能添加到网关路由中,使你的服务免受级联故障的影响,并提供服务降级处理。
要开启断路器功能,我们需要在pom.xml中添加Hystrix的相关依赖:
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
然后添加相关服务降级的处理类:
@RestController
public class FallbackController {
@GetMapping("/fallback")
public Object fallback() {
Map result = new HashMap<>(3);
result.put("data",null);
result.put("message","request fallback!!!");
result.put("code",500);
return result;
}
}
在application-filter.yml中添加相关配置,当路由出错时会转发到服务降级处理的控制器上:
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
- name: Hystrix
args:
name: fallbackcmd
fallback-uri: forward:/fallback
重新启动网关后停止spring-cloud-eureka-client-provider服务,再请求http://localhost:9100/provider/demo/hello 。可以看到已经返回服务降级后的处理信息。
1.6 Spring Cloud CircuitBreaker GatewayFilter
Spring Cloud CircuitBreaker GatewayFilter 工厂使用 Spring Cloud CircuitBreaker APIs 将 Gateway 路由包装在熔断器中(circuit breaker)。
Spring Cloud CircuitBreaker 支持可与 Spring Cloud Gateway 一起使用的两个库 Hystrix 和 Resilience4J。由于Netflix 已将 Hystrix 置于仅维护模式,因此建议使用 Resilience4J。
要启用 Spring Cloud CircuitBreaker,需要引入 spring-cloud-starter-circuitbreaker-reactor-resilience4j 或 spring-cloud-starter-netflix-hystrix 依赖。配置如下示例:
spring:
cloud:
gateway:
routes:
- id: circuitbreaker_route
uri: https://example.org
filters:
- CircuitBreaker=myCircuitBreaker
1.7 FallbackHeaders GatewayFilter
允许在转发到外部应用程序中的 fallbackUri的请求头中添加 Hystrix或Spring Cloud CircuitBreaker执行异常详细信息。
spring:
cloud:
gateway:
routes:
- id: ingredients
uri: lb://ingredients
predicates:
- Path=//ingredients/**
filters:
- name: Hystrix
args:
name: fetchIngredients
fallbackUri: forward:/fallback
- id: ingredients-fallback
uri: http://localhost:9994
predicates:
- Path=/fallback
filters:
- name: FallbackHeaders
args:
executionExceptionTypeHeaderName: Test-Header
在这个例子中,当请求lb://ingredients降级后,FallbackHeadersfilter会将HystrixCommand的异常信息,通过Test-Header带给http://localhost:9994服务。
你也可以使用默认的header,也可以像上面一下配置修改header的名字:
executionExceptionTypeHeaderName (“Execution-Exception-Type”)
executionExceptionMessageHeaderName (“Execution-Exception-Message”)
rootCauseExceptionTypeHeaderName (“Root-Cause-Exception-Type”)
rootCauseExceptionMessageHeaderName (“Root-Cause-Exception-Message”)
1.8 MapRequestHeader GatewayFilter
输入两个参数:Header1、Header2,将上游 Header1 的值赋值到下游 Header2
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 将上游 X-Request-Foo Header 的值赋值到下游 X-Request-red中,如果输入标头不存在,则过滤器不起作用。如果新的命名标头已经存在,则其值将使用新值进行扩充。
# 访问http://localhost:9100/provider/demo/feign -> eureka-client-provider/demo/feign
- MapRequestHeader=X-Request-Foo, X-Request-red
通过请求http://localhost:9100/provider/demo/feign 可以看到在下游服务中,成功获取到Header。
1.9 PrefixPath GatewayFilter
在请求路径中添加前缀路径
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- PrefixPath=/mypath
这会将/mypath作为所有匹配请求的路径的前缀。因此,对/hello的请求将发送到/mypath/hello。
1.10 PreserveHostHeader GatewayFilter
留原始请求的host头信息,并原封不动的转发出去,而不是被gateway的http客户端重置。
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 保留原始请求的host头信息,并原封不动的转发出去,而不是被gateway的http客户端重置。
- PreserveHostHeader
设置了 PreserveHostHeader过滤器,过滤器会把 ServerWebExchangeUtils.PRESERVE_HOST_HEADER_ATTRIBUTE = true保存到 ServerWebExchange的属性中(attributes:是个 Map 结构)。在 NettyRoutingFilter 过滤器中,会取出该属性,判断值为 true,就取出原始请求头中的 Host 添加进新的请求(request)中。
1.11 RequestRateLimiter GatewayFilter
RequestRateLimiter使用RateLimiter实现是否允许继续执行当前请求。如果不允许继续执行,则返回HTTP 429 - Too Many Requests (默认情况下)。
RequestRateLimiter GatewayFilter可以使用一个可选参数keyResolver来做速率限制。
keyResolver是KeyResolver接口的一个实现bean,在配置里面,通过SpEL表达式#{@myKeyResolver}来管理bean的名字myKeyResolver。
KeyResolver.java.
public interface KeyResolver {
Mono resolve(ServerWebExchange exchange);
}
KeyResolver 接口允许可插拔策略派生用于限制请求的密钥。在未来的里程碑版本中,将有一些 KeyResolver 实现。
KeyResolver 的默认实现是 PrincipalNameKeyResolver,它会从 ServerWebExchange检索 Principal并调用 Principal.getName()。
默认情况下,如果 KeyResolver 找不到 Key,请求就会被拒绝。也可以通过设置来调整此行为:
spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key=true|flase
spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code=
RequestRateLimiterGatewayFilterFactory.java
/**
* Switch to deny requests if the Key Resolver returns an empty key, defaults to true.
*/
private boolean denyEmptyKey = true;
/** HttpStatus to return when denyEmptyKey is true, defaults to FORBIDDEN. */
private String emptyKeyStatusCode = HttpStatus.FORBIDDEN.name();
注意:RequestRateLimiter 不支持快捷方式的配置。下面示例的配置是无效的:
application.properties
# INVALID SHORTCUT CONFIGURATION
spring.cloud.gateway.routes[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver}
1.11.1 Redis RateLimiter
Redis RateLimiter 的实现是基于在 Stripe 完成的工作。它需要引入 spring-boot-starter-data-redis-reactive Spring Boot starter 包。
算法使用的是令牌桶算法(Token Bucket Algorithm)
redis-rate-limiter.replenishRate 属性:允许每秒可以处理的请求数,没有任何丢弃的请求。该值是令牌桶的流入速率。
redis-rate-limiter.burstCapacity 属性:允许在一秒内执行的最大请求数。该值是令牌桶持有的令牌数。设置值为 0 将阻止所有请求。
redis-rate-limiter.requestedTokens 属性:一个请求需要消费的令牌数。这是每个请求从 bucket 中获取的令牌数,默认为 1。
通过设置 replenishRate 和 burstCapacity 相同的值可以实现固定的速率。通过将burstCapacity设置为高于 replenishRate,可以允许临时突发请求流量。
注意:两次突发流量应间隔一段时间,以便于令牌桶中有多余的令牌供突发请求使用,若是连续的突发流量,令牌耗尽则会丢弃请求(返回 HTTP 429 - Too Many Request)。下面列了 redis-rate-limiter 的配置。
具体配置如下:
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
redis-rate-limiter.requestedTokens: 1
配置示例:令牌产生速度是每秒 10 个,桶中可保存 20 个令牌(能处理的突发请求数,下一秒则只能处理 10 个请求),每个请求消耗 1 个令牌。
如果设置 replenishRate=1,requestedTokens=60,burstCapacity=60,将导致每分钟只能处理 1 个请求(1 request/min)。因为一个请求消耗 60 个令牌,生成 60 个令牌需要 1 分钟。
KeyResolver 的 Java 配置:
@Bean
KeyResolver userKeyResolver() {
//一个获取请求参数 user 的简单方法
return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}
也可以定义一个实现 RateLimiter接口的限流器,并注册为 Bean。配置中,可引用使用了 SpEL 的 Bean 名。#{@RateLimiter} 是一个 SpEL 表达式,引用名为 myRateLimiter 的 Bean。
下面配置定义了一个使用上面定义的 keyrolver 的速率限流器:
配置如下:
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
- name: RequestRateLimiter
args:
rate-limiter: "#{@myRateLimiter}"
key-resolver: "#{@userKeyResolver}"
1.12 RedirectTo GatewayFilter
输入两个参数:Status Code、URL,将在 Response 中把 URL 赋值给 Location 属性
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 配置成HTTP状态码, URL的形式
- RedirectTo=302, http://www.hxmec.com
HTTP状态码应该是HTTP状态码300序列,例如301
URL必须是合法的URL,并且该值会作为名为 Location 的Header。
通过测试请求/provider/demo/hello会重定向到http://www.hxmec.com
1.13 RemoveRequestHeader GatewayFilter
移除请求头
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 移除名称为X-Request-Foo的请求头
- RemoveRequestHeader=X-Request-Foo
通过请求http://localhost:9100/provider/demo/hello 测试如下
1.14 RemoveResponseHeader GatewayFilter
移除响应头
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 移除名称为X-Response-Bar响应头
- RemoveResponseHeader=X-Response-Bar
通过请求http://localhost:9100/provider/demo/hello ,可以发现在服务中添加的响应头,已经被去除了
1.15 RemoveRequestParameter GatewayFilter
移除请求参数
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 移除请求名为name参数
- RemoveRequestParameter=name
通过请求http://localhost:9100/provider/demo/hello?name=Trazen ,可以看到请求中的参数在后端服务中无法获取,在gateway中已经去除。
1.16 RewritePath GatewayFilter
重写路径
spring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: https://hxmec.com
predicates:
- Path=/foo/**
filters:
# 配置成原始路径正则, 重写后的路径的正则
- RewritePath=/foo/(?.*), /$\{segment}
如上配置,访问 /foo/bar 会将路径改为/bar 再转发,也就是会转发到 https://example.org/bar 。需要注意的是,由于YAML语法,需用$\ 替换 $。
1.17 RewriteLocationResponseHeader GatewayFilter
重写响应头中 Location 的值,通常是为了摆脱后端特定的细节,使用 stripVersionMode, locationHeaderName, hostValue 和 protocolsRegex 参数来接收值。
spring:
cloud:
gateway:
routes:
- id: rewritelocationresponseheader_route
uri: http://hxmec.com
filters:
- RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,
如上所示,一个请求 POST api.anoyi.com/some/object/name, Response header Location 的值 prod.anoyi.com/v2/some/object/id 将被改为 api.anoyi.com/some/object/id
参数 stripVersionMode 可选值如下:
NEVER_STRIP:版本信息不会被剥离,即使原始请求路径不包含版本
AS_IN_REQUEST:仅当原始请求路径不包含任何版本时,才会剥离版本【默认】
ALWAYS_STRIP:即使原始请求路径包含版本,也会剥离版本
参数 hostValue,如果提供,会替换 Response Header Location 值中的 host:port 部分;如果不提供,则会使用 Request 的 Host 作为默认值
参数 protocolRegex,协议会与该值匹配,如果不匹配,过滤器不回做任何操作,默认值 http|https|ftp|ftps
1.18 RewriteResponseHeader GatewayFilter
重写响应头,使用 name, regexp 和 replacement 参数接收值。使用 Java 正则表达式提供一种灵活的方式来重写响应头中的值。
spring:
cloud:
gateway:
routes:
- id: rewriteresponseheader_route
uri: https://hxmec.com
filters:
- RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
示例中,一个头的值为 /42?user=ford&password=omg!what&flag=true,在发出下游请求后,将此头设置为 /42?user=ford&password=***&flag=true。注意使用 $\ 代表 $,这是 YAML 格式指定的。
1.19 SaveSession GatewayFilter
保存 Session,在向下游服务转发请求之前强制执行 WebSession::save操作
spring:
cloud:
gateway:
routes:
- id: save_session
uri: http://www.hxmec.com
predicates:
- Path=/foo/**
filters:
- SaveSession
如果将 Spring Security 与 Spring Session 集成,并希望确保安全性详细信息已转发到远程进程,那么这一点至关重要。
1.20 SecureHeaders GatewayFilter
SecureHeaders会向响应添加多个头数据,主要是根据这篇博客的建议:Everything you need to know about HTTP security headers。
会添加下面这些头,括号中是默认值。
X-Xss-Protection:1 (mode=block)
Strict-Transport-Security (max-age=631138519)
X-Frame-Options (DENY)
`X-Content-Type-Options (nosniff)
Referrer-Policy (no-referrer)
Content-Security-Policy (default-src ‘self’ https:; font-src ‘self’ https: data:; img-src ‘self’ https: data:; object-src ‘none’; script-src https:; style-src ‘self’ https: ‘unsafe-inline’)
X-Download-Options (noopen)
X-Permitted-Cross-Domain-Policies (none)
若要改变这些默认值,在 spring.cloud.gateway.filter.secure-headers命名空间中设置适当的值。下面这些属性可设置:xss-protection-header
strict-transport-security
x-frame-options
x-content-type-options
referrer-policy
content-security-policy
x-download-options
x-permitted-cross-domain-policies
这些属性是与上面列出要添加的头是对应的,在 SecureHeadersProperties.java 安全头属性类文件中可以看到。
要禁用默认值,设置spring.cloud.gateway.filter.secure-headers.disable属性,值使用逗号分隔符(,)。注意,值必须是安全标头(secure headers)的小写全名。如下所示:
spring.cloud.gateway.filter.secure-headers.disable=x-frame-options,strict-transport-security
1.21 SetPath GatewayFilter
输入一个参数:template,匹配 Spring Framework URI 路径模板并修改,允许多个匹配
spring:
cloud:
gateway:
routes:
- id: setpath_route
uri: http://www.hxmec.com
predicates:
- Path=/foo/{segment}
filters:
- SetPath=/{segment}
如上所示,请求 /foo/bar 会被设置为 /bar 到下游
1.22 SetRequestHeader GatewayFilter
SetRequestHeader重置请求头的值,使用 name 和 value 参数接收值
spring:
cloud:
gateway:
routes:
- id: setrequestheader_route
uri: https://www.hxmec.com
filters:
- SetRequestHeader=X-Request-Foo, Bar
与 AddRequestHeader GatewayFilter Factory 不同的是,这是替换 Header 而不是添加
1.23 SetResponseHeader GatewayFilter
重置响应头中的值,使用 name 和 value参数接收值
spring:
cloud:
gateway:
routes:
- id: setresponseheader_route
uri: http://www.google.com
filters:
- SetResponseHeader=X-Response-Foo, Bar
对于上面的例子,如果下游的返回带有头信息为X-Response-Foo:1234 ,则会gateway会替换为X-Response-Foo:Bar ,在返回给客户端。
1.24 SetStatus GatewayFilter
设置响应头的 HTTP 编码,使用单个参数 status 接收。值必须是一个有效的 HttpStatus
spring:
cloud:
gateway:
routes:
- id: setstatusstring_route
uri: http://www.hxmec.com
filters:
- SetStatus=BAD_REQUEST
- id: setstatusint_route
uri: http://www.hxmec.com
filters:
- SetStatus=401
此示例,设置响应的 HTTP status 为 401。
可以配置 SetStatus GatewayFilter,以在响应的头中从代理请求返回原始 HTTP 状态代码。如果配置了以下属性,则会将头添加到响应中:
spring:
cloud:
gateway:
set-status:
original-status-header-name: original-http-status
1.25 StripPrefix GatewayFilter
通过配置parts来表示截断路径前缀的数量
spring:
cloud:
gateway:
routes:
- id: nameRoot
uri: http://hxmec.com
predicates:
- Path=/name/**
filters:
- StripPrefix=2
如上面例子中,如果请求的路径为/name/bar/foo,则路径会修改为/foo,即将路径的两个前缀去掉了。
1.26 Retry GatewayFilter
该过滤器用于重试请求,支持如下参数的配置:
retries: 重试的次数
statuses: 应被重试的 HTTP Status Codes,参考 org.springframework.http.HttpStatus
methods: 应被重试的 HTTP Methods,参考org.springframework.http.HttpMethod
series: 应被重试的 Status Codes 系列,参考 org.springframework.http.HttpStatus.Series
exceptions: 应被重试的异常列表
backoff: 为重试配置指数级的 backoff。重试时间间隔的计算公式为 firstBackoff * (factor ^ n),n 是重试的次数;如果设置了 maxBackoff,最大的 backoff 限制为 maxBackoff. 如果 basedOnPreviousValue 设置为 true, backoff 计算公式为 prevBackoff * factor.
如果 Retry filter 启用,默认配置如下:retries — 3 times
series — 5XX series
methods — GET method
exceptions — IOException and TimeoutException
backoff — disabled
以下是 Retry GatewayFilter 配置示例:
spring:
cloud:
gateway:
routes:
- id: retry_test
uri: http://localhost:8080/flakey
predicates:
- Host=*.retry.com
filters:
- name: Retry
args:
retries: 3
statuses: BAD_GATEWAY
methods: GET,POST
backoff:
firstBackoff: 10ms
maxBackoff: 50ms
factor: 2
basedOnPreviousValue: false
上面例子,当下游服务返回502状态码时,gateway会重试3次。
注意:当将重试过滤器与带有forward:前缀的 URL 一起使用时,应仔细编写目标端点,以便在发生错误的情况下,它不会做任何可能导致响应发送到客户端并提交的操作。例如,如果目标端点是带注释的控制器,则目标控制器方法不应返回带有错误状态代码的 ResponseEntity。相反,它应该引发 Exception 或发出错误信号(例如,通过Mono.error(ex)返回值),可以配置重试过滤器来进行重试处理。
警告:当将重试过滤器与任何带有 body 的 HTTP方法一起使用时,body 将被缓存,并且网关将受到内存的限制。body 将缓存在 ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR定义的请求属性中,对象的类型是org.springframework.core.io.buffer.DataBuffer。
1.27 RequestSize GatewayFilter
当请求大小大于限制时,RequestSize 网关过滤器工厂可以限制请求到达下游服务。
过滤器使用maxSize参数。maxSize 是一个 DataSize类型,因此值(value)可以定义为数字,后跟可选的DataUnit 后缀,例如 KB 或 MB。默认是 B代表字节。它是请求的允许大小限制,以字节为单位。配置如下所示:
spring:
cloud:
gateway:
routes:
- id: request_size_route
uri: http://localhost:8080/upload
predicates:
- Path=/upload
filters:
- name: RequestSize
args:
maxSize: 5000000
当请求因大小而被拒绝时,RequestSize GatewayFilter 工厂将响应状态设置为 413 Payload Too Large,并带有一个附加报头 errorMessage。以下示例这样的 errorMessage:
errorMessage` : `Request size is larger than permissible limit. Request size is 6.0 MB where permissible limit is 5.0 MB
注意:如果未在路由定义中作为筛选器参数提供,则默认请求大小设置为 5 MB。
1.28 SetRequestHost GatewayFilter
用指定的值替换现有的host header
pring:
cloud:
gateway:
routes:
- id: set_request_host_header_route
uri: http://localhost:8080/headers
predicates:
- Path=/headers
filters:
- name: SetRequestHost
args:
host: hxmec.com
SetRequestHost GatewayFilter 工厂用 hxmec.com 替换主机头的值
1.29 ModifyRequestBody GatewayFilter
修改请求主体,然后将其由网关向下游发送。
只能使用 Java DSL 来配置此过滤器。如下示例:
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("rewrite_request_obj", r -> r.host("*.rewriterequestobj.org")
.filters(f -> f.prefixPath("/httpbin")
.modifyRequestBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
(exchange, s) -> return Mono.just(new Hello(s.toUpperCase())))).uri(uri))
.build();
}
static class Hello {
String message;
public Hello() { }
public Hello(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
1.30 ModifyResponseBody GatewayFilter
在响应发送会客户端之前,对响应体进行修改。同样也只支持Java配置
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("rewrite_response_upper", r -> r.host("*.rewriteresponseupper.org")
.filters(f -> f.prefixPath("/httpbin")
.modifyResponseBody(String.class, String.class,
(exchange, s) -> Mono.just(s.toUpperCase()))).uri(uri)
.build();
}
1.31 Default Filters
如果想添加一个过滤器去应用在所有的路由上,可以使用 spring.cloud.gateway.default-filters 来配置,这个属性接收一个Filter列表。
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Response-Default-Foo, Default-Bar
- PrefixPath=/httpbin
2.参考文档
【官方文档】https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/#the-weight-route-predicate-factory
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
本文链接:
https://blog.csdn.net/tuyong1972873004/article/details/107123254/
感谢点赞支持下哈