Spring Cloud GatewayFilter工厂(二)

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 RateLimiter

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标头。

猜你喜欢

转载自blog.csdn.net/u013702678/article/details/88744742