本文基於Spring Cloud Greenwich SR2html
[TOC]java
Spring Cloud Gateway內置了一系列的路由謂詞工廠,以便咱們能夠在開發中靈活的使用Gateway進行請求轉發。我這裏將Gateway內置的全部路由謂詞工廠整理成了表格,以下:正則表達式
路由謂詞工廠 | 做用 | 參數 |
---|---|---|
After | 當且僅當請求時的時間After配置的時間時,才轉發該請求 | 一個帶有時區的具體時間 |
Before | 當且僅當請求時的時間Before配置的時間時,才轉發該請求 | 一個帶有時區的具體時間 |
Between | 當且僅當請求時的時間Between配置的時間段時,才轉發該請求 | 一個帶有時區的具體時間段 |
Cookie | 當且僅當請求時攜帶的Cookie名稱及值與配置的名稱及值相符時,才轉發該請求 | Cookie的名稱及值,支持使用正則表達式來匹配值 |
Header | 當且僅當請求時攜帶的Header名稱及值與配置的名稱及值相符時,才轉發該請求 | Header的名稱及值,支持使用正則表達式來匹配值 |
Host | 當且僅當請求時名爲Host的Header的值與配置的值相符時,才轉發該請求 | Host的值,支持配置多個且支持使用通配符 |
Method | 當且僅當請求時所使用的HTTP方法與配置的請求方法相符時,才轉發該請求 | HTTP請求方法,例如GET、POST等 |
Path | 當且僅當請求時所訪問的路徑與配置的路徑相匹配時,才轉發該請求 | 通配符、佔位符或具體的接口路徑,能夠配置多個 |
Query | 當且僅當請求時所帶有的參數名稱與配置的參數名稱相符時,才轉發該請求 | 參數名稱和參數值(非必須),支持使用正則表達式對參數值進行匹配 |
RemoteAddr | 當且僅當請求時的IP地址與配置的IP地址相符時,才轉發該請求 | IP地址或IP段 |
相關源碼也整理成了思惟導圖:spring
配置示例:編程
spring: cloud: gateway: routes: - id: after_route uri: lb://example-service predicates: # 當且僅當請求時的時間After配置的時間時,才轉發該請求 # 若請求時的時間不是After配置的時間時,則會返回404 not found - After=2018-08-16T11:34:42.917822900+08:00[Asia/Shanghai]
注意:當predicates
配置項只配置了一個Predicate
且沒有配置Path
時,Path
的默認值爲/**
。因此該段配置會使訪問 GATEWAY_URL/**
時轉發到 user-center
微服務的/**
cookie
Tips:使用如下代碼能夠打印帶有時區的當前時間,而後再自行修改爲特定時間便可:ide
System.out.println(ZonedDateTime.now());
配置示例:微服務
spring: cloud: gateway: routes: - id: before_route uri: lb://example-service predicates: # 當且僅當請求時的時間Before配置的時間時,才轉發該請求 - Before=2018-08-16T11:34:42.917822900+08:00[Asia/Shanghai]
配置示例:url
spring: cloud: gateway: routes: - id: between_route uri: lb://example-service predicates: # 當且僅當請求時的時間Between配置的時間段時,才轉發該請求 - Between=2018-08-16T11:34:42.917822900+08:00[Asia/Shanghai], 2028-08-16T11:34:42.917822900+08:00[Asia/Shanghai]
配置示例:3d
spring: cloud: gateway: routes: - id: cookie_route uri: lb://example-service predicates: # 當且僅當請求帶有名爲chocolate,而且值符合正則表達式 ch.p 的Cookie時,才轉發該請求 - Cookie=chocolate, ch.p
配置示例:
spring: cloud: gateway: routes: - id: header_route uri: lb://example-service predicates: # 當且僅當請求帶有名爲X-Request-Id,而且值符合正則表達式 \d+ 的Header時,才轉發該請求 - Header=X-Request-Id, \d+
配置示例:
spring: cloud: gateway: routes: - id: host_route uri: lb://example-service predicates: # 當且僅當名爲Host的Header符合**.somehost.org或**.anotherhost.org時,才轉發該請求 # 例如:www.somehost.org、beta.somehost.org、www.anotherhost.org等Host就知足該匹配 - Host=**.somehost.org,**.anotherhost.org
配置示例:
spring: cloud: gateway: routes: - id: method_route uri: lb://example-service predicates: # 當且僅當HTTP請求方法爲GET時,才轉發該請求 - Method=GET
配置示例:
spring: cloud: gateway: routes: - id: path_route uri: lb://example-service predicates: # 當且僅當訪問路徑是/foo/*、/some-example/list及/bar/**時,才轉發該請求 # segment是一個特殊的佔位符,表示單層路徑匹配,而/**則是多層路徑的匹配 - Path=/foo/{segment},/example/list,/bar/**
在Path
中配置的url佔位符能夠在過濾器工廠經過相關API進行獲取,關於這個編程技巧能夠參考官方文檔的描述:
配置示例1:
spring: cloud: gateway: routes: - id: query_route uri: lb://example-service predicates: # 當且僅當請求帶有名爲baz的參數,才轉發該請求 - Query=baz
配置示例2:
spring: cloud: gateway: routes: - id: query_route uri: lb://example-service predicates: # 當且僅當請求帶有名爲foo的參數,且參數值與正則表達式 ba. 相匹配,才轉發該請求 - Query=foo, ba.
配置示例:
spring: cloud: gateway: routes: - id: remoteaddr_route uri: lb://example-service predicates: # 當且僅當請求IP是192.168.1.1/24網段,例如192.168.1.10,才轉發該請求 - RemoteAddr=192.168.1.1/24
官方文檔: