Spring Cloud Gateway高级特性之过滤器(Hoxton版本)

共 21017字,需浏览 43分钟

 ·

2021-01-27 17:10

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

76套java从入门到精通实战课程分享

1.高级特性—过滤器(Filter)

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生,下面将对各个过滤器进行一一说明
Spring Cloud Gateway 内置的过滤器工厂一览表如下:

锋哥最新SpringCloud分布式电商秒杀课程发布

👇👇👇

👆长按上方微信二维码 2 秒


1.1 AddRequestHeader GatewayFilter

通过配置name和value可以增加请求的header。

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 给请求增加Header X-Request-red
            # 访问http://localhost:9100/provider/demo/hello-> eureka-client-provider/demo/hello
            - AddRequestHeader=X-Request-red, blue

请求http://localhost:9100/provider/demo/hello ,我们可以从后端获取到添加的header头

1.2 AddRequestParameter GatewayFilter

通过配置name和value可以增加请求的参数

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 给请求增加参数name
            # 访问http://localhost:9100/provider/demo/feign -> eureka-client-provider/demo/feign
            - AddRequestParameter=name, Trazen

通过请求http://localhost:9100/provider/demo/feign ,相当于http://localhost:9100/provider/demo/feign?name=Trazen

1.3 AddResponseHeader GatewayFilter

AddResponseHeader GatewayFilter Factory通过配置name和value可以增加响应的header。

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 给请求增加响应的header
            # 访问http://localhost:9100/provider/demo/hello-> eureka-client-provider/demo/hello
            - AddResponseHeader=X-Response-Foo, Bar

通过请求http://localhost:9100/provider/demo/hello 可以看到返回的header中带有配置的值。

1.4 DedupeResponseHeader GatewayFilter

剔除重复的响应头。

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            #剔除重复的响应头
            - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_FIRST

例如:
我们在Gateway以及微服务上都设置了CORS(解决跨域)header,如果不做任何配置,请求 -> 网关 -> 微服务,获得的响应就是这样的:

Access-Control-Allow-Credentials: truetrue
Access-Control-Allow-Origin: https://hxmec.com, https://hxmec.com

也就是Header重复了。要想把这两个Header去重,只需设置成如下即可。

filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin

也就是说,想要去重的Header如果有多个,用空格分隔即可;
去重策略:

  • RETAIN_FIRST: 默认值,保留第一个值

  • RETAIN_LAST: 保留最后一个值

  • RETAIN_UNIQUE: 保留所有唯一值,以它们第一次出现的顺序保留

1.5 Hystrix GatewayFilter

Hystrix 过滤器允许你将断路器功能添加到网关路由中,使你的服务免受级联故障的影响,并提供服务降级处理。

要开启断路器功能,我们需要在pom.xml中添加Hystrix的相关依赖:


 org.springframework.cloud
 spring-cloud-starter-netflix-hystrix


然后添加相关服务降级的处理类:

@RestController
public class FallbackController {

    @GetMapping("/fallback")
    public Object fallback() {
        Map result = new HashMap<>(3);
        result.put("data",null);
        result.put("message","request fallback!!!");
        result.put("code",500);
        return result;
    }

}

在application-filter.yml中添加相关配置,当路由出错时会转发到服务降级处理的控制器上:

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            - name: Hystrix
              args:
                name: fallbackcmd
                fallback-uri: forward:/fallback


重新启动网关后停止spring-cloud-eureka-client-provider服务,再请求http://localhost:9100/provider/demo/hello 。可以看到已经返回服务降级后的处理信息。

1.6 Spring Cloud CircuitBreaker GatewayFilter

Spring Cloud CircuitBreaker GatewayFilter 工厂使用 Spring Cloud CircuitBreaker APIs 将 Gateway 路由包装在熔断器中(circuit breaker)。
  Spring Cloud CircuitBreaker 支持可与 Spring Cloud Gateway 一起使用的两个库 Hystrix 和 Resilience4J。由于Netflix 已将 Hystrix 置于仅维护模式,因此建议使用 Resilience4J。
  要启用 Spring Cloud CircuitBreaker,需要引入 spring-cloud-starter-circuitbreaker-reactor-resilience4j 或 spring-cloud-starter-netflix-hystrix 依赖。配置如下示例:

spring:
  cloud:
    gateway:
      routes:
      - id: circuitbreaker_route
        uri: https://example.org
        filters:
        - CircuitBreaker=myCircuitBreaker

1.7 FallbackHeaders GatewayFilter

允许在转发到外部应用程序中的 fallbackUri的请求头中添加 Hystrix或Spring Cloud CircuitBreaker执行异常详细信息。

spring:
  cloud:
    gateway:
      routes:
      - id: ingredients
        uri: lb://ingredients
        predicates:
        - Path=//ingredients/**
        filters:
        - name: Hystrix
          args:
            name: fetchIngredients
            fallbackUri: forward:/fallback
      - id: ingredients-fallback
        uri: http://localhost:9994
        predicates:
        - Path=/fallback
        filters:
        - name: FallbackHeaders
          args:
            executionExceptionTypeHeaderName: Test-Header

在这个例子中,当请求lb://ingredients降级后,FallbackHeadersfilter会将HystrixCommand的异常信息,通过Test-Header带给http://localhost:9994服务。

你也可以使用默认的header,也可以像上面一下配置修改header的名字:

  • executionExceptionTypeHeaderName (“Execution-Exception-Type”)

  • executionExceptionMessageHeaderName (“Execution-Exception-Message”)

  • rootCauseExceptionTypeHeaderName (“Root-Cause-Exception-Type”)

  • rootCauseExceptionMessageHeaderName (“Root-Cause-Exception-Message”)

1.8 MapRequestHeader GatewayFilter

输入两个参数:Header1、Header2,将上游 Header1 的值赋值到下游 Header2

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 将上游 X-Request-Foo Header 的值赋值到下游 X-Request-red中,如果输入标头不存在,则过滤器不起作用。如果新的命名标头已经存在,则其值将使用新值进行扩充。
            # 访问http://localhost:9100/provider/demo/feign -> eureka-client-provider/demo/feign
            - MapRequestHeader=X-Request-Foo, X-Request-red

通过请求http://localhost:9100/provider/demo/feign 可以看到在下游服务中,成功获取到Header。

1.9 PrefixPath GatewayFilter

在请求路径中添加前缀路径

spring:
  cloud:
    gateway:
      routes:
      - id: prefixpath_route
        uri: https://example.org
        filters:
        - PrefixPath=/mypath

这会将/mypath作为所有匹配请求的路径的前缀。因此,对/hello的请求将发送到/mypath/hello。

1.10 PreserveHostHeader GatewayFilter

留原始请求的host头信息,并原封不动的转发出去,而不是被gateway的http客户端重置。

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 保留原始请求的host头信息,并原封不动的转发出去,而不是被gateway的http客户端重置。
            - PreserveHostHeader

设置了 PreserveHostHeader过滤器,过滤器会把 ServerWebExchangeUtils.PRESERVE_HOST_HEADER_ATTRIBUTE = true保存到 ServerWebExchange的属性中(attributes:是个 Map 结构)。在 NettyRoutingFilter 过滤器中,会取出该属性,判断值为 true,就取出原始请求头中的 Host 添加进新的请求(request)中。

1.11 RequestRateLimiter GatewayFilter

RequestRateLimiter使用RateLimiter实现是否允许继续执行当前请求。如果不允许继续执行,则返回HTTP 429 - Too Many Requests (默认情况下)。

RequestRateLimiter GatewayFilter可以使用一个可选参数keyResolver来做速率限制。
keyResolver是KeyResolver接口的一个实现bean,在配置里面,通过SpEL表达式#{@myKeyResolver}来管理bean的名字myKeyResolver。
KeyResolver.java.

public interface KeyResolver {
 Mono resolve(ServerWebExchange exchange);
}

KeyResolver 接口允许可插拔策略派生用于限制请求的密钥。在未来的里程碑版本中,将有一些 KeyResolver 实现。

KeyResolver 的默认实现是 PrincipalNameKeyResolver,它会从 ServerWebExchange检索 Principal并调用 Principal.getName()。

默认情况下,如果 KeyResolver 找不到 Key,请求就会被拒绝。也可以通过设置来调整此行为:

spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key=true|flase
spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code=

RequestRateLimiterGatewayFilterFactory.java

/**
 * Switch to deny requests if the Key Resolver returns an empty key, defaults to true.
 */
private boolean denyEmptyKey = true;

/** HttpStatus to return when denyEmptyKey is true, defaults to FORBIDDEN. */
private String emptyKeyStatusCode = HttpStatus.FORBIDDEN.name();

