2-服务网关Gateway路由断言_学习笔记Factories(2020.3.31)

2-服务网关Gateway学习笔记(2020.3.31)

前言:

上面那篇服务网关Gateway只是快速入门使用了起来,下面介绍路由中断言的详细介绍。

1. 路由断言Factories

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

是个集合属性,可以配置多个断言。

1.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]

1.2 Before 路由断言 Factory

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

predicates:
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]

1.3 Between 路由断言 Factory

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

predicates:
- Between=2020-03-20T17:42:47.789-07:00[America/Denver], 2020-03-31T17:42:47.789-07:00[America/Denver]

1.4 Cookie 路由断言 Factory

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

我们先设置一个cookie响应回给浏览器:

Cookie cookie = new Cookie("myCookie","zhangshaohan");

predicates:
- Cookie=myCookie, zhangshaohan

1.5 Header 路由断言 Factory

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

predicates:
- Header=X-Request-Id, \d+

1.6 Host 路由断言 Factory

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

访问的主机匹配http或者https, baidu.com 默认80端口, 就可以通过路由。 多个,号隔开

predicates:
- Host=**.baid.com,**.localhost:8080

1.7 Method 路由断言 Factory

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

predicates:
- Method=GET #所有GET请求都将被路由

1.8 Path 路由断言 Factory

这个我们已经用过了。

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

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");

1.9 Query 路由断言 Factory

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

predicates:
- Query=green #如果请求包含green查询参数,则路由匹配。
#-------------------------------------------------------
predicates:
- Query=red, gree. #如果请求参数里包含red参数,并且值匹配为gree. 表达式,则将会被路由

1.9.1 The RemoteAddr Route Predicate Factory (RemoteAddr 路由断言 Factory)

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

 predicates:
 - RemoteAddr=192.168.1.1/24 #如果请求的remote address 为 192.168.1.10则将被路由

修改远程地址的解析方式

1.9.1 重量路由断言 Factory

Weight路线谓词工厂有两个参数:groupweight(一个int)。权重是按组计算的。以下示例配置权重路由谓词:

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。

2. 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")
)

1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章