PrefixPath GatewayFilter Factory
PrefixPath GatewayFilter Factory采用单个前缀参数。
application.yml
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: http://example.org
filters:
- PrefixPath=/mypath
这将使/ mypath前缀为所有匹配请求的路径。所以对/ hello的请求将被发送到/ mypath / hello。
PreserveHostHeader GatewayFilter Factory
PreserveHostHeader GatewayFilter Factory没有参数。此过滤器设置路由过滤器将检查的请求属性,以确定是否应发送原始主机头,而不是http客户端确定的主机头。
application.yml
spring:
cloud:
gateway:
routes:
- id: preserve_host_route
uri: http://example.org
filters:
- PreserveHostHeader
RequestRateLimiter GatewayFilter Factory
RequestRateLimiter GatewayFilter Factory使用RateLimiter实现来确定是否允许当前请求继续。如果不是,则返回HTTP 429 - Too Many Requests(默认情况下)的状态。此过滤器采用可选的keyResolver参数和特定于速率限制器的参数(参见下文)。keyResolver是一个实现KeyResolver接口的bean。在配置中,使用SpEL按名称引用bean。#{@ myKeyResolver}是一个引用名为myKeyResolver的bean的SpEL表达式。
KeyResolver.java
public interface KeyResolver {
Mono<String> resolve(ServerWebExchange exchange);
}
KeyResolver接口允许可插拔策略派生用于限制请求的密钥。在未来的里程碑中,将会有一些KeyResolver实现。KeyResolver的默认实现是PrincipalNameKeyResolver,它从ServerWebExchange检索Principal并调用Principal.getName()。
默认情况下,如果KeyResolver未找到密钥,则会拒绝请求。可以使用spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key(true或false)和spring.cloud.gateway.filter.request-rate-limiter.empty-key-来调整此行为。状态代码属性。
RequestRateLimiter不能通过“快捷方式”表示法进行配置。以下示例无效
application.properties
# INVALID SHORTCUT CONFIGURATION
spring.cloud.gateway.routes[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver}
redis实现基于Stripe完成的工作。它需要使用spring-boot-starter-data-redis -active Spring Boot启动器。
使用的算法是令牌桶算法。
redis-rate-limiter.replenishRate是您希望允许用户每秒执行多少请求,而不会丢弃任何请求。这是令牌桶填充的速率。
redis-rate-limiter.burstCapacity是用户在一秒钟内允许执行的最大请求数。这是令牌桶可以容纳的令牌数。将此值设置为零将阻止所有请求。
通过在replenishRate和burstCapacity中设置相同的值来实现稳定的速率。通过将burstCapacity设置为高于replenishRate,可以允许临时突发。在这种情况下,需要在突发之间允许速率限制器一段时间(根据replenishRate),因为连续2次突发将导致请求被丢弃(HTTP 429 - Too Many Requests)。
application.yml
spring:
cloud:
gateway:
routes:
- id: requestratelimiter_route
uri: http://example.org
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
Config.java
@Bean
KeyResolver userKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}
这定义了每个用户10的请求率限制。允许突发20,但下一秒只有10个请求可用。
KeyResolver是一个简单的获取用户请求参数(注意:这不建议用于生产)。
速率限制器也可以定义为实现RateLimiter接口的bean。在配置中,使用SpEL按名称引用bean。#{@ myRateLimiter}是一个引用名为myRateLimiter的bean的SpEL表达式。
application.yml
spring:
cloud:
gateway:
routes:
- id: requestratelimiter_route
uri: http://example.org
filters:
- name: RequestRateLimiter
args:
rate-limiter: "#{@myRateLimiter}"
key-resolver: "#{@userKeyResolver}"
RedirectTo GatewayFilter Factory
RedirectTo GatewayFilter Factory采用status和url参数。状态应该是300系列重定向http代码,例如301. url应该是有效的URL。
这将是Location标头的值。
application.yml
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: http://example.org
filters:
- RedirectTo=302, http://acme.org
这将发送状态302,其中包含Location:http://acme.org标头以执行重定向。
RemoveHopByHopHeadersFilter GatewayFilter Factory
RemoveHopByHopHeadersFilter GatewayFilter Factory从转发的请求中删除标头。删除的标头列表来自IETF。
默认删除的标头是:
-
Connection
-
Keep-Alive
-
Proxy-Authenticate
-
Proxy-Authorization
-
TE
-
Trailer
-
Transfer-Encoding
-
Upgrade
要更改此设置,请将spring.cloud.gateway.filter.remove-non-proxy-headers.headers属性设置为要删除的标头名称列表。
RemoveRequestHeader GatewayFilter Factory
RemoveRequestHeader GatewayFilter Factory采用名称参数。它是要删除的标头的名称。
application.yml
spring:
cloud:
gateway:
routes:
- id: removerequestheader_route
uri: http://example.org
filters:
- RemoveRequestHeader=X-Request-Foo
这将在向下游发送之前删除X-Request-Foo标头。