欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Cloud GateWay 路由轉(zhuǎn)發(fā)規(guī)則介紹詳解

 更新時(shí)間:2019年05月06日 10:46:39   作者:恒宇少年  
這篇文章主要介紹了Spring Cloud GateWay 路由轉(zhuǎn)發(fā)規(guī)則介紹詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

Spring在因Netflix開源流產(chǎn)事件后,在不斷的更換Netflix相關(guān)的組件,比如:Eureka、ZuulFeign、Ribbon等,Zuul的替代產(chǎn)品就是SpringCloud Gateway,這是Spring團(tuán)隊(duì)研發(fā)的網(wǎng)關(guān)組件,可以實(shí)現(xiàn)限流、安全認(rèn)證、支持長連接等新特性。

Spring Cloud Gateway

Spring Cloud GatewaySpringCloud的全新子項(xiàng)目,該項(xiàng)目基于Spring5.x、SpringBoot2.x技術(shù)版本進(jìn)行編寫,意在提供簡單方便、可擴(kuò)展的統(tǒng)一API路由管理方式。

概念解釋:

  • Route(路由):路由是網(wǎng)關(guān)的基本單元,由ID、URI、一組Predicate、一組Filter組成,根據(jù)Predicate進(jìn)行匹配轉(zhuǎn)發(fā)。
  • Predicate(謂語、斷言):路由轉(zhuǎn)發(fā)的判斷條件,目前SpringCloud Gateway支持多種方式,常見如:PathQuery、MethodHeader等。
  • Filter(過濾器):過濾器是路由轉(zhuǎn)發(fā)請(qǐng)求時(shí)所經(jīng)過的過濾邏輯,可用于修改請(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í)通過特定于請(qǐng)求的篩選鏈發(fā)送請(qǐng)求。過濾器被虛線分隔的原因是過濾器可以在發(fā)送代理請(qǐng)求之前或之后執(zhí)行邏輯。執(zhí)行所有“預(yù)”過濾邏輯,然后發(fā)出代理請(qǐng)求。在發(fā)出代理請(qǐng)求后,將執(zhí)行“post”過濾器邏輯。

開始使用

Spring Cloud Gateway目前有兩種方式進(jìn)行配置:

  • application.yml配置文件方式
  • 通過@Bean注解RouteLocator方法返回值

在本章會(huì)側(cè)重針對(duì)配置文件方式進(jìn)行講解,當(dāng)然RouteLocator方式也會(huì)簡單的告訴大家的使用方式。

添加依賴

添加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

在我們開始本章內(nèi)容之前我們要來先了解下Spring Cloud Gateway內(nèi)部提供的所有謂語、斷言,這樣我們才能目標(biāo)性的進(jìn)行學(xué)習(xí),我整理出來了一個(gè)腦圖,如下所示:

每一個(gè)Predicate的使用,你可以理解為:當(dāng)滿足這種條件后才會(huì)被轉(zhuǎn)發(fā),如果是多個(gè),那就是都滿足的情況下被轉(zhuǎn)發(fā)。

Path 方式匹配轉(zhuǎn)發(fā)

通過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

先來解釋下route的組成部分:

  • id:路由的ID
  • uri:匹配路由的轉(zhuǎn)發(fā)地址
  • predicates:配置該路由的斷言,通過PredicateDefinition類進(jìn)行接收配置。

在上面的配置中,當(dāng)訪問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ā)。

訪問效果如下所示:

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)部署有訪問時(shí)間限制的接口時(shí),我們可以通過Before Predicate來完成某一個(gè)時(shí)間點(diǎn)之前允許訪問,過時(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日凌晨之前通過路由轉(zhuǎn)發(fā)到http://blog.yuqiyu.com,通過查看org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory源碼我們發(fā)現(xiàn),Spring Cloud GatewayBefore斷言采用的ZonedDateTime進(jìn)行匹配時(shí)間,這里要注意存在時(shí)區(qū)的問題,需要配置[Asia/Shanghai]作為中國時(shí)區(qū)。

After 方式匹配轉(zhuǎn)發(fā)

After PredicateBefore配置使用一致,匹配某一個(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ā),通過BeforeAfter組合配置也可以完成,不過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ā)。

測試Cookie方式轉(zhuǎn)發(fā):

curl http://localhost:9090 --cookie "hengboy=yuqiyu"

