网关 Spring Cloud Gateway 内置过滤器工厂(超级全30种)


作者: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过滤器工厂
      • Redis限流器
    • 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

本文Spring Cloud Gateway 版本:2020.0.0

GatewayFilter Factory 是 Spring Cloud Gateway 中提供的过滤器工厂。Spring Cloud Gateway 的路由过滤器允许以某种方式修改传入的 HTTP 请求或输出的 HTTP 响应且只作用于特定的路由,Spring Cloud Gateway 中内置了很多过滤器工厂,直接采用配置的方式使用即可。

1.AddRequestHeader过滤器工厂

AddRequestHeader GatewayFilter工厂需要namevalue参数。以下示例配置了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工厂需要namevalue参数。以下示例配置了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工厂需要namevalue参数。以下示例配置了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-CredentialsAccess-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

要配置断路器,请参阅所使用的基础断路器实现的配置。

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

当调用断路器回退时,此示例将转发到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:9994FallbackHeaders过滤器会将具有异常类型,消息和(如果有)根本原因异常类型和消息的标头添加到该请求。

您可以通过设置以下参数的值(以其默认值显示)来覆盖配置中标头的名称:

  • 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工厂采用fromHeadertoHeader参数。它将创建一个新的命名标头(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:标头添加到下游请求中,并带有来自传入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实现。

的默认实现KeyResolverPrincipalNameKeyResolverPrincipalServerWebExchange和调用检索Principal.getName()

默认情况下,如果KeyResolver找不到密钥,则拒绝请求。您可以通过设置spring.cloud.gateway.filter.request-rate-limiter.deny-empty-keytruefalse)和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来的产品replenishRaterequestedTokens结构,如设定replenishRate=1requestedTokens=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工厂有两个参数,statusurl。该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}

对于的请求路径/red/blue,这会将路径设置为/blue发出下游请求之前的路径。请注意,由于YAML规范,$应将替换$\为。

16.RewriteLocationResponseHeader过滤器工厂

RewriteLocationResponseHeader GatewayFilter工厂修改的值Location响应头,通常摆脱于后端的具体细节。这需要stripVersionModelocationHeaderNamehostValue,和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_STRIPAS_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工厂需要nameregexpreplacement参数。它使用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工厂采用namevalue参数。以下清单配置了一个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工厂采用namevalue参数。以下清单配置了一个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方法
  • exceptionsIOExceptionTimeoutException
  • 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 aDataSize类型,所以值可以被定义为一个数字,后跟一个可选的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

  • 网关 Spring Cloud Gateway 简介 入门

  • 网关 Spring Cloud Gateway 内置的路由谓词工厂详解(最全的路由策略11种)

  • 网关 Spring Cloud Gateway 内置过滤器工厂(超级全30种)

  • 网关 Spring Cloud Gateway 内置全局过滤器

  • 网关 Spring Cloud Gateway 内置网关过滤器工厂总结

  • 网关 Spring Cloud Gateway 两种配置谓词和过滤器的方法

  • 网关 Spring Cloud Gateway 监控 actuator

  • 网关 Spring Cloud Gateway 自定义路由谓词工厂

  • 网关 Spring Cloud Gateway 自定义过滤器(全局过滤器以及网关过滤器)

  • 网关 Spring Cloud Gateway 跨域配置

  • 网关 Spring Cloud Gateway HTTP超时配置

  • 网关 Spring Cloud Gateway 统一全局异常处理


QQ群【837324215】
关注我的公众号【Java大厂面试官】,回复:常用工具资源等关键词(更多关键词,关注后注意提示信息)获取更多免费资料。

公众号也会持续输出高质量文章,和大家共同进步。

你可能感兴趣的:(#,Spring,Cloud,java,spring,spring,boot,spring,cloud)