💨 作者:
laker
,因为喜欢LOL滴神faker
,又是NBA湖人队🏀(laker
)粉丝儿(主要是老詹的粉丝儿),本人又姓李,故取笔名:laker
❤️喜欢分享自己工作中遇到的问题和解决方案,以及一些读书笔记和心得分享。
🌰本人创建了微信公众号【Java大厂面试官】,用于和大家交流分享
🏰 个人微信【lakernote】,加作者备注下暗号:cv之道
。
文章目录
- 1.AddRequestHeader过滤器工厂
- 2.AddRequestParameter过滤器工厂
- 3.AddResponseHeader过滤器工厂
- 4.DedupeResponseHeader 过滤器工厂
- 5.CircuitBreaker过滤器工厂
- 6.FallbackHeaders过滤器工厂
- 7.MapRequestHeader过滤器工厂
- 8.PrefixPath过滤器工厂
- 9.PreserveHostHeader过滤器工厂
- 10.RequestRateLimiter过滤器工厂
- 11.RedirectTo过滤器工厂
- 12.RemoveRequestHeader过滤器工厂
- 13.RemoveResponseHeader过滤器工厂
- 14.RemoveRequestParameter过滤器工厂
- 15.RewritePath过滤器工厂
- 16.RewriteLocationResponseHeader过滤器工厂
- 17.RewriteResponseHeader过滤器工厂
- 18.SaveSession过滤器工厂
- 19.SecureHeaders过滤器工厂
- 20.SetPath过滤器工厂
- 21.SetRequestHeader过滤器工厂
- 22.SetResponseHeader过滤器工厂
- 23.SetStatus过滤器工厂
- 24.StripPrefix过滤器工厂
- 25.Retry 过滤器工厂
- 26.`RequestSize` 过滤器工厂
- 27.SetRequestHost过滤器工厂
- 28.ModifyRequestBody过滤器工厂
- 29.ModifyResponseBody过滤器工厂
- 30.默认过滤器工厂
- [Spring Cloud 相关系列文章目录](https://blog.csdn.net/abu935009066/article/details/112266847)
本文Spring Cloud Gateway 版本:2020.0.0
GatewayFilter Factory 是 Spring Cloud Gateway 中提供的过滤器工厂。Spring Cloud Gateway 的路由过滤器允许以某种方式修改传入的 HTTP 请求或输出的 HTTP 响应,且只作用于特定的路由,Spring Cloud Gateway 中内置了很多过滤器工厂,直接采用配置的方式使用即可。
1.AddRequestHeader过滤器工厂
该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}
2.AddRequestParameter过滤器工厂
该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}
3.AddResponseHeader过滤器工厂
该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}
4.DedupeResponseHeader 过滤器工厂
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
。
重复数据删除
5.CircuitBreaker过滤器工厂
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部分中找到有关此操作的更多信息。
6.FallbackHeaders过滤器工厂
通过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部分。
7.MapRequestHeader过滤器工厂
该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:<values>
标头添加到下游请求中,并带有来自传入HTTP请求Blue
标头的更新值。
8.PrefixPath过滤器工厂
该PrefixPath
GatewayFilter
工厂采用单个prefix
参数。以下示例配置了PrefixPath
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- PrefixPath=/mypath
这将/mypath
作为所有匹配请求的路径的前缀。因此,/hello
将向发送请求/mypath/hello
。
9.PreserveHostHeader过滤器工厂
该PreserveHostHeader
GatewayFilter
工厂没有参数。此过滤器设置请求属性,路由过滤器将检查该请求属性以确定是否应发送原始主机头,而不是由HTTP客户端确定的主机头。以下示例配置了PreserveHostHeader
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: preserve_host_route
uri: https://example.org
filters:
- PreserveHostHeader
10.RequestRateLimiter过滤器工厂
该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}
Redis限流器
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}"
11.RedirectTo过滤器工厂
该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以执行重定向。
12.RemoveRequestHeader过滤器工厂
该RemoveRequestHeader
GatewayFilter
工厂需要一个name
参数。它是要删除的标题的名称。以下清单配置了一个RemoveRequestHeader
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: removerequestheader_route
uri: https://example.org
filters:
- RemoveRequestHeader=X-Request-Foo
这将删除X-Request-Foo
标题,然后再将其发送到下游。
13.RemoveResponseHeader过滤器工厂
该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
并将其应用于所有路由。
14.RemoveRequestParameter过滤器工厂
该RemoveRequestParameter
GatewayFilter
工厂需要一个name
参数。它是要删除的查询参数的名称。以下示例配置了RemoveRequestParameter
GatewayFilter
:
spring:
cloud:
gateway:
routes:
- id: removerequestparameter_route
uri: https://example.org
filters:
- RemoveRequestParameter=red
这将删除red
参数,然后再将其发送到下游。
15.RewritePath过滤器工厂
该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>/?.*), $\{segment}
对于的请求路径/red/blue
,这会将路径设置为/blue
发出下游请求之前的路径。请注意,由于YAML规范,$
应将替换$\
为。
16.RewriteLocationResponseHeader过滤器工厂
该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
。
17.RewriteResponseHeader过滤器工厂
该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规范,您必须使用$\
表示$
。
18.SaveSession过滤器工厂
在将呼叫转发到下游之前,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集成在一起,并希望确保安全性详细信息已转发到远程进程,那么这一点至关重要。
19.SecureHeaders过滤器工厂
根据此博客文章中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
必须使用安全标头的小写全名来禁用它。
20.SetPath过滤器工厂
该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
发出下游请求之前的路径。
21.SetRequestHeader过滤器工厂
该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}
22.SetResponseHeader过滤器工厂
该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}
23.SetStatus过滤器工厂
该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
24.StripPrefix过滤器工厂
该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
。
25.Retry 过滤器工厂
该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
。
26.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。
27.SetRequestHost过滤器工厂
在某些情况下,可能需要覆盖主机头。在这种情况下,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
。
28.ModifyRequestBody过滤器工厂
您可以使用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;
}
}
29.ModifyResponseBody过滤器工厂
您可以使用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();
}
30.默认过滤器工厂
要添加过滤器并将其应用于所有路由,可以使用spring.cloud.gateway.default-filters
。此属性采用过滤器列表。以下清单定义了一组默认过滤器:
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Response-Default-Red, Default-Blue
- PrefixPath=/httpbin
Spring Cloud 相关系列文章目录
网关服务
Spring Cloud Gateway
QQ群【837324215】
关注我的公众号【Java大厂面试官】,回复:常用工具、资源等关键词(更多关键词,关注后注意提示信息)获取更多免费资料。
公众号也会持续输出高质量文章,和大家共同进步。