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
路線謂詞工廠有兩個參數: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。
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