Spring Cloud Gateway高级特性之过滤器(Hoxton版本) 水深无声 2023-02-22 13:59 1阅读 0赞 # 1.高级特性—过滤器(Filter) # 路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生,下面将对各个过滤器进行一一说明 Spring Cloud Gateway 内置的过滤器工厂一览表如下: ![format_png][] # 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头 ![format_png 1][] # 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 ![format_png 2][] ## 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中带有配置的值。 ![format_png 3][] ## 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: true, true 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的相关依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> 然后添加相关服务降级的处理类: @RestController public class FallbackController { @GetMapping("/fallback") public Object fallback() { Map<String,Object> 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 。可以看到已经返回服务降级后的处理信息。 ![format_png 4][] ## 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。 ![format_png 5][] ![format_png 6][] ## 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<String> 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 ![format_png 7][] ## 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 测试如下 ![format_png 8][] ![format_png 9][] ## 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 ,可以发现在服务中添加的响应头,已经被去除了 ![format_png 10][] ![format_png 11][] ## 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中已经去除。 ![format_png 12][] ![format_png 13][] ## 1.16 RewritePath GatewayFilter ## > 重写路径 spring: cloud: gateway: routes: - id: rewritepath_route uri: https://hxmec.com predicates: - Path=/foo/** filters: # 配置成原始路径正则, 重写后的路径的正则 - RewritePath=/foo/(?<segment>.*), /$\{ 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 [format_png]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi8wNzY2Yzk5ZmNhMDZkMjMxNWNjODI4MTU4ZjRiMDgwMg?x-oss-process=image/format,png [format_png 1]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi8yN2ExNTA4NjVkNzRhMTZjODVjYjNiNTEwNjI5NmFmMw?x-oss-process=image/format,png [format_png 2]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi82Y2U3NjliYmU4MjMwOWYxYjY4ODg1MGMwNDMxZGQ5OQ?x-oss-process=image/format,png [format_png 3]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi9jZGM5MGIyZTc2MjVlOTZmNzNlMmQ0Zjk1NWUzZmMxNw?x-oss-process=image/format,png [format_png 4]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi8wYzhlMzU1NTE0OTA3YzU2NDFkOTVmMzc3NmE4ODEyYw?x-oss-process=image/format,png [format_png 5]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi8yNDI2YTcxMmNhNmI1NjlmZDY2MTVhYTU5YmI4ZWZkYw?x-oss-process=image/format,png [format_png 6]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi9lMTRmNjZmZWIyMWNjZGFiMzJlYzA3YTQ1ZGJiNTU1ZA?x-oss-process=image/format,png [format_png 7]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi80ZGE5MzU5YjkwMzA0MDBmY2Y5MDgyNmMwNzg3NDBmZg?x-oss-process=image/format,png [format_png 8]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi9lMjkxYmIzYWQ0MmEzOWJhMDZmZGZkMmJhNzRhY2E2OA?x-oss-process=image/format,png [format_png 9]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi9kNzM0YzEyNTY0YjlkMmQyNDY4YjBiNTY0ZDJiYzYyOA?x-oss-process=image/format,png [format_png 10]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi80OGFjZWFiZjVkM2YxMWFlOWY5NDMyNWFmNDY3MjFjNA?x-oss-process=image/format,png [format_png 11]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi9iNDI1MTIxYWUwYjcyOGI0OTRlMDAxNTM2MWMwNTQ1NQ?x-oss-process=image/format,png [format_png 12]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi9mNjlmOWE3YTU0NmFmNDY4MzM5MWZmYzhiMmRjZDYyNg?x-oss-process=image/format,png [format_png 13]: https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuc2hvd2RvYy5jYy9zZXJ2ZXIvYXBpL2NvbW1vbi92aXNpdGZpbGUvc2lnbi85MjZiYTBlYWM3MDMyMWRlZTAwNTkxMTE3NDk1NjE5YQ?x-oss-process=image/format,png
还没有评论,来说两句吧...