百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Spring Cloud Gateway 2.1.0 中文官网文档

ztj100 2024-10-29 18:18 17 浏览 0 评论

Spring Cloud Gateway 2.1.0 中文官网文档

目录

1. How to Include Spring Cloud Gateway
2. Glossary
3. How It Works
4. Route Predicate Factories
5. GatewayFilter Factories
6. Global Filters
7. TLS / SSL
8. Configuration
9. Reactor Netty Access Logs
10. CORS Configuration
11. Actuator API
12. Developer Guide

该项目提供了一个建立在Spring Ecosystem之上的API网关,包括:Spring 5,Spring Boot 2和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的方式来对API进行路由,并为他们提供切面,例如:安全性,监控/指标 和弹性等。

1. 如何在工程中引用Spring Cloud Gateway

要在项目中引入Spring Cloud Gateway,需要引用 group org.springframework.cloud 和 artifact id为spring-cloud-starter-gateway starter。最新的Spring Cloud Release 构建信息,请参阅Spring Cloud Project page。

如果应用了该starter,但由于某种原因不希望启用网关,请进行设置spring.cloud.gateway.enabled=false。

重要

Spring Cloud Gateway依赖Spring Boot和Spring Webflux提供的Netty runtime。它不能在传统的Servlet容器中工作或构建为WAR

2. 词汇表

  • Route 路由:gateway的基本构建模块。它由ID、目标URI、断言集合和过滤器集合组成。如果聚合断言结果为真,则匹配到该路由。
  • Predicate 断言:这是一个Java 8 Function Predicate。输入类型是 Spring Framework ServerWebExchange。这允许开发人员可以匹配来自HTTP请求的任何内容,例如Header或参数。
  • Filter 过滤器:这些是使用特定工厂构建的 Spring FrameworkGatewayFilter实例。所以可以在返回请求之前或之后修改请求和响应的内容。

3. 如何工作的



客户端向Spring Cloud Gateway发出请求。如果Gateway Handler Mapping确定请求与路由匹配,则将其发送到Gateway Web Handler。此handler通过特定于该请求的过滤器链处理请求。图中filters被虚线划分的原因是filters可以在发送代理请求之前或之后执行逻辑。先执行所有“pre filter”逻辑,然后进行请求代理。在请求代理执行完后,执行“post filter”逻辑。

注意

HTTP和HTTPS URI默认端口设置是80和443。

4. 路由断言Factories

Spring Cloud Gateway将路由作为Spring WebFlux HandlerMapping基础结构的一部分进行匹配。Spring Cloud Gateway包含许多内置的路由断言Factories。这些断言都匹配HTTP请求的不同属性。多个路由断言Factories可以通过 and 组合使用。

4.1 After 路由断言 Factory

After Route Predicate Factory采用一个参数——日期时间。在该日期时间之后发生的请求都将被匹配。

application.yml

spring:
 cloud:
 gateway:
 routes:
 - id: after_route
 uri: http://example.org
 predicates:
 - After=2017-01-20T17:42:47.789-07:00[America/Denver]

4.2 Before 路由断言 Factory

Before Route Predicate Factory采用一个参数——日期时间。在该日期时间之前发生的请求都将被匹配。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: before_route
 uri: http://example.org
 predicates:
 - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

4.3 Between 路由断言 Factory

Between 路由断言 Factory有两个参数,datetime1和datetime2。在datetime1和datetime2之间的请求将被匹配。datetime2参数的实际时间必须在datetime1之后。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: between_route
 uri: http://example.org
 predicates:
 - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

4.4 Cookie 路由断言 Factory

Cookie 路由断言 Factory有两个参数,cookie名称和正则表达式。请求包含次cookie名称且正则表达式为真的将会被匹配。

application.yml

spring:
 cloud:
 gateway:
 routes:
 - id: cookie_route
 uri: http://example.org
 predicates:
 - Cookie=chocolate, ch.p

4.5 Header 路由断言 Factory

Header 路由断言 Factory有两个参数,header名称和正则表达式。请求包含次header名称且正则表达式为真的将会被匹配。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: header_route
 uri: http://example.org
 predicates:
 - Header=X-Request-Id, \d+

4.6 Host 路由断言 Factory

Host 路由断言 Factory包括一个参数:host name列表。使用Ant路径匹配规则,.作为分隔符。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: host_route
 uri: http://example.org
 predicates:
 - Host=**.somehost.org,**.anotherhost.org