注意:RequestRateLimiter 不支持快捷方式的配置。下面示例的配置是无效的:

application.properties

# INVALID SHORTCUT CONFIGURATION
spring.cloud.gateway.routes[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver}


1.11.1 Redis RateLimiter

Redis RateLimiter 的实现是基于在 Stripe 完成的工作。它需要引入 spring-boot-starter-data-redis-reactive Spring Boot starter 包。

算法使用的是令牌桶算法(Token Bucket Algorithm)

  • redis-rate-limiter.replenishRate 属性:允许每秒可以处理的请求数,没有任何丢弃的请求。该值是令牌桶的流入速率。

  • redis-rate-limiter.burstCapacity 属性:允许在一秒内执行的最大请求数。该值是令牌桶持有的令牌数。设置值为 0 将阻止所有请求。

  • redis-rate-limiter.requestedTokens 属性:一个请求需要消费的令牌数。这是每个请求从 bucket 中获取的令牌数,默认为 1。
    通过设置 replenishRate 和 burstCapacity 相同的值可以实现固定的速率。通过将burstCapacity设置为高于 replenishRate,可以允许临时突发请求流量。

注意:两次突发流量应间隔一段时间,以便于令牌桶中有多余的令牌供突发请求使用,若是连续的突发流量,令牌耗尽则会丢弃请求(返回 HTTP 429 - Too Many Request)。下面列了 redis-rate-limiter 的配置。

具体配置如下:

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
                redis-rate-limiter.requestedTokens: 1

配置示例:令牌产生速度是每秒 10 个,桶中可保存 20 个令牌(能处理的突发请求数,下一秒则只能处理 10 个请求),每个请求消耗 1 个令牌。

如果设置 replenishRate=1,requestedTokens=60,burstCapacity=60,将导致每分钟只能处理 1 个请求(1 request/min)。因为一个请求消耗 60 个令牌,生成 60 个令牌需要 1 分钟。

KeyResolver 的 Java 配置:

@Bean
KeyResolver userKeyResolver() {
    //一个获取请求参数 user 的简单方法
    return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}

也可以定义一个实现 RateLimiter接口的限流器,并注册为 Bean。配置中,可引用使用了 SpEL 的 Bean 名。#{@RateLimiter} 是一个 SpEL 表达式,引用名为 myRateLimiter 的 Bean。

下面配置定义了一个使用上面定义的 keyrolver 的速率限流器:

配置如下:

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            - name: RequestRateLimiter
              args:
                rate-limiter: "#{@myRateLimiter}"
                key-resolver: "#{@userKeyResolver}"

1.12 RedirectTo GatewayFilter

输入两个参数:Status Code、URL,将在 Response 中把 URL 赋值给 Location 属性

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 配置成HTTP状态码, URL的形式
            - RedirectTo=302, http://www.hxmec.com

  • HTTP状态码应该是HTTP状态码300序列,例如301

  • URL必须是合法的URL,并且该值会作为名为 Location 的Header。

通过测试请求/provider/demo/hello会重定向到http://www.hxmec.com

1.13 RemoveRequestHeader GatewayFilter

移除请求头

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 移除名称为X-Request-Foo的请求头
            - RemoveRequestHeader=X-Request-Foo

通过请求http://localhost:9100/provider/demo/hello 测试如下

1.14 RemoveResponseHeader GatewayFilter

移除响应头

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 移除名称为X-Response-Bar响应头
            - RemoveResponseHeader=X-Response-Bar

通过请求http://localhost:9100/provider/demo/hello ,可以发现在服务中添加的响应头,已经被去除了

1.15 RemoveRequestParameter GatewayFilter

移除请求参数

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 移除请求名为name参数
            - RemoveRequestParameter=name

通过请求http://localhost:9100/provider/demo/hello?name=Trazen ,可以看到请求中的参数在后端服务中无法获取,在gateway中已经去除。

1.16 RewritePath GatewayFilter

重写路径

spring:
  cloud:
    gateway:
      routes:
      - id: rewritepath_route
        uri: https://hxmec.com
        predicates:
        - Path=/foo/**
        filters:
        # 配置成原始路径正则, 重写后的路径的正则
        - RewritePath=/foo/(?.*), /$\{segment}


如上配置,访问 /foo/bar 会将路径改为/bar 再转发,也就是会转发到 https://example.org/bar 。需要注意的是,由于YAML语法,需用$\ 替换 $。

1.17 RewriteLocationResponseHeader GatewayFilter

重写响应头中 Location 的值,通常是为了摆脱后端特定的细节,使用 stripVersionMode, locationHeaderName, hostValue 和 protocolsRegex 参数来接收值。

spring:
  cloud:
    gateway:
      routes:
      - id: rewritelocationresponseheader_route
        uri: http://hxmec.com
        filters:
        - RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,

如上所示,一个请求 POST api.anoyi.com/some/object/name, Response header Location 的值 prod.anoyi.com/v2/some/object/id 将被改为 api.anoyi.com/some/object/id

参数 stripVersionMode 可选值如下:

  • NEVER_STRIP:版本信息不会被剥离,即使原始请求路径不包含版本

  • AS_IN_REQUEST:仅当原始请求路径不包含任何版本时,才会剥离版本【默认】

  • ALWAYS_STRIP:即使原始请求路径包含版本,也会剥离版本
    参数 hostValue,如果提供,会替换 Response Header Location 值中的 host:port 部分;如果不提供,则会使用 Request 的 Host 作为默认值

参数 protocolRegex,协议会与该值匹配,如果不匹配,过滤器不回做任何操作,默认值 http|https|ftp|ftps

1.18 RewriteResponseHeader GatewayFilter

重写响应头,使用 name, regexp 和 replacement 参数接收值。使用 Java 正则表达式提供一种灵活的方式来重写响应头中的值。

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

示例中,一个头的值为 /42?user=ford&password=omg!what&flag=true,在发出下游请求后,将此头设置为 /42?user=ford&password=***&flag=true。注意使用 $\ 代表 $,这是 YAML 格式指定的。

1.19 SaveSession GatewayFilter

保存 Session,在向下游服务转发请求之前强制执行 WebSession::save操作

spring:
  cloud:
    gateway:
      routes:
      - id: save_session
        uri: http://www.hxmec.com
        predicates:
        - Path=/foo/**
        filters:
        - SaveSession

如果将 Spring Security 与 Spring Session 集成,并希望确保安全性详细信息已转发到远程进程,那么这一点至关重要。

1.20 SecureHeaders GatewayFilter

SecureHeaders会向响应添加多个头数据,主要是根据这篇博客的建议:Everything you need to know about HTTP security headers。
会添加下面这些头,括号中是默认值。

  • 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
    这些属性是与上面列出要添加的头是对应的,在 SecureHeadersProperties.java 安全头属性类文件中可以看到。
    要禁用默认值,设置spring.cloud.gateway.filter.secure-headers.disable属性,值使用逗号分隔符(,)。注意,值必须是安全标头(secure headers)的小写全名。如下所示:

spring.cloud.gateway.filter.secure-headers.disable=x-frame-options,strict-transport-security

1.21 SetPath GatewayFilter

输入一个参数:template,匹配 Spring Framework URI 路径模板并修改,允许多个匹配

spring:
  cloud:
    gateway:
      routes:
      - id: setpath_route
        uri: http://www.hxmec.com
        predicates:
        - Path=/foo/{segment}
        filters:
        - SetPath=/{segment}

如上所示,请求 /foo/bar 会被设置为 /bar 到下游

1.22 SetRequestHeader GatewayFilter

SetRequestHeader重置请求头的值,使用 name 和 value 参数接收值

spring:
  cloud:
    gateway:
      routes:
      - id: setrequestheader_route
        uri: https://www.hxmec.com
        filters:
        - SetRequestHeader=X-Request-Foo, Bar

与 AddRequestHeader GatewayFilter Factory 不同的是,这是替换 Header 而不是添加

1.23 SetResponseHeader GatewayFilter

重置响应头中的值,使用 name 和 value参数接收值

spring:
  cloud:
    gateway:
      routes:
      - id: setresponseheader_route
        uri: http://www.google.com
        filters:
        - SetResponseHeader=X-Response-Foo, Bar

对于上面的例子,如果下游的返回带有头信息为X-Response-Foo:1234 ,则会gateway会替换为X-Response-Foo:Bar ,在返回给客户端。

1.24 SetStatus GatewayFilter

设置响应头的 HTTP 编码,使用单个参数 status 接收。值必须是一个有效的 HttpStatus

spring:
  cloud:
    gateway:
      routes:
      - id: setstatusstring_route
        uri: http://www.hxmec.com
        filters:
        - SetStatus=BAD_REQUEST
      - id: setstatusint_route
        uri: http://www.hxmec.com
        filters:
        - SetStatus=401

此示例,设置响应的 HTTP status 为 401。

可以配置 SetStatus GatewayFilter,以在响应的头中从代理请求返回原始 HTTP 状态代码。如果配置了以下属性,则会将头添加到响应中:

spring:
  cloud:
    gateway:
      set-status:
        original-status-header-name: original-http-status


1.25 StripPrefix GatewayFilter

通过配置parts来表示截断路径前缀的数量

spring:
  cloud:
    gateway:
      routes:
      - id: nameRoot
        uri: http://hxmec.com
        predicates:
        - Path=/name/**
        filters:
        - StripPrefix=2

如上面例子中,如果请求的路径为/name/bar/foo,则路径会修改为/foo,即将路径的两个前缀去掉了。

1.26 Retry GatewayFilter

该过滤器用于重试请求,支持如下参数的配置:
retries: 重试的次数

  • statuses: 应被重试的 HTTP Status Codes,参考 org.springframework.http.HttpStatus

  • methods: 应被重试的 HTTP Methods,参考org.springframework.http.HttpMethod

  • series: 应被重试的 Status Codes 系列,参考 org.springframework.http.HttpStatus.Series

  • exceptions: 应被重试的异常列表

  • backoff: 为重试配置指数级的 backoff。重试时间间隔的计算公式为 firstBackoff * (factor ^ n),n 是重试的次数;如果设置了 maxBackoff,最大的 backoff 限制为 maxBackoff. 如果 basedOnPreviousValue 设置为 true, backoff 计算公式为 prevBackoff * factor.
    如果 Retry filter 启用,默认配置如下:

  • retries — 3 times

  • series — 5XX series

  • methods — GET method

  • exceptions — IOException and TimeoutException

  • backoff — disabled

以下是 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

上面例子,当下游服务返回502状态码时,gateway会重试3次。

注意:当将重试过滤器与带有forward:前缀的 URL 一起使用时,应仔细编写目标端点,以便在发生错误的情况下,它不会做任何可能导致响应发送到客户端并提交的操作。例如,如果目标端点是带注释的控制器,则目标控制器方法不应返回带有错误状态代码的 ResponseEntity。相反,它应该引发 Exception 或发出错误信号(例如,通过Mono.error(ex)返回值),可以配置重试过滤器来进行重试处理。

警告:当将重试过滤器与任何带有 body 的 HTTP方法一起使用时,body 将被缓存,并且网关将受到内存的限制。body 将缓存在 ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR定义的请求属性中,对象的类型是org.springframework.core.io.buffer.DataBuffer。

1.27 RequestSize GatewayFilter

当请求大小大于限制时,RequestSize 网关过滤器工厂可以限制请求到达下游服务。
过滤器使用maxSize参数。maxSize 是一个 DataSize类型,因此值(value)可以定义为数字,后跟可选的DataUnit 后缀,例如 KB 或 MB。默认是 B代表字节。它是请求的允许大小限制,以字节为单位。配置如下所示:

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。

1.28 SetRequestHost GatewayFilter

用指定的值替换现有的host header

pring:
  cloud:
    gateway:
      routes:
      - id: set_request_host_header_route
        uri: http://localhost:8080/headers
        predicates:
        - Path=/headers
        filters:
        - name: SetRequestHost
          args:
            host: hxmec.com

SetRequestHost GatewayFilter 工厂用 hxmec.com 替换主机头的值

1.29 ModifyRequestBody GatewayFilter

修改请求主体,然后将其由网关向下游发送。
只能使用 Java DSL 来配置此过滤器。如下示例:

@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;
    }
}

1.30 ModifyResponseBody GatewayFilter

在响应发送会客户端之前,对响应体进行修改。同样也只支持Java配置

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

1.31 Default Filters

如果想添加一个过滤器去应用在所有的路由上,可以使用 spring.cloud.gateway.default-filters 来配置,这个属性接收一个Filter列表。

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

2.参考文档

  • 【官方文档】https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/#the-weight-route-predicate-factory



版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

本文链接:

https://blog.csdn.net/tuyong1972873004/article/details/107123254/






感谢点赞支持下哈 

浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报