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

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