4.7 Method 路由断言 Factory

Method 路由断言 Factory只包含一个参数: 需要匹配的HTTP请求方式

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: method_route
 uri: http://example.org
 predicates:
 - Method=GET

所有GET请求都将被路由

4.8 Path 路由断言 Factory

Path 路由断言 Factory 有2个参数: 一个Spring PathMatcher表达式列表和可选matchOptionalTrailingSeparator标识 .

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: host_route
 uri: http://example.org
 predicates:
 - Path=/foo/{segment},/bar/{segment}

例如: /foo/1 or /foo/bar or /bar/baz的请求都将被匹配

URI 模板变量 (如上例中的 segment ) 将以Map的方式保存于ServerWebExchange.getAttributes() key为ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE. 这些值将在GatewayFilter Factories使用

可以使用以下方法来更方便地访问这些变量。

Map<String, String> uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange);
String segment = uriVariables.get("segment");

4.9 Query 路由断言 Factory

Query 路由断言 Factory 有2个参数: 必选项 param 和可选项 regexp.

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: query_route
 uri: http://example.org
 predicates:
 - Query=baz

则包含了请求参数 baz的都将被匹配。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: query_route
 uri: http://example.org
 predicates:
 - Query=foo, ba.

如果请求参数里包含foo参数,并且值匹配为ba. 表达式,则将会被路由,如:bar and baz

4.10 RemoteAddr 路由断言 Factory

RemoteAddr 路由断言 Factory的参数为 一个CIDR符号(IPv4或IPv6)字符串的列表,最小值为1,例如192.168.0.1/16(其中192.168.0.1是IP地址并且16是子网掩码)。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: remoteaddr_route
 uri: http://example.org
 predicates:
 - RemoteAddr=192.168.1.1/24

如果请求的remote address 为 192.168.1.10则将被路由

4.10.1 修改远程地址的解析方式

默认情况下,RemoteAddr 路由断言 Factory使用传入请求中的remote address。如果Spring Cloud Gateway位于代理层后面,则可能与实际客户端IP地址不匹配。

可以通过设置自定义RemoteAddressResolver来自定义解析远程地址的方式。Spring Cloud Gateway网关附带一个非默认远程地址解析程序,它基于X-Forwarded-For header, XForwardedRemoteAddressResolver.

XForwardedRemoteAddressResolver 有两个静态构造函数方法,采用不同的安全方法:

  1. XForwardedRemoteAddressResolver::TrustAll返回一个RemoteAddressResolver,它始终采用X-Forwarded-for头中找到的第一个IP地址。这种方法容易受到欺骗,因为恶意客户端可能会为解析程序接受的“x-forwarded-for”设置初始值。
  2. XForwardedRemoteAddressResolver::MaxTrustedIndex获取一个索引,该索引与在Spring Cloud网关前运行的受信任基础设施数量相关。例如,如果SpringCloudGateway只能通过haproxy访问,则应使用值1。如果在访问Spring Cloud Gateway之前需要两个受信任的基础架构跃点,那么应该使用2。

给定以下的header值:

X-Forwarded-For: 0.0.0.1, 0.0.0.2, 0.0.0.3

