6. GatewayFilter
工厂
路由筛选器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。 路由过滤器的范围限定为特定路由。 Spring Cloud 网关包括许多内置的 GatewayFilter 工厂。
有关如何使用以下任何筛选器的更详细示例,请查看单元测试。 |
6.1.AddRequestHeaderGatewayFilter
工厂
工厂采用 and 参数。
以下示例配置了一个 :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
此清单将 header 添加到所有匹配请求的下游请求的 headers 中。X-Request-red:blue
AddRequestHeader
知道用于匹配路径或主机的 URI 变量。
URI 变量可以在值中使用,并在运行时扩展。
以下示例配置了使用变量的 an: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}
6.2. AddRequestParameter
GatewayFilter
工厂
Factory 采用 and 参数。
以下示例配置了一个 :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 变量可以在值中使用,并在运行时扩展。
以下示例配置了使用变量的 an: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}
6.3. AddResponseHeader
GatewayFilter
工厂
Factory 采用 and 参数。
以下示例配置了一个 :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
这会将 header 添加到所有匹配请求的下游响应的 header 中。X-Response-Foo:Bar
AddResponseHeader
知道用于匹配路径或主机的 URI 变量。
URI 变量可以在值中使用,并在运行时扩展。
以下示例配置了使用变量的 an: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}
6.4. DedupeResponseHeader
GatewayFilter
工厂
DedupeResponseHeader GatewayFilter 工厂采用一个参数和一个可选参数。 可以包含以空格分隔的 Headers 名称列表。
以下示例配置了一个 :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 逻辑和下游逻辑都添加 和 response 标头的重复值时删除它们。Access-Control-Allow-Credentials
Access-Control-Allow-Origin
filter 还接受一个可选参数。
接受的值为 (default)、 和 。DedupeResponseHeader
strategy
RETAIN_FIRST
RETAIN_LAST
RETAIN_UNIQUE
6.5. Spring Cloud CircuitBreaker GatewayFilter 工厂
Spring Cloud CircuitBreaker GatewayFilter工厂使用 Spring Cloud CircuitBreaker API 将网关路由包装在 断路器。Spring Cloud CircuitBreaker 支持多个可与 Spring Cloud Gateway 一起使用的库。Spring Cloud 支持开箱即用的 Resilience4J。
要启用 Spring Cloud CircuitBreaker 过滤器,你需要放在 Classpath 上。
以下示例配置Spring Cloud CircuitBreaker:spring-cloud-starter-circuitbreaker-reactor-resilience4j
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: circuitbreaker_route
uri: https://example.org
filters:
- CircuitBreaker=myCircuitBreaker
要配置断路器,请参阅您正在使用的底层断路器实现的配置。
Spring Cloud CircuitBreaker 过滤器也可以接受可选参数。
目前,仅支持方案化 URI。
如果调用了回退,则请求将转发到与 URI 匹配的控制器。
以下示例配置了此类回退:fallbackUri
forward:
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。
请注意,此示例还演示了(可选)Spring Cloud LoadBalancer 负载平衡(由目标 URI 上的前缀定义)。/inCaseofFailureUseThis
lb
主要方案是使用 来定义网关应用程序中的内部控制器或处理程序。
但是,您也可以将请求重新路由到外部应用程序中的控制器或处理程序,如下所示: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
如果请求被转发到 fallback,Spring Cloud CircuitBreaker Gateway 过滤器还会提供导致该请求的原因。
它被添加到 作为属性中,在网关应用程序中处理回退时可以使用该属性。Throwable
ServerWebExchange
ServerWebExchangeUtils.CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR
对于外部控制器/处理程序方案,可以添加包含异常详细信息的标头。 你可以在FallbackHeaders GatewayFilter Factory部分找到有关执行此操作的更多信息。
6.5.1. 在状态代码上使断路器跳闸
在某些情况下,您可能希望根据状态代码触发断路器
从它包装的路由返回。断路器配置对象采用
状态代码,如果返回,将导致断路器跳闸。在设置
状态代码 您希望使断路器跳闸,您可以使用带有状态代码的整数
value 或枚举的 String 表示形式。HttpStatus
spring:
cloud:
gateway:
routes:
- id: circuitbreaker_route
uri: lb://backing-service:8088
predicates:
- Path=/consumingServiceEndpoint
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/inCaseOfFailureUseThis
statusCodes:
- 500
- "NOT_FOUND"
@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").addStatusCode("INTERNAL_SERVER_ERROR"))
.rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088")
.build();
}
6.6. FallbackHeaders
GatewayFilter
工厂
工厂允许您在转发到外部应用程序中的请求的 Headers 中添加 Spring Cloud CircuitBreaker 执行异常详细信息,如以下场景所示:FallbackHeaders
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
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 部分。
6.7.MapRequestHeader
GatewayFilter
工厂
工厂 take 和 parameters.
它会创建一个新的命名标头 (),并从传入的 http 请求中从现有的命名标头 () 中提取该值。
如果 input 标头不存在,则筛选器不会产生任何影响。
如果新的命名标头已存在,则其值将使用新值进行扩充。
以下示例配置了一个 :MapRequestHeader
GatewayFilter
fromHeader
toHeader
toHeader
fromHeader
MapRequestHeader
spring:
cloud:
gateway:
routes:
- id: map_request_header_route
uri: https://example.org
filters:
- MapRequestHeader=Blue, X-Request-Red
这会使用传入 HTTP 请求标头中的更新值向下游请求添加标头。X-Request-Red:<values>
Blue
6.8. PrefixPath
GatewayFilter
工厂
工厂采用单个参数。
以下示例配置了一个 :PrefixPath
GatewayFilter
prefix
PrefixPath
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- PrefixPath=/mypath
这将作为所有匹配请求的路径的前缀。
因此,请求 将发送到 。/mypath
/hello
/mypath/hello
6.9. PreserveHostHeader
GatewayFilter
工厂
工厂没有参数。
此筛选器设置路由筛选器检查的请求属性,以确定是否应发送原始主机标头,而不是由 HTTP 客户端确定的主机标头。
以下示例配置了一个 :PreserveHostHeader
GatewayFilter
PreserveHostHeader
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: preserve_host_route
uri: https://example.org
filters:
- PreserveHostHeader
6.10.RequestRateLimiter
GatewayFilter
工厂
工厂使用 implementation 来确定是否允许当前请求继续进行。如果不是,则返回状态 (默认情况下)。RequestRateLimiter
GatewayFilter
RateLimiter
HTTP 429 - Too Many Requests
此筛选条件采用可选参数和特定于速率限制器的参数(本节稍后将介绍)。keyResolver
keyResolver
是实现接口的 Bean。
在配置中,使用 SPEL 按名称引用 bean。 是一个 SpEL 表达式,它引用名为 .
下面的清单显示了该接口:KeyResolver
#{@myKeyResolver}
myKeyResolver
KeyResolver
public interface KeyResolver {
Mono<String> resolve(ServerWebExchange exchange);
}
该接口允许可插拔策略派生用于限制请求的密钥。
在未来的里程碑版本中,将有一些实施。KeyResolver
KeyResolver
的默认实现是 ,它从 和 调用 中检索 。KeyResolver
PrincipalNameKeyResolver
Principal
ServerWebExchange
Principal.getName()
默认情况下,如果找不到 key,则拒绝请求。
您可以通过设置 () 或 ) 和属性来调整此行为。KeyResolver
spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key
true
false
spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code
不能使用 “shortcut” 表示法进行配置。以下示例无效: 例 31.application.properties
# INVALID SHORTCUT CONFIGURATION spring.cloud.gateway.routes[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver} |
6.10.1. Redis RateLimiter
Redis 实现基于 Stripe 所做的工作。
它需要使用 Spring Boot Starters。spring-boot-starter-data-redis-reactive
使用的算法是 Token Bucket Algorithm。
该属性是您希望允许用户每秒执行的请求数,而不会丢弃任何请求。
这是填充令牌桶的速率。redis-rate-limiter.replenishRate
该属性是允许用户在一秒钟内执行的最大请求数。
这是令牌桶可以容纳的令牌数量。
将此值设置为 0 会阻止所有请求。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 个请求可用。
这是一个获取 request 参数的简单参数(请注意,不建议将其用于 production)。KeyResolver
user
您还可以将速率限制器定义为实现该接口的 Bean。
在配置中,您可以使用 SpEL 按名称引用 Bean。 是一个 SpEL 表达式,它引用名为 的 bean 。
下面的清单定义了一个速率限制器,它使用上一个清单中定义的速率限制器:RateLimiter
#{@myRateLimiter}
myRateLimiter
KeyResolver
spring:
cloud:
gateway:
routes:
- id: requestratelimiter_route
uri: https://example.org
filters:
- name: RequestRateLimiter
args:
rate-limiter: "#{@myRateLimiter}"
key-resolver: "#{@userKeyResolver}"
6.11. RedirectTo
GatewayFilter
工厂
工厂采用两个参数,和 .
该参数应为 300 系列重定向 HTTP 代码,例如 301。
该参数应为有效的 URL。
这是标头的值。
对于相对重定向,您应该用作路由定义的 URI。
下面的清单配置了一个:RedirectTo
GatewayFilter
status
url
status
url
Location
uri: no://op
RedirectTo
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- RedirectTo=302, https://acme.org
这将发送一个状态 302 和一个 Headers 来执行重定向。Location:https://acme.org
6.12. RemoveRequestHeader
GatewayFilter 工厂
工厂采用一个参数。
它是要删除的标头的名称。
下面的清单配置了一个:RemoveRequestHeader
GatewayFilter
name
RemoveRequestHeader
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: removerequestheader_route
uri: https://example.org
filters:
- RemoveRequestHeader=X-Request-Foo
这会在将标头发送到下游之前将其删除。X-Request-Foo
6.13. RemoveResponseHeader
GatewayFilter
工厂
工厂采用一个参数。
它是要删除的标头的名称。
下面的清单配置了一个: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
6.14. RemoveRequestParameter
GatewayFilter
工厂
工厂采用一个参数。
它是要删除的查询参数的名称。
以下示例配置了一个 :RemoveRequestParameter
GatewayFilter
name
RemoveRequestParameter
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: removerequestparameter_route
uri: https://example.org
filters:
- RemoveRequestParameter=red
这将在参数被发送到下游之前将其删除。red
6.15. RewritePath
GatewayFilter
工厂
工厂采用 path 参数和 parameter。
它使用 Java 正则表达式来灵活地重写请求路径。
下面的清单配置了一个:RewritePath
GatewayFilter
regexp
replacement
RewritePath
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: https://example.org
predicates:
- Path=/red/**
filters:
- RewritePath=/red/?(?<segment>.*), /$\{segment}
对于请求路径 ,这会将路径设置为发出下游请求之前。请注意,由于 YAML 规范,应将其替换为 the。/red/blue
/blue
$
$\
6.16. RewriteLocationResponseHeader
GatewayFilter
工厂
工厂修改响应头的值,通常是为了摆脱特定于后端的细节。
它需要 、 、 和 参数。
下面的清单配置了一个: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
该参数具有以下可能的值:、(default) 和 .stripVersionMode
NEVER_STRIP
AS_IN_REQUEST
ALWAYS_STRIP
-
NEVER_STRIP
:即使原始请求路径不包含版本,也不会剥离版本。 -
AS_IN_REQUEST
仅当原始请求路径不包含版本时,才会剥离版本。 -
ALWAYS_STRIP
版本始终被剥离,即使原始请求路径包含 version。
该参数(如果提供)用于替换响应标头的部分。
如果未提供,则使用 request 标头的值。hostValue
host:port
Location
Host
该参数必须是与协议名称匹配的有效 regex 。
如果不匹配,则筛选器不执行任何操作。
默认值为 .protocolsRegex
String
http|https|ftp|ftps
6.17. RewriteResponseHeader
GatewayFilter
工厂
工厂采用 、 和 参数。
它使用 Java 正则表达式来灵活地重写响应标头值。
以下示例配置了一个 :RewriteResponseHeader
GatewayFilter
name
regexp
replacement
RewriteResponseHeader
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: rewriteresponseheader_route
uri: https://example.org
filters:
- RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
对于标头值 ,它设置为 在发出下游请求之后。
由于 YAML 规范,您必须使用 to mean。/42?user=ford&password=omg!what&flag=true
/42?user=ford&password=***&flag=true
$\
$
6.18. SaveSession
GatewayFilter
工厂
工厂在将调用转发到下游之前强制执行操作。
当使用带有惰性数据存储的 Spring Session 之类的东西时,这特别有用,你需要确保在进行转发调用之前已经保存了会话状态。
以下示例配置了一个 :SaveSession
GatewayFilter
WebSession::save
SaveSession
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: save_session
uri: https://example.org
predicates:
- Path=/foo/**
filters:
- SaveSession
如果您将 Spring Security 与 Spring Session 集成,并希望确保已将安全详细信息转发到远程进程,那么这一点至关重要。
6.19. SecureHeaders
GatewayFilter
工厂
工厂根据此博客文章中的建议向响应添加许多标头。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
需要使用安全标头的小写全名来禁用它.. |
6.20. SetPath
GatewayFilter
工厂
工厂采用 path 参数。
它提供了一种简单的方法来操作请求路径,方法是允许路径的模板化段。
这使用了 Spring Framework 中的 URI 模板。
允许多个匹配的区段。
以下示例配置了一个 :SetPath
GatewayFilter
template
SetPath
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: setpath_route
uri: https://example.org
predicates:
- Path=/red/{segment}
filters:
- SetPath=/{segment}
对于请求路径 ,这会将路径设置为发出下游请求之前。/red/blue
/blue
6.21. SetRequestHeader
GatewayFilter
工厂
工厂 take 和 parameters.
下面的清单配置了一个: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 变量可以在值中使用,并在运行时扩展。
以下示例配置了使用变量的 an:SetRequestHeader
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: setrequestheader_route
uri: https://example.org
predicates:
- Host: {segment}.myhost.org
filters:
- SetRequestHeader=foo, bar-{segment}
6.22. SetResponseHeader
GatewayFilter
工厂
工厂 take 和 parameters.
下面的清单配置了一个:SetResponseHeader
GatewayFilter
name
value
SetResponseHeader
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: setresponseheader_route
uri: https://example.org
filters:
- SetResponseHeader=X-Response-Red, Blue
这个GatewayFilter用给定的名称替换(而不是添加)所有 headers。
因此,如果下游服务器以 响应 ,则将其替换为 ,这是网关客户端将接收到的内容。X-Response-Red:1234
X-Response-Red:Blue
SetResponseHeader
知道用于匹配路径或主机的 URI 变量。
URI 变量可以在值中使用,并将在运行时扩展。
以下示例配置了使用变量的 an:SetResponseHeader
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: setresponseheader_route
uri: https://example.org
predicates:
- Host: {segment}.myhost.org
filters:
- SetResponseHeader=foo, bar-{segment}
6.23. SetStatus
GatewayFilter
工厂
工厂采用单个参数 .
它必须是有效的 Spring 。
它可以是整数值或枚举的字符串表示形式: .
下面的清单配置了一个:SetStatus
GatewayFilter
status
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。
您可以将 配置为在响应的标头中从代理请求返回原始 HTTP 状态代码。
如果配置了以下属性,则会将标头添加到响应中:SetStatus
GatewayFilter
spring:
cloud:
gateway:
set-status:
original-status-header-name: original-http-status
6.24. StripPrefix
GatewayFilter
工厂
工厂采用一个参数 .
该参数指示在将请求发送到下游之前要从请求中删除的路径中的部分数。
下面的清单配置了一个: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
6.25. 重试 GatewayFilter
工厂
工厂支持以下参数:Retry
GatewayFilter
-
retries
:应尝试的重试次数。 -
statuses
:应重试的 HTTP 状态代码,用 .org.springframework.http.HttpStatus
-
methods
:应重试的 HTTP 方法,用 .org.springframework.http.HttpMethod
-
series
:要重试的一系列状态代码,用 表示。org.springframework.http.HttpStatus.Series
-
exceptions
:应重试的引发异常的列表。 -
backoff
:为重试配置的指数回退。 重试在 的回退间隔后执行,其中 是迭代。 如果已配置,则应用的最大回退限制为 。 如果为 true,则使用 计算回退。firstBackoff * (factor ^ n)
n
maxBackoff
maxBackoff
basedOnPreviousValue
prevBackoff * factor
如果启用,则为 filter 配置以下默认值:Retry
-
retries
:三次 -
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
将重试筛选条件与带前缀的 URL 一起使用时,应仔细编写目标终端节点,以便在出现错误时,它不会执行任何可能导致将响应发送到客户端并提交的操作。
例如,如果目标终端节点是带 Comments 的控制器,则目标控制器方法不应返回错误状态代码。
相反,它应该引发错误 (或发出错误信号,例如,通过返回值) ,重试筛选条件可以通过重试来处理该错误。forward: ResponseEntity Exception Mono.error(ex) |
当将重试过滤器与任何带有正文的 HTTP 方法一起使用时,正文将被缓存,网关将受到内存限制。正文缓存在 由 定义的请求属性中。对象的类型是 .ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR org.springframework.core.io.buffer.DataBuffer |
可以使用单个 和 添加简化的“快捷方式”表示法。status
method
以下两个示例是等效的:
spring:
cloud:
gateway:
routes:
- id: retry_route
uri: https://example.org
filters:
- name: Retry
args:
retries: 3
statuses: INTERNAL_SERVER_ERROR
methods: GET
backoff:
firstBackoff: 10ms
maxBackoff: 50ms
factor: 2
basedOnPreviousValue: false
- id: retryshortcut_route
uri: https://example.org
filters:
- Retry=3,INTERNAL_SERVER_ERROR,GET,10ms,50ms,2,false
6.26. RequestSize
GatewayFilter
工厂
当请求大小大于允许的限制时,工厂可以限制请求到达下游服务。
过滤器采用一个参数。
类型,因此值可以定义为一个数字,后跟一个可选后缀,如“KB”或“MB”。字节的默认值为 'B'。
它是以字节为单位定义的请求的允许大小限制。
下面的清单配置了一个:RequestSize
GatewayFilter
maxSize
maxSize is a `DataSize
DataUnit
RequestSize
GatewayFilter
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
如果未在路由定义中作为 filter 参数提供,则默认请求大小设置为 5 MB。 |
6.27. SetRequestHostHeader
GatewayFilter
工厂
在某些情况下,可能需要覆盖主机标头。在这种情况下,工厂可以用指定的 vaue 替换现有的 host 头。
过滤器采用一个参数。
下面的清单配置了一个:SetRequestHostHeader
GatewayFilter
host
SetRequestHostHeader
GatewayFilter
spring:
cloud:
gateway:
routes:
- id: set_request_host_header_route
uri: http://localhost:8080/headers
predicates:
- Path=/headers
filters:
- name: SetRequestHostHeader
args:
host: example.org
工厂将主机标头的值替换为 .SetRequestHostHeader
GatewayFilter
example.org
6.28. 修改请求体 GatewayFilter
工厂
您可以使用筛选条件筛选条件在网关向下游发送请求之前修改请求正文。ModifyRequestBody
此过滤器只能使用 Java DSL 进行配置。 |
以下清单显示了如何修改 request body :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;
}
}
如果请求没有正文,则将 . 应返回以在请求中分配缺少的正文。RewriteFilter null Mono.empty() |
6.29. 修改响应体 GatewayFilter
工厂
在将响应发送回客户端之前,您可以使用筛选器修改响应正文。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();
}
如果响应没有正文,则将 . 应返回以在响应中分配缺少的正文。RewriteFilter null Mono.empty() |
6.30. 令牌中继 GatewayFilter
工厂
令牌中继是 OAuth2 使用者充当客户端的地方,而 将传入令牌转发到传出资源请求。这 consumer 可以是纯 Client(如 SSO 应用程序)或 Resource 服务器。
Spring Cloud 网关可以将 OAuth2 访问令牌下游转发到服务
它是代理。要将此功能添加到 gateway,您需要添加如下内容:TokenRelayGatewayFilterFactory
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("resource", r -> r.path("/resource")
.filters(f -> f.tokenRelay())
.uri("http://localhost:9000"))
.build();
}
或者这个
spring:
cloud:
gateway:
routes:
- id: resource
uri: http://localhost:9000
predicates:
- Path=/resource
filters:
- TokenRelay=
它会(除了登录用户和获取令牌之外)
将身份验证令牌下游传递给服务(在本例中)。/resource
要为 Spring Cloud 网关启用此功能,请添加以下依赖项
-
org.springframework.boot:spring-boot-starter-oauth2-client
它是如何工作的?这 {githubmaster}/src/main/java/org/springframework/cloud/gateway/security/TokenRelayGatewayFilterFactory.java[过滤器] 从当前经过身份验证的用户中提取访问令牌, 并将其放入下游请求的请求标头中。
有关完整的工作示例,请参阅此项目。
只有在设置了适当的属性时,才会创建 Bean,这将触发 Bean 的创建。TokenRelayGatewayFilterFactory spring.security.oauth2.client.* ReactiveClientRegistrationRepository |
的默认实现 used by 使用内存中数据存储。如果您需要更强大的解决方案,则需要提供自己的实现。ReactiveOAuth2AuthorizedClientService TokenRelayGatewayFilterFactory ReactiveOAuth2AuthorizedClientService |
6.31. 默认过滤器
要添加筛选条件并将其应用于所有路由,您可以使用 .
此属性采用筛选器列表。
下面的清单定义了一组默认过滤器:spring.cloud.gateway.default-filters
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Response-Default-Red, Default-Blue
- PrefixPath=/httpbin