Gateway
学习笔记(2020.3.31)上面那篇服务网关Gateway只是快速入门使用了起来,下面介绍路由中断言的详细介绍。
Spring Cloud Gateway将路由作为Spring WebFlux
HandlerMapping
基础结构的一部分进行匹配。Spring Cloud Gateway包含许多内置的路由断言Factories。这些断言都匹配HTTP请求的不同属性。多个路由断言Factories可以通过and
组合使用。
是个集合属性,可以配置多个断言。
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]
Before Route Predicate Factory采用一个参数——日期时间。
在该日期时间之前发生的请求都将被匹配。
predicates:
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
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]
Cookie 路由断言 Factory有两个参数,cookie名称和正则表达式。请求包含次cookie名称且正则表达式为真的将会被匹配。
cookieName=value
我们先设置一个cookie响应回给浏览器:
Cookie cookie = new Cookie("myCookie","zhangshaohan");
predicates:
- Cookie=myCookie, zhangshaohan
Header 路由断言 Factory有两个参数,header名称和正则表达式。请求包含次header名称且正则表达式为真的将会被匹配。
header=value
predicates:
- Header=X-Request-Id, \d+
Host 路由断言 Factory包括一个参数:host name列表。使用Ant路径匹配规则,
.
作为分隔符。访问的主机匹配http或者https, baidu.com 默认80端口, 就可以通过路由。 多个
,
号隔开
predicates:
- Host=**.baid.com,**.localhost:8080
Method 路由断言 Factory只包含一个参数: 需要匹配的HTTP请求方式
predicates:
- Method=GET #所有GET请求都将被路由
这个我们已经用过了。
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");
Query 路由断言 Factory 有2个参数: 必选项
param
和可选项regexp
.
predicates:
- Query=green #如果请求包含green查询参数,则路由匹配。
#-------------------------------------------------------
predicates:
- Query=red, gree. #如果请求参数里包含red参数,并且值匹配为gree. 表达式,则将会被路由
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则将被路由
修改远程地址的解析方式
该
Weight
路线谓词工厂有两个参数:group
和weight
(一个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。
**
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