下面的` maxTrustedIndex值将生成以下远程地址:



Java 配置方式:

GatewayConfig.java

RemoteAddressResolver resolver = XForwardedRemoteAddressResolver
 .maxTrustedIndex(1);
...
.route("direct-route",
 r -> r.remoteAddr("10.1.1.1", "10.10.1.1/24")
 .uri("https://downstream1")
.route("proxied-route",
 r -> r.remoteAddr(resolver, "10.10.1.1", "10.10.1.1/24")
 .uri("https://downstream2")
)

5. GatewayFilter Factories

过滤器允许以某种方式修改传入的HTTP请求或返回的HTTP响应。过滤器的作用域是某些特定路由。Spring Cloud Gateway包括许多内置的 Filter工厂。

注意:有关如何使用以下任何过滤器的更详细示例,请查看unit tests.。

5.1 AddRequestHeader GatewayFilter Factory

采用一对名称和值作为参数

application.yml.

spring:

cloud:

gateway:

routes:

- id: add_request_header_route

uri: http://example.org

filters:

- AddRequestHeader=X-Request-Foo, Bar

对于所有匹配的请求,这将向下游请求的头中添加 x-request-foo:bar header

5.2 AddRequestParameter GatewayFilter Factory

采用一对名称和值作为参数

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: add_request_parameter_route
 uri: http://example.org
 filters:
 - AddRequestParameter=foo, bar

对于所有匹配的请求,这将向下游请求添加foo=bar查询字符串

5.3 AddResponseHeader GatewayFilter Factory

采用一对名称和值作为参数

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: add_request_header_route
 uri: http://example.org
 filters:
 - AddResponseHeader=X-Response-Foo, Bar

对于所有匹配的请求,这会将x-response-foo:bar头添加到下游响应的header中

5.4 Hystrix GatewayFilter Factory

Hystrix 是Netflix开源的断路器组件。Hystrix GatewayFilter允许你向网关路由引入断路器,保护你的服务不受级联故障的影响,并允许你在下游故障时提供fallback响应。

要在项目中启用Hystrix网关过滤器,需要添加对 spring-cloud-starter-netflix-hystrix的依赖 Spring Cloud Netflix.

Hystrix GatewayFilter Factory 需要一个name参数,即HystrixCommand的名称。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: hystrix_route
 uri: http://example.org
 filters:
 - Hystrix=myCommandName

这将剩余的过滤器包装在命令名为“myCommandName”的HystrixCommand中。

hystrix过滤器还可以接受可选的fallbackUri 参数。目前,仅支持forward: 预设的URI,如果调用fallback,则请求将转发到与URI匹配的控制器。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: hystrix_route
 uri: lb://backing-service:8088
 predicates:
 - Path=/consumingserviceendpoint
 filters:
 - name: Hystrix
 args:
 name: fallbackcmd
 fallbackUri: forward:/incaseoffailureusethis
 - RewritePath=/consumingserviceendpoint, /backingserviceendpoint

当调用hystrix fallback时,这将转发到/incaseoffailureusethis uri。注意,这个示例还演示了(可选)通过目标URI上的'lb`前缀,使用Spring Cloud Netflix Ribbon 客户端负载均衡。

主要场景是使用fallbackUri 到网关应用程序中的内部控制器或处理程序。但是,也可以将请求重新路由到外部应用程序中的控制器或处理程序,如:

application.yml.

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

在本例中,gateway应用程序中没有 fallback 实现,但是另一个应用程序中有一个接口实现,注册为“http://localhost:9994”。

在将请求转发到fallback的情况下,Hystrix Gateway过滤还支持直接抛出Throwable 。它被作为ServerWebExchangeUtils.HYSTRIX_EXECUTION_EXCEPTION_ATTR属性添加到ServerWebExchange中,可以在处理网关应用程序中的fallback时使用。

对于外部控制器/处理程序方案,可以添加带有异常详细信息的header。可以在 FallbackHeaders GatewayFilter Factory section.中找到有关它的更多信息。

hystrix配置参数(如 timeouts)可以使用全局默认值配置,也可以使用Hystrix wiki中所述属性进行配置。

要为上面的示例路由设置5秒超时,将使用以下配置:

application.yml.

hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds: 5000

5.5 FallbackHeaders GatewayFilter Factory

FallbackHeaders允许在转发到外部应用程序中的FallbackUri的请求的header中添加Hystrix异常详细信息,如下所示:

application.yml.

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

在本例中,在运行HystrixCommand发生执行异常后,请求将被转发到 localhost:9994应用程序中的 fallback终端或程序。异常类型、消息(如果可用)cause exception类型和消息的头,将由FallbackHeaders filter添加到该请求中。

通过设置下面列出的参数值及其默认值,可以在配置中覆盖headers的名称:

  • executionExceptionTypeHeaderName ("Execution-Exception-Type")
  • executionExceptionMessageHeaderName ("Execution-Exception-Message")
  • rootCauseExceptionTypeHeaderName ("Root-Cause-Exception-Type")
  • rootCauseExceptionMessageHeaderName ("Root-Cause-Exception-Message")

Hystrix 如何实现的更多细节可以参考 Hystrix GatewayFilter Factory section.

5.6 PrefixPath GatewayFilter Factory

PrefixPath GatewayFilter 只有一个 prefix 参数.

application.yml.

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

这将给所有匹配请求的路径加前缀/mypath。因此,向/hello发送的请求将发送到/mypath/hello。

5.7 PreserveHostHeader GatewayFilter Factory

