Spring cloud Gateway簡(jiǎn)介及相關(guān)配置方法
官網(wǎng):spring cloud gateway網(wǎng)關(guān) (spring.io)
Doker官網(wǎng):Doker 多克
Spring Cloud Gateway 的核心功能:
斷言(Predicate):參照 Java8 的新特性Predicate,允許開(kāi)發(fā)人員匹配 HTTP 請(qǐng)求中的任何內(nèi)容,比如請(qǐng)求頭或請(qǐng)求參數(shù),最后根據(jù)匹配結(jié)果返回一個(gè)布爾值。
路由(route):由ID、目標(biāo)URI、斷言集合和過(guò)濾器集合組成。如果聚合斷言結(jié)果為真,則轉(zhuǎn)發(fā)到該路由。
過(guò)濾器(filter):可以在返回請(qǐng)求之前或之后修改請(qǐng)求和響應(yīng)的內(nèi)容。
1、路由 Route:
Route 主要由 路由id、目標(biāo)uri、斷言集合和過(guò)濾器集合組成,那我們簡(jiǎn)單看看這些屬性到底有什么作用。
(1)id:路由標(biāo)識(shí),要求唯一,名稱任意(默認(rèn)值 uuid,一般不用,需要自定義)
(2)uri:請(qǐng)求最終被轉(zhuǎn)發(fā)到的目標(biāo)地址
(3)order: 路由優(yōu)先級(jí),數(shù)字越小,優(yōu)先級(jí)越高
(4)predicates:斷言數(shù)組,即判斷條件,如果返回值是boolean,則轉(zhuǎn)發(fā)請(qǐng)求到 uri 屬性指定的服務(wù)中
(5)filters:過(guò)濾器數(shù)組,在請(qǐng)求傳遞過(guò)程中,對(duì)請(qǐng)求做一些修改
2、斷言 Predicate:
Predicate 來(lái)自于 Java8 的接口。Predicate 接受一個(gè)輸入?yún)?shù),返回一個(gè)布爾值結(jié)果。該接口包含多種默認(rèn)方法來(lái)將 Predicate 組合成其他復(fù)雜的邏輯(比如:與,或,非)。
Predicate 可以用于接口請(qǐng)求參數(shù)校驗(yàn)、判斷新老數(shù)據(jù)是否有變化需要進(jìn)行更新操作。Spring Cloud Gateway 內(nèi)置了許多 Predict,這些 Predict 的源碼在 org.springframework.cloud.gateway.handler.predicate 包中,有興趣可以閱讀一下
3、過(guò)濾器 filter:
Gateway 過(guò)濾器的生命周期:
PRE:這種過(guò)濾器在請(qǐng)求被路由之前調(diào)用。我們可利用這種過(guò)濾器實(shí)現(xiàn)身份驗(yàn)證、在集群中選擇請(qǐng)求的微服務(wù)、記錄調(diào)試信息等。
POST:這種過(guò)濾器在路由到微服務(wù)以后執(zhí)行。這種過(guò)濾器可用來(lái)為響應(yīng)添加標(biāo)準(zhǔn)的 HTTP Header、收集統(tǒng)計(jì)信息和指標(biāo)、將響應(yīng)從微服務(wù)發(fā)送給客戶端等。
Gateway 過(guò)濾器從作用范圍可分為兩種:
GatewayFilter:應(yīng)用到單個(gè)路由或者一個(gè)分組的路由上(需要在配置文件中配置)
GlobalFilter:應(yīng)用到所有的路由上(無(wú)需配置,全局生效)
(1)局部過(guò)濾器 GatewayFilter:
Spring Cloud Gateway 中內(nèi)置了許多的局部過(guò)濾器;局部過(guò)濾器需要在指定路由配置才能生效,默認(rèn)是不生效的
(2)自定義局部過(guò)濾器:
雖說(shuō)內(nèi)置的過(guò)濾器能夠解決很多場(chǎng)景,但是難免還是有些特殊需求需要定制一個(gè)過(guò)濾器,下面就來(lái)介紹一下如何自定義局部過(guò)濾器。
(3) GlobalFilter 全局過(guò)濾器:
全局過(guò)濾器應(yīng)用全部路由上,無(wú)需開(kāi)發(fā)者配置,Spring Cloud Gateway 也內(nèi)置了一些全局過(guò)濾器。GlobalFilter 的功能其實(shí)和 GatewayFilter 是相同的,只是 GlobalFilter 的作用域是所有的路由配置,而不是綁定在指定的路由配置上。多個(gè) GlobalFilter 可以通過(guò) @Order 或者 getOrder() 方法指定執(zhí)行順序,order值越小,執(zhí)行的優(yōu)先級(jí)越高。
注意,由于過(guò)濾器有 pre 和 post 兩種類型,pre 類型過(guò)濾器如果 order 值越小,那么它就應(yīng)該在pre過(guò)濾器鏈的頂層,post 類型過(guò)濾器如果 order 值越小,那么它就應(yīng)該在 post 過(guò)濾器鏈的底層
(4) 過(guò)濾器規(guī)則(Filter)
| 過(guò)濾規(guī)則 | 實(shí)例 | 說(shuō)明 |
|---|---|---|
| PrefixPath | - PrefixPath=/app | 在請(qǐng)求路徑前加上app |
| RewritePath | - RewritePath=/test, /app/test | 訪問(wèn)localhost:9022/test,請(qǐng)求會(huì)轉(zhuǎn)發(fā)到localhost:8001/app/test |
| SetPath | SetPath=/app/{path} | 通過(guò)模板設(shè)置路徑,轉(zhuǎn)發(fā)的規(guī)則時(shí)會(huì)在路徑前增加app,{path}表示原請(qǐng)求路徑 |
| RedirectTo | 重定向 | |
| RemoveRequestHeader | 去掉某個(gè)請(qǐng)求頭信息 |
注:當(dāng)配置多個(gè)filter時(shí),優(yōu)先定義的會(huì)被調(diào)用,剩余的filter將不會(huì)生效
4、Predicate 斷言條件(轉(zhuǎn)發(fā)規(guī)則)介紹

每一個(gè)Predicate的使用,你可以理解為:當(dāng)滿足這種條件后才會(huì)被轉(zhuǎn)發(fā),如果是多個(gè),那就是都滿足的情況下被轉(zhuǎn)發(fā)。
Path 方式匹配轉(zhuǎn)發(fā)
通過(guò)Path轉(zhuǎn)發(fā)示例,我們講解下上面的兩種配置,分別是application.yml以及RouteLocator。
配置文件匹配地址轉(zhuǎn)發(fā)
我們?cè)?code>application.yml配置文件內(nèi)添加對(duì)應(yīng)的路由配置,如下所示:
spring:
application:
name: spring-cloud-gateway-sample
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
# 匹配路徑轉(zhuǎn)發(fā)
- Path=/api-boot-datasource-switch.html
# 端口號(hào)
server:
port: 9090**先來(lái)解釋下route的組成部分:**
id:路由的IDuri:匹配路由的轉(zhuǎn)發(fā)地址predicates:配置該路由的斷言,通過(guò)PredicateDefinition類進(jìn)行接收配置。
在上面的配置中,當(dāng)訪問(wèn)http://localhost:9090/api-boot-datasource-switch.html時(shí)就會(huì)被自動(dòng)轉(zhuǎn)發(fā)到http://blog.xx.com/api-boot-datasource-switch.html,這里要注意完全匹配Path的值時(shí)才會(huì)進(jìn)行路由轉(zhuǎn)發(fā)。
訪問(wèn)效果如下所示:

spring-cloud-gateway-path-predicate.png
RouteLocator 匹配路徑轉(zhuǎn)發(fā)
在上面的配置中,如果使用RouteLocator方式該怎么進(jìn)行配置呢?
如下所示:
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("blog", r ->
r.path("/api-boot-datasource-switch.html").uri("http://blog.xx.com"))
.build();
}Before 方式匹配轉(zhuǎn)發(fā)
當(dāng)部署有訪問(wèn)時(shí)間限制的接口時(shí),我們可以通過(guò)Before Predicate來(lái)完成某一個(gè)時(shí)間點(diǎn)之前允許訪問(wèn),過(guò)時(shí)后則不允許轉(zhuǎn)發(fā)請(qǐng)求到具體的服務(wù),配置如下所示:
spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Before=2019-05-01T00:00:00+08:00[Asia/Shanghai]在上面配置中,我們?cè)试S2019-05-01日凌晨之前通過(guò)路由轉(zhuǎn)發(fā)到http://blog.xx.com,通過(guò)查看org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory源碼我們發(fā)現(xiàn),Spring Cloud Gateway的Before斷言采用的ZonedDateTime進(jìn)行匹配時(shí)間,這里要注意存在時(shí)區(qū)的問(wèn)題,需要配置[Asia/Shanghai]作為中國(guó)時(shí)區(qū)。
After 方式匹配轉(zhuǎn)發(fā)
After Predicate與Before配置使用一致,匹配某一個(gè)時(shí)間點(diǎn)之后允許路由轉(zhuǎn)發(fā),如下所示配置:
spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- After=2019-04-29T00:00:00+08:00[Asia/Shanghai]在上面配置中允許2019-04-29凌晨之后進(jìn)行轉(zhuǎn)發(fā)到http://blog.xx.com。
Between 方式匹配轉(zhuǎn)發(fā)
那如果是一個(gè)時(shí)間段內(nèi)允許請(qǐng)求轉(zhuǎn)發(fā),通過(guò)Before、After組合配置也可以完成,不過(guò)Spring Cloud Gateway還是提供了Between方式,如下所示:
spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Between=2019-04-29T00:00:00+08:00[Asia/Shanghai], 2019-05-01T00:00:00+08:00[Asia/Shanghai]在上面配置中,允許在2019-04-29日凌晨后 & 2019-05-01凌晨之前請(qǐng)求轉(zhuǎn)發(fā)到http://blog.xx.com。
Cookie 方式匹配轉(zhuǎn)發(fā)
Spring Cloud Gateway 還提供了根據(jù)Cookie值的方式匹配轉(zhuǎn)發(fā)請(qǐng)求,如果請(qǐng)求中所攜帶的Cookie值與配置的Predicate匹配,那么就可以被允許轉(zhuǎn)發(fā)到指定地址,如下所示:
spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Cookie=hengboy, leo在上面配置中,如果客戶端發(fā)送請(qǐng)求時(shí)攜帶了"hengboy=leo"的Cookie信息,則允許請(qǐng)求轉(zhuǎn)發(fā)。
**測(cè)試Cookie方式轉(zhuǎn)發(fā):**
curl http://localhost:9090 --cookie "hengboy=leo"
通過(guò)上面方式我們是可以成功轉(zhuǎn)發(fā)請(qǐng)求的,如果我們修改Cookie的值,就會(huì)導(dǎo)致無(wú)法轉(zhuǎn)發(fā),出現(xiàn)404。
Header 方式匹配轉(zhuǎn)發(fā)
Spring Cloud Gateway可以根據(jù)發(fā)送請(qǐng)求的Header信息進(jìn)行匹配轉(zhuǎn)發(fā),加入我們可以根據(jù)X-Request-Id的值進(jìn)行匹配,如下所示:
spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Header=X-Request-Id, \d+在上面配置中,如果X-Request-Id的值為數(shù)字,那么就可以轉(zhuǎn)發(fā)到http://blog.xx.com,我們通過(guò)如下方式進(jìn)行測(cè)試:
curl http://localhost:9090 -H "X-Request-Id:123456"
如果頭信息為X-Request-Id:abc時(shí),就會(huì)轉(zhuǎn)發(fā)失敗,出現(xiàn)404。
Host 方式匹配轉(zhuǎn)發(fā)
Spring Cloud Gateway可以根據(jù)Host主機(jī)名進(jìn)行匹配轉(zhuǎn)發(fā),如果我們的接口只允許\*\*.xx.com域名進(jìn)行訪問(wèn),那么配置如下所示:
spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Host=\*\*.xx.com測(cè)試如下所示:
1. curl http://localhost:9090 -H "Host: xx.com" // 匹配 2. curl http://localhost:9090 -H "Host: api.xx.com" // 匹配 3. curl http://localhost:9090 -H "Host: admin.xx.com" // 匹配 3. curl http://localhost:9090 -H "Host: hengboy.com" // 不匹配
請(qǐng)求方式 方式匹配轉(zhuǎn)發(fā)
Rest請(qǐng)求風(fēng)格的接口內(nèi)往往會(huì)存在多種請(qǐng)求方式的接口,如果我們的接口只允許POST請(qǐng)求訪問(wèn),那么配置如下所示:
spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Method=POST發(fā)送GET請(qǐng)求測(cè)試:
~ curl http://localhost:9090
{"timestamp":"2019-04-29T06:27:41.121+0000","path":"/","status":404,"error":"Not Found","message":null}我們的請(qǐng)求并未被Spring Cloud Gateway進(jìn)行轉(zhuǎn)發(fā),那么我們?cè)賮?lái)通過(guò)POST請(qǐng)求進(jìn)行測(cè)試:
curl -X POST http://localhost:9090
是可以被轉(zhuǎn)發(fā)到目標(biāo)地址uri的,不過(guò)我的這個(gè)博客是OSS部署的,阿里云限制了POST訪問(wèn),盡管如此我們也證明了可以轉(zhuǎn)發(fā)。
請(qǐng)求參數(shù) 方式匹配轉(zhuǎn)發(fā)
Spring Cloud GateWay還支持根據(jù)指定的參數(shù)進(jìn)行匹配,Query方式的Predicate也有兩種方式匹配情況,如下所示:
請(qǐng)求中存在xxx參數(shù)
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Query=xxx我們通過(guò)curl http://localhost:9090\?xxx\=123是可以被成功轉(zhuǎn)發(fā)的,只要參數(shù)存在xxx就會(huì)被成功轉(zhuǎn)發(fā),否則出現(xiàn)404轉(zhuǎn)發(fā)失敗。
請(qǐng)求中存在xxx參數(shù)且值為zzz
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Query=xxx, zzz根據(jù)上面配置,我們限定了參數(shù)xxx必須為zzz時(shí)才會(huì)被成功轉(zhuǎn)發(fā),否則同樣會(huì)出現(xiàn)404抓發(fā)失敗。
請(qǐng)求路徑 方式匹配轉(zhuǎn)發(fā)
Spring Cloud Gateway提供了請(qǐng)求路徑變量方式匹配轉(zhuǎn)發(fā),如下所示:
spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Path=/article/{articleId}在上面配置中{articleId}是一個(gè)路徑變量,可以是任意值,匹配/article/1、/article/abc等,測(cè)試如下所示:
~ curl http://localhost:9090/article/1 // 匹配 ~ curl http://localhost:9090/article/abc // 匹配 ~ curl http://localhost:9090/article/1/1 // 不匹配
請(qǐng)求IP 方式匹配轉(zhuǎn)發(fā)
Spring Cloud Gateway可以限制允許訪問(wèn)接口的客戶端IP地址,配置后只對(duì)指定IP地址的客戶端進(jìn)行請(qǐng)求轉(zhuǎn)發(fā),配置如下所示:
spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- RemoteAddr=192.168.1.56/24在上面我們配置了192.168.1.56/24,其中192.168.1.56是客戶端的IP地址,而24則是子網(wǎng)掩碼。
組合示例
相同的Predicate也可以配置多個(gè),請(qǐng)求的轉(zhuǎn)發(fā)是必須滿足所有的Predicate后才可以進(jìn)行路由轉(zhuǎn)發(fā),組合使用示例如下所示:
spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.xx.com
predicates:
- Query=author, hengboy
- Query=leo
- Method=GET
- Cookie=hengboy, leo
- Header=X-Request-Id, \d+
- RemoteAddr=192.168.1.56/24總結(jié)
本章節(jié)講解了Spring Cloud Gateway的相關(guān)謂詞、斷言基本使用方式,GateWay內(nèi)部提供了很多種靈活的路由轉(zhuǎn)發(fā)規(guī)則,在同一個(gè)路由內(nèi)存在多個(gè)Predicate時(shí),同時(shí)滿足規(guī)則后請(qǐng)求才會(huì)被路由轉(zhuǎn)發(fā)。
參考:
Spring cloud網(wǎng)關(guān)gateway進(jìn)行websocket路由轉(zhuǎn)發(fā)規(guī)則配置過(guò)程
http://www.dbjr.com.cn/article/280022.htm
到此這篇關(guān)于Spring cloud Gateway 詳解及相關(guān)配置的文章就介紹到這了,更多相關(guān)Spring cloud Gateway配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java返回的List進(jìn)行add操作報(bào)錯(cuò)
本文主要介紹了java返回的List進(jìn)行add操作報(bào)錯(cuò),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Spring Boot 在啟動(dòng)時(shí)進(jìn)行配置文件加解密的方法詳解
這篇文章主要介紹了Spring Boot 在啟動(dòng)時(shí)進(jìn)行配置文件加解密的方法,本文通過(guò)實(shí)例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
java多線程應(yīng)用實(shí)現(xiàn)方法
以前沒(méi)有寫(xiě)筆記的習(xí)慣,現(xiàn)在慢慢的發(fā)現(xiàn)及時(shí)總結(jié)是多么的重要了,呵呵。雖然才大二,但是也快要畢業(yè)了,要加油2012-11-11
淺談Mybatis Plus的BaseMapper的方法是如何注入的
我們?cè)谟玫臅r(shí)候經(jīng)常就是生產(chǎn)自定義的Mapper繼承自BaseMapper,那么BaseMapper怎么被注入到mybatis里的,本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-09-09
基于springboot2集成jpa,創(chuàng)建dao的案例
這篇文章主要介紹了基于springboot2集成jpa,創(chuàng)建dao的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
springboot整合minio實(shí)現(xiàn)文件上傳與下載且支持鏈接永久訪問(wèn)
本文主要介紹了springboot整合minio實(shí)現(xiàn)文件上傳與下載且支持鏈接永久訪問(wèn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
深入理解Java中沒(méi)那么簡(jiǎn)單的單例模式
這篇文章主要給大家詳細(xì)介紹了Java單例模式,關(guān)于Java中的單例模式并非看起來(lái)那么簡(jiǎn)單的,為什么要這么說(shuō)呢?下面通過(guò)這篇文章來(lái)一起看看吧,有需要的朋友們可以參考借鑒。2017-01-01

