spring cloud gateway GatewayFilter工厂

路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定的路由。Spring Cloud Gateway 包含许多内置的 GatewayFilter 工厂。

1. 该AddRequestHeader GatewayFilter工厂

该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 GatewayFilter工厂

该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 GatewayFilter工厂

该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 GatewayFilter工厂

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

这消除了重复的值Access-Control-Allow-Credentials和Access-Control-Allow-Origin在情况下响应头当两个网关CORS逻辑和下游逻辑添加它们。

该DedupeResponseHeader过滤器还接受一个可选的strategy参数。接受的值为RETAIN_FIRST(默认)RETAIN_LAST、 和RETAIN_UNIQUE。

5. Spring Cloud 断路器网关过滤器工厂

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

要配置断路器,请参阅您正在使用的底层断路器实现的配置。

Resilience4J 文档

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();
}

此示例/inCaseofFailureUseThis在调用断路器回退时转发到URI。请注意,此示例还演示了(可选)Spring Cloud LoadBalancer 负载平衡(由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 Gateway 过滤器还提供了Throwable导致它的原因。它被添加到ServerWebExchange作为ServerWebExchangeUtils.CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR在网关应用程序中处理回退时可以使用的属性。

对于外部控制器/处理程序场景,可以添加带有异常详细信息的标头。您可以在FallbackHeaders GatewayFilter Factory 部分中找到有关这样做的更多信息。

5.1. 根据状态代码使断路器脱扣

在某些情况下,您可能希望根据从其环绕的路由返回的状态代码来触发断路器。断路器配置对象采用状态代码列表,如果返回这些状态代码,将导致断路器跳闸。在设置要使断路器跳闸的状态代码时,您可以使用带有状态代码值的整数或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. 该FallbackHeaders GatewayFilter工厂

该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 GatewayFilter工厂

该MapRequestHeader GatewayFilter工厂采用fromHeader和toHeader参数。它创建一个新的命名标头 ( toHeader),并fromHeader从传入的 http 请求中从现有命名标头 ( ) 中提取值。如果输入标头不存在,则过滤器没有影响。如果新命名的标头已存在,则其值将使用新值进行扩充。以下示例配置了一个MapRequestHeader:

spring:
  cloud:
    gateway:
      routes:
      - id: map_request_header_route
        uri: https://example.org
        filters:
        - MapRequestHeader=Blue, X-Request-Red

这将X-Request-Red:使用来自传入 HTTP 请求Blue标头的更新值向下游请求添加标头。

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。

9. 该PreserveHostHeader GatewayFilter工厂

该PreserveHostHeader GatewayFilter工厂没有参数。此过滤器设置路由过滤器检查的请求属性,以确定是否应发送原始主机标头,而不是由 HTTP 客户端确定的主机标头。以下示例配置了一个PreserveHostHeader GatewayFilter:

spring:
  cloud:
    gateway:
      routes:
      - id: preserve_host_route
        uri: https://example.org
        filters:
        - PreserveHostHeader

10. 该RequestRateLimiter GatewayFilter工厂

该RequestRateLimiter GatewayFilter工厂采用的是RateLimiter实施以确定当前请求被允许继续进行。如果不是,HTTP 429 - Too Many Requests则返回(默认情况下)状态。

此过滤器采用一个可选keyResolver参数和特定于速率限制器的参数(本节稍后介绍)。

keyResolver是一个实现KeyResolver接口的bean 。在配置中,使用 SpEL 按名称引用 bean。 #{@myKeyResolver}是一个 SpEL 表达式,它引用一个名为myKeyResolver. 以下清单显示了KeyResolver界面:

示例 30.KeyResolver.java
public interface KeyResolver {
Mono 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不与“快捷方式”符号配置。以下示例无效:

示例 31. application.properties

无效的快捷方式配置

spring.cloud.gateway.routes[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver}
6.10.1. RedisRateLimiter
Redis 实现基于在Stripe完成的工作。它需要使用spring-boot-starter-data-redis-reactiveSpring 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 表达式,它引用名为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 GatewayFilter工厂

该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. 该RemoveRequestHeaderGatewayFilter厂

该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 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并将其应用于所有路由。

14. 该RemoveRequestParameter GatewayFilter工厂

该RemoveRequestParameter GatewayFilter工厂需要一个name参数。它是要删除的查询参数的名称。以下示例配置了一个RemoveRequestParameter GatewayFilter:

spring:
  cloud:
    gateway:
      routes:
      - id: removerequestparameter_route
        uri: https://example.org
        filters:
        - RemoveRequestParameter=red

这将在将red参数发送到下游之前删除该参数。

15. 该RewritePath GatewayFilter工厂

该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 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/nameLocationobject-service.prod.example.net/v2/some/object/idapi.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,抵靠该协议名称匹配。如果不匹配,则过滤器不执行任何操作。默认值为http|https|ftp|ftps.

17. 该RewriteResponseHeader GatewayFilter工厂

该RewriteResponseHeader GatewayFilter工厂需要name,regexp和replacement参数。它使用 Java 正则表达式来灵活地重写响应头值。以下示例配置了一个RewriteResponseHeader GatewayFilter:

spring:
  cloud:
    gateway:
      routes:
      - id: rewriteresponseheader_route
        uri: https://example.org
        filters:
        - RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***

对于 的 header 值/42?user=ford&password=omg!what&flag=true,/42?user=ford&password=***&flag=true在发出下游请求后设置为。由于 YAML 规范,您必须使用$\to mean $。

18. 该SaveSession GatewayFilter工厂

该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 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工厂
该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 GatewayFilter工厂

该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 GatewayFilter工厂

该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 GatewayFilter工厂

该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 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.

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:为重试配置的指数退避。在回退间隔 之后执行重试firstBackoff * (factor ^ n),其中n是迭代。如果maxBackoff已配置,则应用的最大退避限制为maxBackoff。如果basedOnPreviousValue为 true,则使用 计算退避prevBackoff * factor。

Retry如果启用,则为过滤器配置以下默认值:

retries: 三遍

series: 5XX系列

methods: 获取方法

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 GatewayFilter工厂

当请求大小大于允许的限制时,RequestSize GatewayFilter工厂可以限制请求到达下游服务。过滤器接受一个maxSize参数。的maxSize is a `DataSize类型,所以值可以被定义为一个数字,后跟一个可选的DataUnit后缀,例如“KB”或“MB”。字节的默认值为“B”。它是以字节为单位定义的请求的允许大小限制。以下清单配置了一个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
如果未在路由定义中作为过滤器参数提供,则默认请求大小设置为 5 MB。

27. 该SetRequestHostHeader GatewayFilter工厂

在某些情况下,可能需要覆盖主机标头。在这种情况下,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。

28. 修改请求正文GatewayFilter工厂

您可以使用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;
    }
}

如果请求没有正文,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 消费者充当客户端并将传入令牌转发到传出资源请求的地方。消费者可以是纯客户端(如 SSO 应用程序)或资源服务器。

Spring Cloud Gateway 可以将 OAuth2 访问令牌下游转发到它正在代理的服务。要将此功能添加到网关,您需要添加 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 Gateway 启用此功能,请添加以下依赖项

org.springframework.boot:spring-boot-starter-oauth2-client

它是如何工作的?{githubmaster}/src/main/java/org/springframework/cloud/gateway/security/TokenRelayGatewayFilterFactory.java[filter] 从当前已验证的用户中提取访问令牌,并将其放入下游请求的请求头中。

有关完整的工作示例,请参阅此项目。

一TokenRelayGatewayFilterFactory,如果适当的豆,才会创建spring.security.oauth2.client.*属性设置,这将触发创建ReactiveClientRegistrationRepository豆。
ReactiveOAuth2AuthorizedClientServiceused by 的默认实现使用TokenRelayGatewayFilterFactory 内存数据存储。ReactiveOAuth2AuthorizedClientService 如果您需要更强大的解决方案,您将需要提供自己的实现。

31. 默认过滤器

要添加过滤器并将其应用于所有路由,您可以使用spring.cloud.gateway.default-filters. 此属性采用过滤器列表。以下清单定义了一组默认过滤器:

spring:
  cloud:
    gateway:
      default-filters:
      - AddResponseHeader=X-Response-Default-Red, Default-Blue
      - PrefixPath=/httpbin

原文:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值