Spring Cloud Gateway路由配置的兩種形式
Spring Cloud Gateway的路由配置有兩種形式,分別是路由到指定的URL以及路由到指定的微服務,在上文博客的示例中我們就已經使用過路由到微服務的這種配置形式了。在這兩種形式中,均支持訪問路徑的通配及精確匹配,在之前的示例中我們只使用了通配。所以本文將給出具體的配置示例,以此直觀的了解這兩種形式及不同匹配方式在配置上的區別。
路由配置必須與predicates配套使用才會生效!
路由到指定的URL
通配
使用通配符/**進行匹配,示例代碼如下:
spring:
cloud:
gateway:
routes:
- id: {路由的唯一標識}
uri: http://www.xxx.com
predicates:
# 使用通配符匹配
- Path=/**
**該配置使訪問 GATEWAY_URL/** 時會轉發到 http://www.xxx.com/** **
精確匹配
配置具體的接口路徑,示例代碼如下:
spring:
cloud:
gateway:
routes:
- id: {路由的唯一標識}
uri: http://www.xxx.com/order/detail
predicates:
# 指定具體的路徑進行匹配
- Path=/order/detail
該配置使訪問 GATEWAY_URL/order/detail 時會轉發到 http://www.xxx.com/order/detail
路由到指定的微服務
通配
spring:
cloud:
gateway:
routes:
- id: {路由的唯一標識} # 這種形式下通常是微服務名稱
uri: lb://study01 # lb代表從注冊中心獲取服務
predicates:
# 使用通配符匹配
- Path=/**
**該配置使訪問 GATEWAY_URL/** 時會轉發到 study01微服務的/** **
精確匹配
spring:
cloud:
gateway:
routes:
- id: {路由的唯一標識} # 這種形式下通常是微服務名稱
uri: lb://study01/order/detail # lb代表從注冊中心獲取服務
predicates:
# 指定具體的路徑進行匹配
- Path=/order/detail
該配置使訪問 GATEWAY_URL/order/detail時會轉發到 study01微服務的/order/detail
內置的路由謂詞工廠
Spring Cloud Gateway內置了一系列的路由謂詞工廠,以便我們可以在開發中靈活的使用Gateway進行請求轉發。
路由謂詞工廠的作用是:符合Predicate的條件,就使用該路由的配置,否則就不管。
路由謂詞工廠 | 作用 | 參數 |
---|---|---|
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段 |
After
示例配置:
spring:
cloud:
gateway:
routes:
- id: after_route
uri: lb://example-service
predicates:
# 當且僅當請求時的時間After配置的時間時,才轉發該請求
# 若請求時的時間不是After配置的時間時,則會返回404 not found
- After=2019-10-28T12:34:42.917822900+08:00[Asia/Shanghai]
**注意:當predicates配置項只配置了一個Predicate且沒有配置Path時,Path的默認值為/** 。所以該段配置會使訪問 GATEWAY_URL/** 時轉發到example-service微服務的/** **
Before
示例配置:
spring:
cloud:
gateway:
routes:
- id: before_route
uri: lb://example-service
predicates:
# 當且僅當請求時的時間Before配置的時間時,才轉發該請求
- Before=2019-10-28T12:34:42.917822900+08:00[Asia/Shanghai]
Between
示例配置:
pring:
cloud:
gateway:
routes:
- id: between_route
uri: lb://example-service
predicates:
# 當且僅當請求時的時間Between配置的時間段時,才轉發該請求
- Between=2019-10-28T12:34:42.917822900+08:00[Asia/Shanghai]:2019-10-29T12:34:42.917822900+08:00[Asia/Shanghai]
Cookie
示例配置:
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: lb://example-service
predicates:
# 當且僅當請求帶有名為chocolate,並且值符合正則表達式 ch.p 的Cookie時,才轉發該請求
- Cookie=chocolate, ch.p
Header
示例配置:
spring:
cloud:
gateway:
routes:
- id: header_route
uri: lb://example-service
predicates:
# 當且僅當請求帶有名為X-Request-Id,並且值符合正則表達式 \d+ 的Header時,才轉發該請求
- Header=X-Request-Id, \d+
Host
示例配置:
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
Method
示例配置:
spring:
cloud:
gateway:
routes:
- id: method_route
uri: lb://example-service
predicates:
# 當且僅當HTTP請求方法為GET時,才轉發該請求
- Method=GET
Path
示例配置:
spring:
cloud:
gateway:
routes:
- id: path_route
uri: lb://example-service
predicates:
# 當且僅當訪問路徑是/foo/*、/some-example/list及/bar/**時,才轉發該請求
# segment是一個特殊的占位符,表示單層路徑匹配,而/**則是多層路徑的匹配
- Path=/foo/{segment},/example/list,/bar/**
Query
示例配置一:
spring:
cloud:
gateway:
routes:
- id: query_route
uri: lb://example-service
predicates:
# 當且僅當請求帶有名為baz的參數,才轉發該請求
- Query=baz
示例配置二:
spring:
cloud:
gateway:
routes:
- id: query_route
uri: lb://example-service
predicates:
# 當且僅當請求帶有名為foo的參數,且參數值與正則表達式 ba. 相匹配,才轉發該請求
- Query=foo, ba.
RemoteAddr
示例配置:
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: lb://example-service
predicates:
# 當且僅當請求IP是192.168.1.101/24網段,例如192.168.1.101,才轉發該請求
- RemoteAddr=192.168.1.101/24