Spring
在因Netflix
開(kāi)源流產(chǎn)事件后,在不斷的更換Netflix
相關(guān)的組件,比如:Eureka
、Zuul
、Feign
、Ribbon
等,Zuul
的替代產(chǎn)品就是SpringCloud Gateway
,這是Spring
團(tuán)隊(duì)研發(fā)的網(wǎng)關(guān)組件,可以實(shí)現(xiàn)限流、安全認(rèn)證、支持長(zhǎng)連接等新特性。
成都創(chuàng)新互聯(lián)專注于內(nèi)丘企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城開(kāi)發(fā)。內(nèi)丘網(wǎng)站建設(shè)公司,為內(nèi)丘等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站建設(shè),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
Spring Cloud Gateway
Spring Cloud Gateway
是SpringCloud
的全新子項(xiàng)目,該項(xiàng)目基于Spring5.x
、SpringBoot2.x
技術(shù)版本進(jìn)行編寫,意在提供簡(jiǎn)單方便、可擴(kuò)展的統(tǒng)一API路由管理方式。
概念解釋:
Route(路由)
:路由是網(wǎng)關(guān)的基本單元,由ID、URI、一組Predicate、一組Filter組成,根據(jù)Predicate進(jìn)行匹配轉(zhuǎn)發(fā)。Predicate(謂語(yǔ)、斷言)
:路由轉(zhuǎn)發(fā)的判斷條件,目前SpringCloud Gateway
支持多種方式,常見(jiàn)如:Path
、Query
、Method
、Header
等。Filter(過(guò)濾器)
:過(guò)濾器是路由轉(zhuǎn)發(fā)請(qǐng)求時(shí)所經(jīng)過(guò)的過(guò)濾邏輯,可用于修改請(qǐng)求、響應(yīng)內(nèi)容。Spring Cloud GateWay 工作流程如下所示:
客戶端向Spring Cloud Gateway
發(fā)出請(qǐng)求。如果網(wǎng)關(guān)處理程序映射確定請(qǐng)求與路由匹配,則將其發(fā)送到網(wǎng)關(guān)Web處理程序。此處理程序運(yùn)行時(shí)通過(guò)特定于請(qǐng)求的篩選鏈發(fā)送請(qǐng)求。過(guò)濾器被虛線分隔的原因是過(guò)濾器可以在發(fā)送代理請(qǐng)求之前或之后執(zhí)行邏輯。執(zhí)行所有“預(yù)”過(guò)濾邏輯,然后發(fā)出代理請(qǐng)求。在發(fā)出代理請(qǐng)求后,將執(zhí)行“post”過(guò)濾器邏輯。
開(kāi)始使用
Spring Cloud Gateway
目前有兩種方式進(jìn)行配置:
application.yml
配置文件方式RouteLocator
方法返回值在本章會(huì)側(cè)重針對(duì)配置文件方式進(jìn)行講解,當(dāng)然RouteLocator
方式也會(huì)簡(jiǎn)單的告訴大家的使用方式。
添加依賴
添加Spring Cloud Gateway
相關(guān)依賴,pom.xml
如下所示:
//...省略部分內(nèi)容 <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <!--Spring Cloud Gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> //...省略部分內(nèi)容
Spring Cloud Gateway Predicates
在我們開(kāi)始本章內(nèi)容之前我們要來(lái)先了解下Spring Cloud Gateway
內(nèi)部提供的所有謂語(yǔ)、斷言
,這樣我們才能目標(biāo)性的進(jìn)行學(xué)習(xí),我整理出來(lái)了一個(gè)腦圖,如下所示:
每一個(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.yuqiyu.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.yuqiyu.com/api-boot-datasource-switch.html
,這里要注意完全匹配Path
的值時(shí)才會(huì)進(jìn)行路由轉(zhuǎn)發(fā)。
訪問(wèn)效果如下所示:
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.yuqiyu.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.yuqiyu.com predicates: - Before=2019-05-01T00:00:00+08:00[Asia/Shanghai]
在上面配置中,我們?cè)试S2019-05-01
日凌晨之前通過(guò)路由轉(zhuǎn)發(fā)到http://blog.yuqiyu.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.yuqiyu.com predicates: - After=2019-04-29T00:00:00+08:00[Asia/Shanghai]
在上面配置中允許2019-04-29
凌晨之后進(jìn)行轉(zhuǎn)發(fā)到http://blog.yuqiyu.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.yuqiyu.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.yuqiyu.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.yuqiyu.com predicates: - Cookie=hengboy, yuqiyu
在上面配置中,如果客戶端發(fā)送請(qǐng)求時(shí)攜帶了"hengboy=yuqiyu"
的Cookie信息,則允許請(qǐng)求轉(zhuǎn)發(fā)。
測(cè)試Cookie方式轉(zhuǎn)發(fā):
curl http://localhost:9090 --cookie "hengboy=yuqiyu"
通過(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.yuqiyu.com predicates: - Header=X-Request-Id, \d+
在上面配置中,如果X-Request-Id
的值為數(shù)字,那么就可以轉(zhuǎn)發(fā)到http://blog.yuqiyu.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ā),如果我們的接口只允許**.yuqiyu.com
域名進(jìn)行訪問(wèn),那么配置如下所示:
spring: cloud: gateway: routes: - id: blog uri: http://blog.yuqiyu.com predicates: - Host=**.yuqiyu.com
測(cè)試如下所示:
1. curl http://localhost:9090 -H "Host: yuqiyu.com" // 匹配 2. curl http://localhost:9090 -H "Host: api.yuqiyu.com" // 匹配 3. curl http://localhost:9090 -H "Host: admin.yuqiyu.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.yuqiyu.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ù)
spring: cloud: gateway: routes: - id: blog uri: http://blog.yuqiyu.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
spring: cloud: gateway: routes: - id: blog uri: http://blog.yuqiyu.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.yuqiyu.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 // 不匹配
Spring Cloud Gateway
可以限制允許訪問(wèn)接口的客戶端IP
地址,配置后只對(duì)指定IP
地址的客戶端進(jìn)行請(qǐng)求轉(zhuǎn)發(fā),配置如下所示:
spring: cloud: gateway: routes: - id: blog uri: http://blog.yuqiyu.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.yuqiyu.com predicates: - Query=author, hengboy - Query=yuqiyu - Method=GET - Cookie=hengboy, yuqiyu - 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ā)。
源碼位置
Gitee
:https://gitee.com/hengboy/spring-cloud-chapter/tree/master/SpringCloud/spring-cloud-gateway
ApiBoot
:https://gitee.com/hengboy/api-boot、https://github.com/hengboy/api-boot
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
新聞名稱:SpringCloudGateWay路由轉(zhuǎn)發(fā)規(guī)則介紹詳解
文章網(wǎng)址:http://redsoil1982.com.cn/article30/pooiso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、網(wǎng)站制作、微信公眾號(hào)、網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)