Spring Cloud Gateway中文文档一到五章(3.1.0)

Spring Cloud Gateway

3.1.0
本项目提供了一个基于Spring 5Spring Boot 2 Project Reactor的 Spring 生态系统之上的 API 网关。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 2.x、Spring WebFlux和Project Reactor之上。因此,当您使用 Spring Cloud Gateway 时,您所知道的许多熟悉的同步库(例如 Spring Data 和 Spring Security)和模式可能并不适用。如果您不熟悉这些项目,我们建议您在使用 Spring Cloud Gateway 之前先阅读他们的文档以熟悉一些新概念。

Spring Cloud Gateway 需要 Spring Boot 和 Spring Webflux 提供的 Netty 运行环境。但作为 Servlet 容器或构建为 WAR 时不工作。

2. 词汇表

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

3.它是如何工作的

下图提供了 Spring Cloud Gateway 如何工作的示意图:
在这里插入图片描述
客户端向 Spring Cloud Gateway 发出请求。如果网关处理程序(Gateway Handler Mapping)确定请求与路由匹配,则将其发送到网关 Web 处理程序(Gateway Handler Mapping)。此处理程序通过特定于请求的过滤器链来处理请求。过滤器用虚线划分的原因是过滤器可以在发送代理请求之前和之后运行逻辑。执行所有“pre”过滤器逻辑。然后发出代理请求。发出代理请求后,将运行“post”过滤器逻辑。

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

4. 配置路由断言工厂(Route Predicate Factories)和网关过滤工厂(Gateway Filter Factories)

有两种配置断言和过滤器的方法:快捷方式和完全扩展的参数。下面的大多数示例都使用快捷方式。
名称和参数名称将code在每个部分的第一句或第二句中列出。参数通常按快捷方式配置所需的顺序列出。

4.1.快捷方式配置

快捷方式配置由过滤器名称识别,后跟等号 ( =),后跟以逗号 ( ,) 分隔的参数值。

application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

前面的示例Cookie使用两个参数定义了路由谓词工厂,cookie 名称mycookie和要匹配的值mycookievalue。

4.2. 完全扩展参数的配置

完全扩展的参数看起来更像是带有名称/值对的标准 yaml 配置。通常,会有一个name关键字和一个args关键字。键是用于配置断言或过滤器的args键值对映射。

application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue

这个是上例cookie断言的完全扩展参数的配置。

5.路由断言工厂

Spring Cloud Gateway 将路由匹配为 Spring WebFluxHandlerMapping基础架构的一部分。Spring Cloud Gateway 包含许多内置的路由断言工厂。所有这些断言都匹配 HTTP 请求的不同属性。您可以将多个路由断言工厂通过and组合起来使用。

5.1.After 路由断言工厂

After 路由断言工厂采用一个参数 -日期时间(datetime) 。此断言匹配在指定日期时间之后发生的请求。以下示例配置了一个 after 路由断言:

示例 1.application.yml

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

此route匹配 2017 年 1 月 20 日 17:42 Mountain Time(丹佛)之后提出的任何请求。

5.2. Before 路由断言工厂

Before 路由断言工厂采用一个参数 -日期时间(datetime) 。此断言匹配在指定的 之前发生的请求datetime。以下示例配置了一个 before 路由断言:

示例 2.application.yml

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

此Route与 2017 年 1 月 20 日 17:42 Mountain Time (Denver) 之前提出的任何请求相匹配。

5.3. Between 路由断言工厂

Between 路由断言工厂有两个参数,它们datetime1是datetime2 。此断言匹配发生在 datetime1之后和datetime2之前 的请求。datetime2参数必须在datetime1之后。以下示例配置了一个 between 路由断言:

示例 3.application.yml

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

5.4. Cookie 路由断言工厂

Cookie 路由断言工厂有两个参数,cookie和Java 正则表达式。此断言匹配具有给定名称且其值与正则表达式匹配的 cookie。以下示例配置 cookie 路由断言:

示例 4.application.yml

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

5.5. Header 路由断言工厂

Header 路由断言工厂有两个参数,header名称和正则表达式。此断言与具有给定名称且值与正则表达式匹配的Head匹配。以下示例配置了一个Header路由断言:
示例 5.application.yml

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

如果请求具有一个名为X-Request-Id其值与\d+正则表达式匹配的header,则此路由匹配。

5.6.Host路由断言工厂

Host路由断言工厂采用Host一个参数:主机名列表。使用 Ant 风格,以.为分隔符。以下示例配置Host路由的断言:
示例 6.application.yml

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

还支持URI 模板变量(例如{sub}.myhost.org)。

如果请求Host Header值具有www.somehost.org 或者 beta.somehost.org,则此路由匹配www.anotherhost.org。

此断言将 URI 模板变量(例如sub)将名称和值的Map保存于,ServerWebExchange.getAttributes()中,其键定义为ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE。这些值将在GatewayFilter工厂中使用。

5.7. Method路由断言工厂

Method路由断言工程接受一个参数,该methods参数是一个或多个要匹配的 HTTP 方法。以下示例配置method路由断言:
示例 7.application.yml

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

匹配Get或者Post的请求方法。

5.8. Path路由断言工厂

Path路由断言工厂有两个参数:一个Spring PathMatcher表达式列表和可选matchOptionalTrailingSeparator标识 。以下示例配置Path路由断言:

示例 8.application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

如果请求路径与表达式匹配,则此路由匹配,例如:/red/1or/red/1/或/red/blueor /blue/green。

如果matchTrailingSlash设置为false,则请求路径/red/1/将不匹配。

此断言将 URI 模板变量(例如segment)将名称和值的Map保存于,ServerWebExchange.getAttributes()中,其键定义为ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE。这些值将在GatewayFilter工厂中使用。
可以使用一种实用get方法来更轻松地访问这些变量。以下示例显示了如何使用该get方法:

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

5.9. Query路由断言工厂

Query路由断言工厂有两个参数:一个必需的param和一个可选的正则表达式。以下示例配置Query路由断言:

示例 9.application.yml

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

如果请求包含green查询参数,则前面的路由匹配。
application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=red, gree.

如果请求包含red参数并且值包含gree,路由匹配,因此green、greet会匹配。

5.10。RemoteAddr 路由断言工厂

RemoteAddr 路由断言工厂参数是 CIDR 表示法(IPv4 或 IPv6)的字符串列表,例如192.168.0.1/16(其中192.168.0.1是 IP 地址、16为子网掩码)。以下示例配置 RemoteAddr 路由断言:
例 10.application.yml

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

如果请求的远程地址是192.168.1.10,则此路由匹配。

5.10.1。修改远程地址的解析方式

默认情况下,RemoteAddr 路由断言工厂使用来自传入请求的远程地址。如果 Spring Cloud Gateway 位于代理层后面,这可能与实际客户端 IP 地址不匹配。

您可以通过自定义RemoteAddressResolver方式来自定义解析远程地址的方式。Spring Cloud Gateway 带有一个基于X-Forwarded-For Header的非默认远程地址解析器,XForwardedRemoteAddressResolver.

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

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

考虑以下标头值:

X-Forwarded-For: 0.0.0.1, 0.0.0.2, 0.0.0.3

以下maxTrustedIndex值产生以下远程地址:
在这里插入图片描述
以下示例显示了如何使用 Java 实现相同的配置:
示例 11.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.11. Weight路线断言工厂

Weight路由断言工厂有两个参数:group和weight。权重是按组计算的。以下示例配置weight路由断言:

示例 12.application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

该路由会将约 80% 的流量转发到weighthigh.org,将约 20% 的流量转发到weightlow.org

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值