该filter没有参数。设置了该Filter后,GatewayFilter将不使用由HTTP客户端确定的host header ,而是发送原始host header 。

application.yml.

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

5.8 RequestRateLimiter GatewayFilter Factory

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

这个过滤器可以配置一个可选的keyResolver 参数和rate limiter参数(见下文)。

keyResolver 是 KeyResolver 接口的实现类.在配置中,按名称使用SpEL引用bean。#{@myKeyResolver} 是引用名为'myKeyResolver'的bean的SpEL表达式。

KeyResolver.java.

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

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

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

默认情况下,如果KeyResolver 没有获取到key,请求将被拒绝。此行为可以使用 spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key (true or false) 和 spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code属性进行调整。

说明

无法通过"shortcut" 配置RequestRateLimiter。以下示例无效

application.properties.

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

5.8.1 Redis RateLimiter

Redis的实现基于 Stripe实现。它需要使用 spring-boot-starter-data-redis-reactive Spring Boot starter。

使用的算法是Token Bucket Algorithm.。

redis-rate-limiter.replenishRate是你允许用户每秒执行多少请求,而丢弃任何请求。这是令牌桶的填充速率。

``redis-rate-limiter.burstCapacity`是允许用户在一秒钟内执行的最大请求数。这是令牌桶可以保存的令牌数。将此值设置为零将阻止所有请求。

稳定速率是通过在replenishRate 和 burstCapacity中设置相同的值来实现的。可通过设置burstCapacity高于replenishRate来允许临时突发流浪。在这种情况下,限流器需要在两次突发之间留出一段时间(根据replenishRate),因为连续两次突发将导致请求丢失 (HTTP 429 - Too Many Requests).。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: requestratelimiter_route
 uri: http://example.org
 filters:
 - name: RequestRateLimiter
 args:
 redis-rate-limiter.replenishRate: 10
 redis-rate-limiter.burstCapacity: 20

Config.java.

@Bean
KeyResolver userKeyResolver() {
 return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}

这定义了每个用户10个请求的限制。允许20个突发,但下一秒只有10个请求可用。KeyResolver是一个简单的获取user请求参数的工具(注意:不建议用于生产)。

限流器也可以定义为RateLimiter接口的实现 bean。在配置中,按名称使用SpEL引用bean。#{@myRateLimiter}是引用名为'myRateLimiter'的bean的SpEL表达式。

application.yml.

spring:

cloud:

gateway:

routes:

- id: requestratelimiter_route

uri: http://example.org

filters:

- name: RequestRateLimiter

args:

rate-limiter: "#{@myRateLimiter}"

key-resolver: "#{@userKeyResolver}"

5.9 RedirectTo GatewayFilter Factory

该过滤器有一个 status 和一个 url参数。status是300类重定向HTTP代码,如301。该URL应为有效的URL,这将是 Location header的值。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: prefixpath_route
 uri: http://example.org
 filters:
 - RedirectTo=302, http://acme.org

这将发送一个302状态码和一个Location:http://acme.org header来执行重定向。

5.10 RemoveNonProxyHeaders GatewayFilter Factory

RemoveNonProxyHeaders GatewayFilter Factory 从转发请求中删除headers。删除的默认头列表来自 IETF.

The default removed headers are:

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • TE
  • Trailer
  • Transfer-Encoding
  • Upgrade
  • 要更改此设置,请将 spring.cloud.gateway.filter.remove-non-proxy-headers.headers属性设置为要删除的header名称。

5.11 RemoveRequestHeader GatewayFilter Factory

有一个name参数. 这是要删除的header的名称。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: removerequestheader_route
 uri: http://example.org
 filters:
 - RemoveRequestHeader=X-Request-Foo

这将在X-Request-Foo header被发送到下游之前删除它。

5.12 RemoveResponseHeader GatewayFilter Factory

有一个name参数. 这是要删除的header的名称。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: removeresponseheader_route
 uri: http://example.org
 filters:
 - RemoveResponseHeader=X-Response-Foo

这将在返回到网关client之前从响应中删除x-response-foo头。

5.13 RewritePath GatewayFilter Factory

包含一个 regexp正则表达式参数和一个 replacement 参数. 通过使用Java正则表达式灵活地重写请求路径。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: rewritepath_route
 uri: http://example.org
 predicates:
 - Path=/foo/**
 filters:
 - RewritePath=/foo/(?<segment>.*), /$\{segment}

对于请求路径/foo/bar,将在发出下游请求之前将路径设置为/bar。注意,由于YAML规范,请使用 $\替换 $。

5.14 RewriteResponseHeader GatewayFilter Factory

包含 name, regexp和 replacement 参数.。通过使用Java正则表达式灵活地重写响应头的值。

application.yml.

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

对于一个/42?user=ford&password=omg!what&flag=true的header值,在做下游请求时将被设置为/42?user=ford&password=***&flag=true,由于YAML规范,请使用 $\替换 $。

5.15 SaveSession GatewayFilter Factory

SaveSession GatewayFilter Factory将调用转发到下游之强制执行WebSession::save 操作。这在使用 Spring Session 之类时特别有用,需要确保会话状态在进行转发调用之前已保存。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: save_session
 uri: http://example.org
 predicates:
 - Path=/foo/**
 filters:
 - SaveSession

如果你希望要将[Spring Security](https://projects.spring.io/Spring Security/)与Spring Session集成,并确保安全详细信息已转发到远程的进程,这一点至关重要。

5.16 SecureHeaders GatewayFilter Factory

SecureHeaders GatewayFilter Factory 将许多headers添加到reccomedation处的响应中,从this blog post.

添加以下标题(使用默认值分配):

  • 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 命名空间中设置相应的属性:

Property to change:

  • xss-protection-header
  • strict-transport-security
  • frame-options
  • content-type-options
  • referrer-policy
  • content-security-policy
  • download-options
  • permitted-cross-domain-policies

5.17 SetPath GatewayFilter Factory

SetPath GatewayFilter Factory 采用 template路径参数。它提供了一种通过允许路径的模板化segments来操作请求路径的简单方法。使用Spring Framework中的URI模板,允许多个匹配segments。

application.yml.

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

对于一个 /foo/bar请求,在做下游请求前,路径将被设置为/bar

5.18 SetResponseHeader GatewayFilter Factory

SetResponseHeader GatewayFilter Factory 包括 name 和 value 参数.

application.yml.

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

此GatewayFilter使用给定的名称替换所有header,而不是添加。因此,如果下游服务器响应为X-Response-Foo:1234,则会将其替换为X-Response-Foo:Bar,这是网关客户端将接收的内容。

5.19 SetStatus GatewayFilter Factory

SetStatus GatewayFilter Factory 包括唯一的 status参数.必须是一个可用的Spring HttpStatus。它可以是整数值404或字符串枚举NOT_FOUND。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: setstatusstring_route
 uri: http://example.org
 filters:
 - SetStatus=BAD_REQUEST
 - id: setstatusint_route
 uri: http://example.org
 filters:
 - SetStatus=401

在这个例子中,HTTP返回码将设置为401.

5.20 StripPrefix GatewayFilter Factory

StripPrefix GatewayFilter Factory 包括一个parts参数。 parts参数指示在将请求发送到下游之前,要从请求中去除的路径中的节数。

application.yml.

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

当通过网关发出/name/bar/foo请求时,向nameservice发出的请求将是http://nameservice/foo。

5.21 Retry GatewayFilter Factory

Retry GatewayFilter Factory包括 retries, statuses, methods和 series 参数.

  • retries: 应尝试的重试次数
  • statuses: 应该重试的HTTP状态代码,用org.springframework.http.HttpStatus标识
  • methods: 应该重试的HTTP方法,用 org.springframework.http.HttpMethod标识
  • series: 要重试的一系列状态码,用 org.springframework.http.HttpStatus.Series标识

application.yml.

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

注意

retry filter 不支持body请求的重试,如通过body的POST 或 PUT请求

注意

在使用带有前缀为 forward: 的retry filter时,应仔细编写目标端点,以便在出现错误时不会执行任何可能导致将响应发送到客户端并提交的操作。例如,如果目标端点是带注解的controller,则目标controller方法不应返回带有错误状态代码的ResponseEntity。相反,它应该抛出一个Exception,或者发出一个错误信号,例如通过Mono.error(ex) 返回值,重试过滤器可以配置为通过重试来处理。

5.22 RequestSize GatewayFilter Factory

当请求大小大于允许的限制时,RequestSize GatewayFilter Factory可以限制请求不到达下游服务。过滤器以RequestSize作为参数,这是定义请求的允许大小限制(以字节为单位)。

application.yml.

spring:
 cloud:
 gateway:
 routes:
 - id: request_size_route
 uri: http://localhost:8080/upload
 predicates:
 - Path=/upload
 filters:
 - name: RequestSize
 args:
 maxSize: 5000000

当请求因大小而被拒绝时, RequestSize GatewayFilter Factory 将响应状态设置为413 Payload Too Large,并带有额外的header errorMessage 。下面是一个 errorMessage的例子。

errorMessage : Request size is larger than permissible limit. Request size is 6.0 MB where permissible limit is 5.0 MB

注意

如果未在路由定义中作为filter参数提供,则默认请求大小将设置为5 MB。

5.23 Modify Request Body GatewayFilter Factory

这个过滤器被定义为beta版本,将来API可能会改变。

此过滤器可用于在请求主体被网关发送到下游之前对其进行修改。

注意

只能使用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;
 }
}

5.24 Modify Response Body GatewayFilter Factory

这个过滤器被定义为beta版本,将来API可能会改变。

此过滤器可用于在将响应正文发送回客户端之前对其进行修改。

注意

只能使用Java DSL配置此过滤器

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

完整文章请见:https://www.jianshu.com/p/6ff196940b67


欢迎关注 高广超的简书博客 与 收藏文章 !

欢迎关注 头条号:互联网技术栈

个人介绍:

高广超:多年一线互联网研发与架构设计经验,擅长设计与落地高可用、高性能、可扩展的互联网架构。目前从事大数据相关研发与架构工作。

本文首发在 高广超的简书博客 转载请注明!

相关推荐

从IDEA开始,迈进GO语言之门(idea got)

前言笔者在学习GO语言编程的时候,GO语言在国内还没有像JAVA/Php/Python那样普及,绕了不少的弯路,要开始入门学习一门编程语言,最好就先从选择一个好的编程语言的开发环境开始,有了这个开发环...

基于SpringBoot+MyBatis的私人影院java网上购票jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于SpringBoot...

基于springboot的个人服装管理系统java网上商城jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...

基于springboot的美食网站Java食品销售jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...

贸易管理进销存springboot云管货管账分析java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目描述贸易管理进销存spring...

SpringBoot+VUE员工信息管理系统Java人员管理jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍SpringBoot+V...

目前见过最牛的一个SpringBoot商城项目(附源码)还有人没用过吗

帮粉丝找了一个基于SpringBoot的天猫商城项目,快速部署运行,所用技术:MySQL,Druid,Log4j2,Maven,Echarts,Bootstrap...免费给大家分享出来前台演示...

SpringBoot+Mysql实现的手机商城附带源码演示导入视频

今天为大家带来的是基于SpringBoot+JPA+Thymeleaf框架的手机商城管理系统,商城系统分为前台和后台、前台用的是Bootstrap框架后台用的是SpringBoot+JPA都是现在主...

全网首发!马士兵内部共享—1658页《Java面试突击核心讲》

又是一年一度的“金九银十”秋招大热门,为助力广大程序员朋友“面试造火箭”,小编今天给大家分享的便是这份马士兵内部的面试神技——1658页《Java面试突击核心讲》!...

SpringBoot数据库操作的应用(springboot与数据库交互)

1.JDBC+HikariDataSource...

SpringBoot 整合 Flink 实时同步 MySQL

1、需求在Flink发布SpringBoot打包的jar包能够实时同步MySQL表,做到原表进行新增、修改、删除的时候目标表都能对应同步。...

SpringBoot + Mybatis + Shiro + mysql + redis智能平台源码分享

后端技术栈基于SpringBoot+Mybatis+Shiro+mysql+redis构建的智慧云智能教育平台基于数据驱动视图的理念封装element-ui,即使没有vue的使...

Springboot+Mysql舞蹈课程在线预约系统源码附带视频运行教程

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的Springboot+Mysql舞蹈课程在线预约系统,系统项目源代码在【猿来入此】获取!https://www.yuan...

SpringBoot+Mysql在线众筹系统源码+讲解视频+开发文档(参考论文

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的在线众筹管理系统,主要实现了普通用户在线参与众筹基本操作流程的全部功能,系统分普通用户、超级管理员等角色,除基础脚手架外...

Docker一键部署 SpringBoot 应用的方法,贼快贼好用

这两天发现个Gradle插件,支持一键打包、推送Docker镜像。今天我们来讲讲这个插件,希望对大家有所帮助!GradleDockerPlugin简介...

取消回复欢迎 发表评论: