您好,登錄后才能下訂單哦!
這篇“Springcloud Gateway相關(guān)配置方法是什么”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Springcloud Gateway相關(guān)配置方法是什么”文章吧。
斷言(Predicate):參照 Java8 的新特性Predicate,允許開發(fā)人員匹配 HTTP 請求中的任何內(nèi)容,比如請求頭或請求參數(shù),最后根據(jù)匹配結(jié)果返回一個布爾值。
路由(route):由ID、目標(biāo)URI、斷言集合和過濾器集合組成。如果聚合斷言結(jié)果為真,則轉(zhuǎn)發(fā)到該路由。
過濾器(filter):可以在返回請求之前或之后修改請求和響應(yīng)的內(nèi)容。
Route 主要由 路由id、目標(biāo)uri、斷言集合和過濾器集合組成,那我們簡單看看這些屬性到底有什么作用。
(1)id:路由標(biāo)識,要求唯一,名稱任意(默認(rèn)值 uuid,一般不用,需要自定義)
(2)uri:請求最終被轉(zhuǎn)發(fā)到的目標(biāo)地址
(3)order: 路由優(yōu)先級,數(shù)字越小,優(yōu)先級越高
(4)predicates:斷言數(shù)組,即判斷條件,如果返回值是boolean,則轉(zhuǎn)發(fā)請求到 uri 屬性指定的服務(wù)中
(5)filters:過濾器數(shù)組,在請求傳遞過程中,對請求做一些修改
Predicate 來自于 Java8 的接口。Predicate 接受一個輸入?yún)?shù),返回一個布爾值結(jié)果。該接口包含多種默認(rèn)方法來將 Predicate 組合成其他復(fù)雜的邏輯(比如:與,或,非)。
Predicate 可以用于接口請求參數(shù)校驗、判斷新老數(shù)據(jù)是否有變化需要進(jìn)行更新操作。Spring Cloud Gateway 內(nèi)置了許多 Predict,這些 Predict 的源碼在 org.springframework.cloud.gateway.handler.predicate 包中,有興趣可以閱讀一下
Gateway 過濾器的生命周期:
PRE:這種過濾器在請求被路由之前調(diào)用。我們可利用這種過濾器實現(xiàn)身份驗證、在集群中選擇請求的微服務(wù)、記錄調(diào)試信息等。
POST:這種過濾器在路由到微服務(wù)以后執(zhí)行。這種過濾器可用來為響應(yīng)添加標(biāo)準(zhǔn)的 HTTP Header、收集統(tǒng)計信息和指標(biāo)、將響應(yīng)從微服務(wù)發(fā)送給客戶端等。
Gateway 過濾器從作用范圍可分為兩種:
GatewayFilter:應(yīng)用到單個路由或者一個分組的路由上(需要在配置文件中配置)
GlobalFilter:應(yīng)用到所有的路由上(無需配置,全局生效)
(1)局部過濾器 GatewayFilter:
Spring Cloud Gateway 中內(nèi)置了許多的局部過濾器;局部過濾器需要在指定路由配置才能生效,默認(rèn)是不生效的
(2)自定義局部過濾器:
雖說內(nèi)置的過濾器能夠解決很多場景,但是難免還是有些特殊需求需要定制一個過濾器,下面就來介紹一下如何自定義局部過濾器。
(3) GlobalFilter 全局過濾器:
全局過濾器應(yīng)用全部路由上,無需開發(fā)者配置,Spring Cloud Gateway 也內(nèi)置了一些全局過濾器。GlobalFilter 的功能其實和 GatewayFilter 是相同的,只是 GlobalFilter 的作用域是所有的路由配置,而不是綁定在指定的路由配置上。多個 GlobalFilter 可以通過 @Order 或者 getOrder() 方法指定執(zhí)行順序,order值越小,執(zhí)行的優(yōu)先級越高。
注意,由于過濾器有 pre 和 post 兩種類型,pre 類型過濾器如果 order 值越小,那么它就應(yīng)該在pre過濾器鏈的頂層,post 類型過濾器如果 order 值越小,那么它就應(yīng)該在 post 過濾器鏈的底層
(4) 過濾器規(guī)則(Filter)
過濾規(guī)則 | 實例 | 說明 |
---|---|---|
PrefixPath | - PrefixPath=/app | 在請求路徑前加上app |
RewritePath | - RewritePath=/test, /app/test | 訪問localhost:9022/test,請求會轉(zhuǎn)發(fā)到localhost:8001/app/test |
SetPath | SetPath=/app/{path} | 通過模板設(shè)置路徑,轉(zhuǎn)發(fā)的規(guī)則時會在路徑前增加app,{path}表示原請求路徑 |
RedirectTo | 重定向 | |
RemoveRequestHeader | 去掉某個請求頭信息 |
注:當(dāng)配置多個filter時,優(yōu)先定義的會被調(diào)用,剩余的filter將不會生效
每一個Predicate
的使用,你可以理解為:當(dāng)滿足這種條件后才會被轉(zhuǎn)發(fā)
,如果是多個,那就是都滿足的情況下被轉(zhuǎn)發(fā)。
通過Path
轉(zhuǎn)發(fā)示例,我們講解下上面的兩種配置,分別是application.yml
以及RouteLocator
。
配置文件匹配地址轉(zhuǎn)發(fā)
我們在application.yml
配置文件內(nèi)添加對應(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 # 端口號 server: port: 9090
**先來解釋下route
的組成部分:**
id
:路由的ID
uri
:匹配路由的轉(zhuǎn)發(fā)地址
predicates
:配置該路由的斷言,通過PredicateDefinition
類進(jìn)行接收配置。
在上面的配置中,當(dāng)訪問http://localhost:9090/api-boot-datasource-switch.html
時就會被自動轉(zhuǎn)發(fā)到http://blog.xx.com/api-boot-datasource-switch.html
,這里要注意完全匹配Path
的值時才會進(jìn)行路由轉(zhuǎn)發(fā)。
訪問效果如下所示:
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(); }
當(dāng)部署有訪問時間限制的接口時,我們可以通過Before Predicate
來完成某一個時間點之前允許訪問,過時后則不允許轉(zhuǎn)發(fā)請求到具體的服務(wù),配置如下所示:
spring: cloud: gateway: routes: - id: blog uri: http://blog.xx.com predicates: - Before=2019-05-01T00:00:00+08:00[Asia/Shanghai]
在上面配置中,我們允許2019-05-01
日凌晨之前通過路由轉(zhuǎn)發(fā)到http://blog.xx.com
,通過查看org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory
源碼我們發(fā)現(xiàn),Spring Cloud Gateway
的Before
斷言采用的ZonedDateTime
進(jìn)行匹配時間,這里要注意存在時區(qū)的問題,需要配置[Asia/Shanghai]
作為中國時區(qū)。
After Predicate
與Before
配置使用一致,匹配某一個時間點之后允許路由轉(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
。
那如果是一個時間段內(nèi)允許請求轉(zhuǎn)發(fā),通過Before
、After
組合配置也可以完成,不過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
凌晨之前請求轉(zhuǎn)發(fā)到http://blog.xx.com
。
Spring Cloud Gateway
還提供了根據(jù)Cookie
值的方式匹配轉(zhuǎn)發(fā)請求,如果請求中所攜帶的Cookie
值與配置的Predicate
匹配,那么就可以被允許轉(zhuǎn)發(fā)到指定地址,如下所示:
spring: cloud: gateway: routes: - id: blog uri: http://blog.xx.com predicates: - Cookie=hengboy, leo
在上面配置中,如果客戶端發(fā)送請求時攜帶了"hengboy=leo"
的Cookie信息,則允許請求轉(zhuǎn)發(fā)。
**測試Cookie方式轉(zhuǎn)發(fā):**
curl http://localhost:9090 --cookie "hengboy=leo"
通過上面方式我們是可以成功轉(zhuǎn)發(fā)請求的,如果我們修改Cookie
的值,就會導(dǎo)致無法轉(zhuǎn)發(fā)
,出現(xiàn)404。
Spring Cloud Gateway
可以根據(jù)發(fā)送請求的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
,我們通過如下方式進(jìn)行測試:
curl http://localhost:9090 -H "X-Request-Id:123456"
如果頭信息為X-Request-Id:abc
時,就會轉(zhuǎn)發(fā)失敗,出現(xiàn)404。
Spring Cloud Gateway
可以根據(jù)Host
主機名進(jìn)行匹配轉(zhuǎn)發(fā),如果我們的接口只允許\*\*.xx.com
域名進(jìn)行訪問,那么配置如下所示:
spring: cloud: gateway: routes: - id: blog uri: http://blog.xx.com predicates: - Host=\*\*.xx.com
測試如下所示:
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" // 不匹配
Rest
請求風(fēng)格的接口內(nèi)往往會存在多種請求方式的接口,如果我們的接口只允許POST
請求訪問,那么配置如下所示:
spring: cloud: gateway: routes: - id: blog uri: http://blog.xx.com predicates: - Method=POST
發(fā)送GET
請求測試:
~ curl http://localhost:9090 {"timestamp":"2019-04-29T06:27:41.121+0000","path":"/","status":404,"error":"Not Found","message":null}
我們的請求并未被Spring Cloud Gateway
進(jìn)行轉(zhuǎn)發(fā),那么我們再來通過POST
請求進(jìn)行測試:
curl -X POST http://localhost:9090
是可以被轉(zhuǎn)發(fā)到目標(biāo)地址uri
的,不過我的這個博客是OSS
部署的,阿里云限制了POST
訪問,盡管如此我們也證明了可以轉(zhuǎn)發(fā)。
Spring Cloud GateWay
還支持根據(jù)指定的參數(shù)進(jìn)行匹配,Query
方式的Predicate
也有兩種方式匹配情況,如下所示:
請求中存在xxx
參數(shù)
cloud: gateway: routes: - id: blog uri: http://blog.xx.com predicates: - Query=xxx
我們通過curl http://localhost:9090\?xxx\=123
是可以被成功轉(zhuǎn)發(fā)的,只要參數(shù)存在xxx
就會被成功轉(zhuǎn)發(fā),否則出現(xiàn)404轉(zhuǎn)發(fā)失敗。
請求中存在xxx
參數(shù)且值為zzz
cloud: gateway: routes: - id: blog uri: http://blog.xx.com predicates: - Query=xxx, zzz
根據(jù)上面配置,我們限定了參數(shù)xxx
必須為zzz
時才會被成功轉(zhuǎn)發(fā),否則同樣會出現(xiàn)404抓發(fā)失敗。
Spring Cloud Gateway
提供了請求路徑變量方式匹配轉(zhuǎn)發(fā),如下所示:
spring: cloud: gateway: routes: - id: blog uri: http://blog.xx.com predicates: - Path=/article/{articleId}
在上面配置中{articleId}
是一個路徑變量,可以是任意值,匹配/article/1
、/article/abc
等,測試如下所示:
~ curl http://localhost:9090/article/1 // 匹配 ~ curl http://localhost:9090/article/abc // 匹配 ~ curl http://localhost:9090/article/1/1 // 不匹配
Spring Cloud Gateway
可以限制允許訪問接口的客戶端IP
地址,配置后只對指定IP
地址的客戶端進(jìn)行請求轉(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
也可以配置多個,請求的轉(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
以上就是關(guān)于“Springcloud Gateway相關(guān)配置方法是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。