通過上面方式我們是可以成功轉(zhuǎn)發(fā)請(qǐng)求的,如果我們修改Cookie的值,就會(huì)導(dǎo)致無法轉(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,我們通過如下方式進(jìn)行測試:

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)行訪問,那么配置如下所示:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - Host=**.yuqiyu.com

測試如下所示:

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)求訪問,那么配置如下所示:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - Method=POST

發(fā)送GET請(qǐng)求測試:

~ 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è)賮硗ㄟ^POST請(qǐng)求進(jìn)行測試:

curl -X POST http://localhost:9090

是可以被轉(zhuǎn)發(fā)到目標(biāo)地址uri的,不過我的這個(gè)博客是OSS部署的,阿里云限制了POST訪問,盡管如此我們也證明了可以轉(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

我們通過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等,測試如下所示:

~ curl http://localhost:9090/article/1			// 匹配
~ curl http://localhost:9090/article/abc		// 匹配
~ curl http://localhost:9090/article/1/1		// 不匹配

Spring Cloud Gateway可以限制允許訪問接口的客戶端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ā)。

源碼位置

Giteehttps://gitee.com/hengboy/spring-cloud-chapter/tree/master/SpringCloud/spring-cloud-gateway

ApiBoothttps://gitee.com/hengboy/api-boot、https://github.com/hengboy/api-boot

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot 實(shí)現(xiàn)程序的優(yōu)雅退出(詳細(xì)步驟)

    Spring Boot 實(shí)現(xiàn)程序的優(yōu)雅退出(詳細(xì)步驟)

    Spring Boot 為我們提供了優(yōu)雅退出的功能,使應(yīng)用程序能夠在關(guān)閉時(shí)正常處理完所有當(dāng)前請(qǐng)求,避免請(qǐng)求被中斷導(dǎo)致數(shù)據(jù)丟失或不一致等問題,本文將全面介紹如何在 Spring Boot 應(yīng)用程序中實(shí)現(xiàn)優(yōu)雅退出,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • java中的session對(duì)象如何獲取

    java中的session對(duì)象如何獲取

    這篇文章主要介紹了java中的session對(duì)象如何獲取,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java ObjectMapper使用詳解

    Java ObjectMapper使用詳解

    ObjectMapper類是Jackson的主要類,它可以幫助我們快速的進(jìn)行各個(gè)類型和Json類型的相互轉(zhuǎn)換,本文給大家介紹Java ObjectMapper的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Spring?MVC中的常用注解及用法小結(jié)

    Spring?MVC中的常用注解及用法小結(jié)

    這篇文章主要介紹了Spring?MVC中的常用注解及其用法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • Spring 依賴注入實(shí)現(xiàn)示例

    Spring 依賴注入實(shí)現(xiàn)示例

    這篇文章主要介紹了Spring 依賴注入實(shí)現(xiàn)示例的相關(guān)資料,幫助大家更好的理解和使用spring框架,感興趣的朋友可以了解下
    2020-11-11
  • java微信掃描公眾號(hào)二維碼實(shí)現(xiàn)登陸功能

    java微信掃描公眾號(hào)二維碼實(shí)現(xiàn)登陸功能

    這篇文章主要為大家詳細(xì)介紹了PHP微信掃描公眾號(hào)二維碼實(shí)現(xiàn)登陸功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java并發(fā)編程之ReentrantLock可重入鎖的實(shí)例代碼

    Java并發(fā)編程之ReentrantLock可重入鎖的實(shí)例代碼

    這篇文章主要介紹了Java并發(fā)編程之ReentrantLock可重入鎖的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Java的動(dòng)態(tài)綁定與雙分派_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java的動(dòng)態(tài)綁定與雙分派_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java的動(dòng)態(tài)綁定與雙分派,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • java中JsonObject與JsonArray轉(zhuǎn)換方法實(shí)例

    java中JsonObject與JsonArray轉(zhuǎn)換方法實(shí)例

    在項(xiàng)目日常開發(fā)中常常會(huì)遇到JSONArray和JSONObject的轉(zhuǎn)換,很多公司剛?cè)肼毜男∶刃聲?huì)卡在這里,下面這篇文章主要給大家介紹了關(guān)于java中JsonObject與JsonArray轉(zhuǎn)換方法的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Mapper層繼承BaseMapper<T>需要引入的pom依賴方式

    Mapper層繼承BaseMapper<T>需要引入的pom依賴方式

    這篇文章主要介紹了Mapper層繼承BaseMapper<T>需要引入的pom依賴方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論