作者:
laker
,因为喜欢LOL滴神faker
,又是NBA湖人队(laker
)粉丝儿(主要是老詹的粉丝儿),本人又姓李,故取笔名:laker
❤️喜欢分享自己工作中遇到的问题和解决方案,以及一些读书笔记和心得分享。
本人创建了微信公众号【Java大厂面试官】,用于和大家交流分享
个人微信【lakernote】,加作者备注下暗号:cv之道
。
本文Spring Cloud Gateway 版本:2020.0.0
GatewayFilter Factory 是 Spring Cloud Gateway 中提供的过滤器工厂。Spring Cloud Gateway 的路由过滤器允许以某种方式修改传入的 HTTP 请求或输出的 HTTP 响应,且只作用于特定的路由,Spring Cloud Gateway 中内置了很多过滤器工厂,直接采用配置的方式使用即可。
该AddRequestHeader
GatewayFilter
工厂需要name
和value
参数。以下示例配置了AddRequestHeader
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: https://example.org
filters:
- AddRequestHeader=X-Request-red, blue
此清单将X-Request-red:blue
标头添加到所有匹配请求的下游请求的标头中。
AddRequestHeader
了解用于匹配路径或主机的URI变量。URI变量可以在值中使用,并在运行时扩展。以下示例配置了AddRequestHeader
GatewayFilter
使用变量的:
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: https://example.org
predicates:
- Path=/red/{
segment}
filters:
- AddRequestHeader=X-Request-Red, Blue-{
segment}
该AddRequestParameter
GatewayFilter
工厂需要name
和value
参数。以下示例配置了AddRequestParameter
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: add_request_parameter_route
uri: https://example.org
filters:
- AddRequestParameter=red, blue
这将添加red=blue
到所有匹配请求的下游请求的查询字符串中。
AddRequestParameter
了解用于匹配路径或主机的URI变量。URI变量可以在值中使用,并在运行时扩展。以下示例配置了AddRequestParameter
GatewayFilter
使用变量的:
spring:
cloud:
gateway:
routes:
- id: add_request_parameter_route
uri: https://example.org
predicates:
- Host: {
segment}.myhost.org
filters:
- AddRequestParameter=foo, bar-{
segment}
该AddResponseHeader
GatewayFilter
工厂需要name
和value
参数。以下示例配置了AddResponseHeader
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: add_response_header_route
uri: https://example.org
filters:
- AddResponseHeader=X-Response-Red, Blue
这会将X-Response-Foo:Bar
标头添加到所有匹配请求的下游响应的标头中。
AddResponseHeader
知道用于匹配路径或主机的URI变量。URI变量可以在值中使用,并在运行时扩展。以下示例配置了AddResponseHeader
GatewayFilter
使用变量的:
spring:
cloud:
gateway:
routes:
- id: add_response_header_route
uri: https://example.org
predicates:
- Host: {
segment}.myhost.org
filters:
- AddResponseHeader=foo, bar-{
segment}
DedupeResponseHeader GatewayFilter工厂采用一个name
参数和一个可选strategy
参数。name
可以包含以空格分隔的标题名称列表。以下示例配置了DedupeResponseHeader
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: dedupe_response_header_route
uri: https://example.org
filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
当网关CORS逻辑和下游逻辑都将它们添加时,这将删除Access-Control-Allow-Credentials
和Access-Control-Allow-Origin
响应头的重复值。
该DedupeResponseHeader
过滤器还接受一个可选的strategy
参数。可接受的值为RETAIN_FIRST
(默认值)RETAIN_LAST
,和RETAIN_UNIQUE
。
重复数据删除
Spring Cloud CircuitBreaker GatewayFilter工厂使用Spring Cloud CircuitBreaker API将网关路由包装在断路器中。Spring Cloud CircuitBreaker支持多个可与Spring Cloud Gateway一起使用的库。Spring Cloud开箱即用地支持Resilience4J。
要启用Spring Cloud CircuitBreaker过滤器,您需要放置spring-cloud-starter-circuitbreaker-reactor-resilience4j
在类路径上。以下示例配置了Spring Cloud CircuitBreaker GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: circuitbreaker_route
uri: https://example.org
filters:
- CircuitBreaker=myCircuitBreaker
要配置断路器,请参阅所使用的基础断路器实现的配置。
Spring Cloud CircuitBreaker过滤器也可以接受可选fallbackUri
参数。当前,仅forward:
支持计划的URI。如果调用后备,则请求将转发到与URI匹配的控制器。以下示例配置了这种后备:
spring:
cloud:
gateway:
routes:
- id: circuitbreaker_route
uri: lb://backing-service:8088
predicates:
- Path=/consumingServiceEndpoint
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/inCaseOfFailureUseThis
- RewritePath=/consumingServiceEndpoint, /backingServiceEndpoint
以下清单在Java中做同样的事情:
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("circuitbreaker_route", r -> r.path("/consumingServiceEndpoint")
.filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis"))
.rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088")
.build();
}
当调用断路器回退时,此示例将转发到URI/inCaseofFailureUseThis
。请注意,此示例还演示了(可选)Spring Cloud Netflix Ribbon负载平衡(由lb
目标URI上的前缀定义)。
主要方案是使用fallbackUri
定义网关应用程序中的内部控制器或处理程序。但是,您还可以将请求重新路由到外部应用程序中的控制器或处理程序,如下所示:
spring:
cloud:
gateway:
routes:
- id: ingredients
uri: lb://ingredients
predicates:
- Path=//ingredients/**
filters:
- name: CircuitBreaker
args:
name: fetchIngredients
fallbackUri: forward:/fallback
- id: ingredients-fallback
uri: http://localhost:9994
predicates:
- Path=/fallback
在此示例中,fallback
网关应用程序中没有端点或处理程序。但是,另一个应用程序中有一个,在处注册localhost:9994
。
如果将请求转发给后备,则Spring Cloud CircuitBreaker网关过滤器还会提供Throwable
引起请求的。它ServerWebExchange
作为ServerWebExchangeUtils.CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR
在网关应用程序中处理后备时可以使用的属性添加到。
对于外部控制器/处理程序方案,可以添加标头以及异常详细信息。您可以在FallbackHeaders GatewayFilter Factory部分中找到有关此操作的更多信息。
通过FallbackHeaders
工厂,您可以在转发到fallbackUri
外部应用程序中的请求的标头中添加Spring Cloud CircuitBreaker执行异常详细信息,如以下情况所示:
spring:
cloud:
gateway:
routes:
- id: ingredients
uri: lb://ingredients
predicates:
- Path=//ingredients/**
filters:
- name: CircuitBreaker
args:
name: fetchIngredients
fallbackUri: forward:/fallback
- id: ingredients-fallback
uri: http://localhost:9994
predicates:
- Path=/fallback
filters:
- name: FallbackHeaders
args:
executionExceptionTypeHeaderName: Test-Header
在此示例中,在运行断路器时发生执行异常之后,该请求将转发到在上fallback
运行的应用程序中的端点或处理程序localhost:9994
。FallbackHeaders
过滤器会将具有异常类型,消息和(如果有)根本原因异常类型和消息的标头添加到该请求。
您可以通过设置以下参数的值(以其默认值显示)来覆盖配置中标头的名称:
executionExceptionTypeHeaderName
("Execution-Exception-Type"
)executionExceptionMessageHeaderName
("Execution-Exception-Message"
)rootCauseExceptionTypeHeaderName
("Root-Cause-Exception-Type"
)rootCauseExceptionMessageHeaderName
("Root-Cause-Exception-Message"
)有关断路器和网关的更多信息,请参见Spring Cloud CircuitBreaker Factory部分。
该MapRequestHeader
GatewayFilter
工厂采用fromHeader
和toHeader
参数。它将创建一个新的命名标头(toHeader
),然后fromHeader
从传入的http请求中将其值从现有的命名标头()中提取出来。如果输入标头不存在,则过滤器不起作用。如果新的命名头已经存在,则其值将使用新值进行扩充。以下示例配置了MapRequestHeader
:
例子25. application.yml
spring:
cloud:
gateway:
routes:
- id: map_request_header_route
uri: https://example.org
filters:
- MapRequestHeader=Blue, X-Request-Red
这会将X-Request-Red:
标头添加到下游请求中,并带有来自传入HTTP请求Blue
标头的更新值。
该PrefixPath
GatewayFilter
工厂采用单个prefix
参数。以下示例配置了PrefixPath
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- PrefixPath=/mypath
这将/mypath
作为所有匹配请求的路径的前缀。因此,/hello
将向发送请求/mypath/hello
。
该PreserveHostHeader
GatewayFilter
工厂没有参数。此过滤器设置请求属性,路由过滤器将检查该请求属性以确定是否应发送原始主机头,而不是由HTTP客户端确定的主机头。以下示例配置了PreserveHostHeader
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: preserve_host_route
uri: https://example.org
filters:
- PreserveHostHeader
该RequestRateLimiter
GatewayFilter
工厂采用的是RateLimiter
实施以确定当前请求被允许继续进行。如果不是,HTTP 429 - Too Many Requests
则返回状态(默认)。
该过滤器采用一个可选keyResolver
参数和特定于速率限制器的参数(本节后面将介绍)。
keyResolver
是实现KeyResolver
接口的bean 。在配置中,使用SpEL按名称引用bean。 #{@myKeyResolver}
是一个SpEL表达式,它引用名为的bean myKeyResolver
。以下清单显示了该KeyResolver
接口:
public interface KeyResolver {
Mono<String> resolve(ServerWebExchange exchange);
}
该KeyResolver
接口允许可插拔策略派生用于限制请求的密钥。在未来的里程碑版本中,将有一些KeyResolver
实现。
的默认实现KeyResolver
是PrincipalNameKeyResolver
,Principal
从ServerWebExchange
和调用检索Principal.getName()
。
默认情况下,如果KeyResolver
找不到密钥,则拒绝请求。您可以通过设置spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key
(true
或false
)和spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code
属性来调整此行为。
在
RequestRateLimiter
不与“快捷方式”符号配置。下面的示例无效:例子29. application.properties#无效的快捷方式配置 spring.cloud.gateway.routes [0] .filters [0] = RequestRateLimiter = 2,2,#{@ userkeyresolver}
The Redis implementation is based off of work done at Stripe. It requires the use of the spring-boot-starter-data-redis-reactive
Spring Boot starter.
使用的算法是令牌桶算法。
该redis-rate-limiter.replenishRate
属性是希望用户每秒允许多少个请求,而没有任何丢弃的请求。这是令牌桶被填充的速率。
该redis-rate-limiter.burstCapacity
属性是允许用户在一秒钟内执行的最大请求数。这是令牌桶可以容纳的令牌数。将此值设置为零将阻止所有请求。
该redis-rate-limiter.requestedTokens
属性是一个请求要花费多少令牌。这是每个请求从存储桶中提取的令牌数,默认为1
。
通过在replenishRate
和中设置相同的值,可以达到稳定的速率burstCapacity
。设置burstCapacity
大于可以允许临时爆发replenishRate
。在这种情况下,replenishRate
由于两次连续的突发会导致请求丢弃(HTTP 429 - Too Many Requests
),因此需要在两次突发之间允许有一定的时间限制(根据)。以下清单配置了一个redis-rate-limiter
:
波纹管速率限制1 request/s
功能通过设置完成replenishRate
的请求的希望数,requestedTokens
在几秒钟内的时间跨度burstCapacity
来的产品replenishRate
和requestedTokens
结构,如设定replenishRate=1
,requestedTokens=60
以及burstCapacity=60
将会导致的限制1 request/min
。
spring:
cloud:
gateway:
routes:
- id: requestratelimiter_route
uri: https://example.org
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
redis-rate-limiter.requestedTokens: 1
以下示例在Java中配置KeyResolver:
@Bean
KeyResolver userKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}
这定义了每个用户10的请求速率限制。允许突发20,但是在下一秒中,仅10个请求可用。这KeyResolver
是一个简单的获取user
请求参数的参数(请注意,不建议在生产环境中使用该参数)。
您还可以将速率限制器定义为实现RateLimiter
接口的Bean 。在配置中,可以使用SpEL按名称引用Bean。 #{@myRateLimiter}
是一个SpEL表达式,它引用一个名为的bean myRateLimiter
。以下清单定义了一个使用KeyResolver
前面清单中定义的速率限制器:
spring:
cloud:
gateway:
routes:
- id: requestratelimiter_route
uri: https://example.org
filters:
- name: RequestRateLimiter
args:
rate-limiter: "#{@myRateLimiter}"
key-resolver: "#{@userKeyResolver}"
该RedirectTo
GatewayFilter
工厂有两个参数,status
和url
。该status
参数应该是300系列重定向HTTP代码,例如301。该url
参数应该是有效的URL。这是Location
标题的值。对于相对重定向,您应该将其uri: no://op
用作路由定义的uri。以下清单配置了一个RedirectTo
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- RedirectTo=302, https://acme.org
这将发送带有Location:https://acme.org
标头的状态302以执行重定向。
该RemoveRequestHeader
GatewayFilter
工厂需要一个name
参数。它是要删除的标题的名称。以下清单配置了一个RemoveRequestHeader
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: removerequestheader_route
uri: https://example.org
filters:
- RemoveRequestHeader=X-Request-Foo
这将删除X-Request-Foo
标题,然后再将其发送到下游。
该RemoveResponseHeader
GatewayFilter
工厂需要一个name
参数。它是要删除的标题的名称。以下清单配置了一个RemoveResponseHeader
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: removeresponseheader_route
uri: https://example.org
filters:
- RemoveResponseHeader=X-Response-Foo
这将从X-Response-Foo
响应中删除标头,然后将其返回到网关客户端。
要删除任何类型的敏感标头,应为可能要执行此操作的任何路由配置此过滤器。此外,您可以使用一次配置此过滤器,spring.cloud.gateway.default-filters
并将其应用于所有路由。
该RemoveRequestParameter
GatewayFilter
工厂需要一个name
参数。它是要删除的查询参数的名称。以下示例配置了RemoveRequestParameter
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: removerequestparameter_route
uri: https://example.org
filters:
- RemoveRequestParameter=red
这将删除red
参数,然后再将其发送到下游。
该RewritePath
GatewayFilter
工厂采用的路径regexp
参数和replacement
参数。这使用Java正则表达式提供了一种灵活的方式来重写请求路径。以下清单配置了一个RewritePath
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: https://example.org
predicates:
- Path=/red/**
filters:
- RewritePath=/red(?>/?.*), $\{
segment}
对于的请求路径/red/blue
,这会将路径设置为/blue
发出下游请求之前的路径。请注意,由于YAML规范,$
应将替换$\
为。
该RewriteLocationResponseHeader
GatewayFilter
工厂修改的值Location
响应头,通常摆脱于后端的具体细节。这需要stripVersionMode
,locationHeaderName
,hostValue
,和protocolsRegex
参数。以下清单配置了一个RewriteLocationResponseHeader
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: rewritelocationresponseheader_route
uri: http://example.org
filters:
- RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,
例如,对于的请求,的响应标头值将重写为。POST api.example.com/some/object/name``Location``object-service.prod.example.net/v2/some/object/id``api.example.com/some/object/id
该stripVersionMode
参数具有以下可能的值:NEVER_STRIP
,AS_IN_REQUEST
(默认)和ALWAYS_STRIP
。
NEVER_STRIP
:即使原始请求路径不包含任何版本,也不会剥离该版本。AS_IN_REQUEST
仅当原始请求路径不包含任何版本时,才剥离该版本。ALWAYS_STRIP
即使原始请求路径包含版本,也会始终剥离该版本。的hostValue
参数,如果提供,则使用替换host:port
的响应的部分Location
标头。如果未提供,Host
则使用请求标头的值。
该protocolsRegex
参数必须是String
与协议名称匹配的有效regex 。如果不匹配,则过滤器不执行任何操作。默认值为http|https|ftp|ftps
。
该RewriteResponseHeader
GatewayFilter
工厂需要name
,regexp
和replacement
参数。它使用Java正则表达式以灵活的方式重写响应标头值。以下示例配置了RewriteResponseHeader
GatewayFilter
:
例子39. application.yml
spring:
cloud:
gateway:
routes:
- id: rewriteresponseheader_route
uri: https://example.org
filters:
- RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
对于标头值为/42?user=ford&password=omg!what&flag=true
,/42?user=ford&password=***&flag=true
在发出下游请求后将其设置为。由于YAML规范,您必须使用$\
表示$
。
在将呼叫转发到下游之前,SaveSession
GatewayFilter
工厂会强制执行WebSession::save
操作。这在将Spring Session之类的东西与惰性数据存储一起使用时特别有用,并且您需要确保在转发呼叫之前已保存了会话状态。以下示例配置了:SaveSession
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: save_session
uri: https://example.org
predicates:
- Path=/foo/**
filters:
- SaveSession
如果您将Spring Security与Spring Session集成在一起,并希望确保安全性详细信息已转发到远程进程,那么这一点至关重要。
根据此博客文章中SecureHeaders
GatewayFilter
的建议,工厂为响应添加了许多标题。
添加了以下标头(以其默认值显示):
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
要禁用默认值,请spring.cloud.gateway.filter.secure-headers.disable
使用逗号分隔的值设置属性。以下示例显示了如何执行此操作:
spring.cloud.gateway.filter.secure-headers.disable=x-frame-options,strict-transport-security
必须使用安全标头的小写全名来禁用它。
该SetPath
GatewayFilter
工厂采用的路径template
参数。通过允许路径的模板段,它提供了一种操作请求路径的简单方法。这使用了Spring Framework中的URI模板。允许多个匹配段。以下示例配置了SetPath
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: setpath_route
uri: https://example.org
predicates:
- Path=/red/{
segment}
filters:
- SetPath=/{
segment}
对于的请求路径/red/blue
,这会将路径设置为/blue
发出下游请求之前的路径。
该SetRequestHeader
GatewayFilter
工厂采用name
和value
参数。以下清单配置了一个SetRequestHeader
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: setrequestheader_route
uri: https://example.org
filters:
- SetRequestHeader=X-Request-Red, Blue
这GatewayFilter
将使用给定名称替换(而不是添加)所有标头。因此,如果下游服务器以响应X-Request-Red:1234
,则将替换为X-Request-Red:Blue
,这是下游服务将收到的内容。
SetRequestHeader
知道用于匹配路径或主机的URI变量。URI变量可以在值中使用,并在运行时扩展。以下示例配置了SetRequestHeader
GatewayFilter
使用变量的:
spring:
cloud:
gateway:
routes:
- id: setrequestheader_route
uri: https://example.org
predicates:
- Host: {
segment}.myhost.org
filters:
- SetRequestHeader=foo, bar-{
segment}
该SetResponseHeader
GatewayFilter
工厂采用name
和value
参数。以下清单配置了一个SetResponseHeader
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: setresponseheader_route
uri: https://example.org
filters:
- SetResponseHeader=X-Response-Red, Blue
该GatewayFilter用给定名称替换(而不是添加)所有标头。因此,如果下游服务器以响应,则将X-Response-Red:1234
替换为X-Response-Red:Blue
,这是网关客户端将收到的内容。
SetResponseHeader
知道用于匹配路径或主机的URI变量。URI变量可用于该值,并将在运行时扩展。以下示例配置了SetResponseHeader
GatewayFilter
使用变量的:
spring:
cloud:
gateway:
routes:
- id: setresponseheader_route
uri: https://example.org
predicates:
- Host: {
segment}.myhost.org
filters:
- SetResponseHeader=foo, bar-{
segment}
该SetStatus
GatewayFilter
工厂采用单个参数,status
。它必须是有效的Spring HttpStatus
。它可以是整数值404
或枚举的字符串表示形式:NOT_FOUND
。以下清单配置了一个SetStatus
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: setstatusstring_route
uri: https://example.org
filters:
- SetStatus=BAD_REQUEST
- id: setstatusint_route
uri: https://example.org
filters:
- SetStatus=401
无论哪种情况,响应的HTTP状态都设置为401。
您可以配置,SetStatus
GatewayFilter
以在响应的标头中从代理请求返回原始HTTP状态代码。如果将头配置为以下属性,则会将其添加到响应中:
spring:
cloud:
gateway:
set-status:
original-status-header-name: original-http-status
该StripPrefix
GatewayFilter
工厂有一个参数,parts
。该parts
参数指示在向下游发送请求之前,要从请求中剥离的路径中的零件数。以下清单配置了一个StripPrefix
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: nameRoot
uri: https://nameservice
predicates:
- Path=/name/**
filters:
- StripPrefix=2
通过网关/name/blue/red
发出请求时,发出的请求nameservice
看起来像nameservice/red
。
该Retry
GatewayFilter
工厂支持以下参数:
retries
:应尝试的重试次数。statuses
:应重试的HTTP状态代码,使用表示org.springframework.http.HttpStatus
。methods
:应该重试的HTTP方法,以表示org.springframework.http.HttpMethod
。series
:要重试的一系列状态代码,使用表示org.springframework.http.HttpStatus.Series
。exceptions
:应重试的引发异常的列表。backoff
:为重试配置的指数补偿。重试在退避间隔,即firstBackoff * (factor ^ n)
,之后执行n
。如果maxBackoff
已配置,则应用的最大补偿限制为maxBackoff
。如果basedOnPreviousValue
为true,则使用计算退避prevBackoff * factor
。Retry
如果启用了以下默认过滤器配置:
retries
:3次series
:5XX系列methods
:GET方法exceptions
:IOException
和TimeoutException
backoff
:禁用以下清单配置了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
当使用带有
forward:
前缀URL的重试过滤器时,应仔细编写目标端点,以便在发生错误的情况下,它不会做任何可能导致响应发送到客户端并提交的操作。例如,如果目标端点是带注释的控制器,则目标控制器方法不应返回ResponseEntity
错误状态代码。而是应抛出一个Exception
错误或发出一个错误信号(例如,通过Mono.error(ex)
返回值),该错误可以配置为重试过滤器通过重试进行处理。
当将重试过滤器与任何具有主体的HTTP方法一起使用时,主体将被缓存,并且网关将受到内存的限制。正文被缓存在由定义的请求属性中
ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR
。对象的类型是org.springframework.core.io.buffer.DataBuffer
。
RequestSize
过滤器工厂当请求大小大于允许的限制时,RequestSize
GatewayFilter
工厂可以限制请求到达下游服务。过滤器接受一个maxSize
参数。的maxSize is a
DataSize类型,所以值可以被定义为一个数字,后跟一个可选的
DataUnit后缀,例如“KB”或“MB”。字节的默认值为“ B”。它是请求的允许大小限制,以字节为单位。以下清单配置了一个
RequestSizeGatewayFilter`:
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。
在某些情况下,可能需要覆盖主机头。在这种情况下,SetRequestHost
GatewayFilter
工厂可以用指定的值替换现有的主机头。过滤器接受一个host
参数。以下清单配置了一个SetRequestHost
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: set_request_host_header_route
uri: http://localhost:8080/headers
predicates:
- Path=/headers
filters:
- name: SetRequestHost
args:
host: example.org
该SetRequestHost
GatewayFilter
工厂替换主机头的值example.org
。
您可以使用ModifyRequestBody
过滤器过滤器在网关向下游发送请求主体之前对其进行修改。
该过滤器只能通过使用Java DSL来配置。
以下清单显示了如何修改请求正文GatewayFilter
:
@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;
}
}
您可以使用ModifyResponseBody
过滤器在将响应正文发送回客户端之前对其进行修改。
该过滤器只能通过使用Java DSL来配置。
以下清单显示了如何修改响应正文GatewayFilter
:
@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();
}
要添加过滤器并将其应用于所有路由,可以使用spring.cloud.gateway.default-filters
。此属性采用过滤器列表。以下清单定义了一组默认过滤器:
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Response-Default-Red, Default-Blue
- PrefixPath=/httpbin
网关 Spring Cloud Gateway 简介 入门
网关 Spring Cloud Gateway 内置的路由谓词工厂详解(最全的路由策略11种)
网关 Spring Cloud Gateway 内置过滤器工厂(超级全30种)
网关 Spring Cloud Gateway 内置全局过滤器
网关 Spring Cloud Gateway 内置网关过滤器工厂总结
网关 Spring Cloud Gateway 两种配置谓词和过滤器的方法
网关 Spring Cloud Gateway 监控 actuator
网关 Spring Cloud Gateway 自定义路由谓词工厂
网关 Spring Cloud Gateway 自定义过滤器(全局过滤器以及网关过滤器)
网关 Spring Cloud Gateway 跨域配置
网关 Spring Cloud Gateway HTTP超时配置
网关 Spring Cloud Gateway 统一全局异常处理
QQ群【837324215】
关注我的公众号【Java大厂面试官】,回复:常用工具、资源等关键词(更多关键词,关注后注意提示信息)获取更多免费资料。
公众号也会持续输出高质量文章,和大家共同进步。