最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring cloud Gateway簡介及相關(guān)配置方法

 更新時間:2023年04月04日 10:41:01   作者:Doker 多克  
這篇文章主要介紹了Spring cloud Gateway簡介及相關(guān)配置方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

官網(wǎng):spring cloud gateway網(wǎng)關(guān) (spring.io)

Doker官網(wǎng):Doker 多克

Spring Cloud Gateway 的核心功能:

斷言(Predicate):參照 Java8 的新特性Predicate,允許開發(fā)人員匹配 HTTP 請求中的任何內(nèi)容,比如請求頭或請求參數(shù),最后根據(jù)匹配結(jié)果返回一個布爾值。
路由(route):由ID、目標(biāo)URI、斷言集合和過濾器集合組成。如果聚合斷言結(jié)果為真,則轉(zhuǎn)發(fā)到該路由。
過濾器(filter):可以在返回請求之前或之后修改請求和響應(yīng)的內(nèi)容。

1、路由 Route:

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ù)組,在請求傳遞過程中,對請求做一些修改

2、斷言 Predicate:

        Predicate 來自于 Java8 的接口。Predicate 接受一個輸入?yún)?shù),返回一個布爾值結(jié)果。該接口包含多種默認(rèn)方法來將 Predicate 組合成其他復(fù)雜的邏輯(比如:與,或,非)。
        Predicate 可以用于接口請求參數(shù)校驗、判斷新老數(shù)據(jù)是否有變化需要進行更新操作。Spring Cloud Gateway 內(nèi)置了許多 Predict,這些 Predict 的源碼在 org.springframework.cloud.gateway.handler.predicate 包中,有興趣可以閱讀一下

3、過濾器 filter:

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
SetPathSetPath=/app/{path}通過模板設(shè)置路徑,轉(zhuǎn)發(fā)的規(guī)則時會在路徑前增加app,{path}表示原請求路徑
RedirectTo重定向
RemoveRequestHeader去掉某個請求頭信息

注:當(dāng)配置多個filter時,優(yōu)先定義的會被調(diào)用,剩余的filter將不會生效

4、Predicate 斷言條件(轉(zhuǎn)發(fā)規(guī)則)介紹

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

Path 方式匹配轉(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類進行接收配置。

在上面的配置中,當(dāng)訪問http://localhost:9090/api-boot-datasource-switch.html時就會被自動轉(zhuǎn)發(fā)到http://blog.xx.com/api-boot-datasource-switch.html,這里要注意完全匹配Path的值時才會進行路由轉(zhuǎn)發(fā)。

訪問效果如下所示:

spring-cloud-gateway-path-predicate.png

RouteLocator 匹配路徑轉(zhuǎn)發(fā)

在上面的配置中,如果使用RouteLocator方式該怎么進行配置呢?

如下所示:

@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)部署有訪問時間限制的接口時,我們可以通過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 GatewayBefore斷言采用的ZonedDateTime進行匹配時間,這里要注意存在時區(qū)的問題,需要配置[Asia/Shanghai]作為中國時區(qū)。

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

After PredicateBefore配置使用一致,匹配某一個時間點之后允許路由轉(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凌晨之后進行轉(zhuǎn)發(fā)到http://blog.xx.com。

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

那如果是一個時間段內(nèi)允許請求轉(zhuǎn)發(fā),通過BeforeAfter組合配置也可以完成,不過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

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

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。

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

Spring Cloud Gateway可以根據(jù)發(fā)送請求的Header信息進行匹配轉(zhuǎn)發(fā),加入我們可以根據(jù)X-Request-Id的值進行匹配,如下所示:

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,我們通過如下方式進行測試:

curl http://localhost:9090 -H "X-Request-Id:123456"

如果頭信息為X-Request-Id:abc時,就會轉(zhuǎn)發(fā)失敗,出現(xiàn)404。

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

Spring Cloud Gateway可以根據(jù)Host主機名進行匹配轉(zhuǎn)發(fā),如果我們的接口只允許\*\*.xx.com域名進行訪問,那么配置如下所示:

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"          // 不匹配

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

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進行轉(zhuǎn)發(fā),那么我們再來通過POST請求進行測試:

curl -X POST http://localhost:9090

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

請求參數(shù) 方式匹配轉(zhuǎn)發(fā)

Spring Cloud GateWay還支持根據(jù)指定的參數(shù)進行匹配,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ā)失敗。

請求路徑 方式匹配轉(zhuǎn)發(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        // 不匹配

請求IP 方式匹配轉(zhuǎn)發(fā)

Spring Cloud Gateway可以限制允許訪問接口的客戶端IP地址,配置后只對指定IP地址的客戶端進行請求轉(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后才可以進行路由轉(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ī)則,在同一個路由內(nèi)存在多個Predicate時,同時滿足規(guī)則后請求才會被路由轉(zhuǎn)發(fā)。

參考:
Spring cloud網(wǎng)關(guān)gateway進行websocket路由轉(zhuǎn)發(fā)規(guī)則配置過程

http://m.fzitv.net/article/280022.htm

到此這篇關(guān)于Spring cloud Gateway 詳解及相關(guān)配置的文章就介紹到這了,更多相關(guān)Spring cloud Gateway配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 兩種Eclipse部署動態(tài)web項目方法

    兩種Eclipse部署動態(tài)web項目方法

    這篇文章主要介紹了兩種Eclipse部署動態(tài)web項目方法,需要的朋友可以參考下
    2015-11-11
  • Servlet實現(xiàn)多文件上傳功能

    Servlet實現(xiàn)多文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了Servlet實現(xiàn)文件上傳功能,還可以實現(xiàn)Servlet多文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Java StringBuffer與StringBuilder有什么區(qū)別

    Java StringBuffer與StringBuilder有什么區(qū)別

    當(dāng)對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder類,和String類不同的是,StringBuffer和 StringBuilder類的對象能夠被多次的修改,并且不產(chǎn)生新的未使用對象,本篇我們來分析分析它們的區(qū)別
    2023-01-01
  • Java中LocalDate的詳細(xì)方法舉例總結(jié)

    Java中LocalDate的詳細(xì)方法舉例總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java中LocalDate詳細(xì)方法舉例的相關(guān)資料,LocalDate主要是用來處理日期的類,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

    flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

    大家在平時開發(fā)自己寫SQL語句忘記在所有環(huán)境執(zhí)行,需要新增環(huán)境做數(shù)據(jù)遷移,那么遇到這樣的問題該如何解決呢?本文通過場景分析給大家介紹java 自動升級SQL腳本的策略,感興趣的朋友一起看看吧
    2021-07-07
  • SpringBoot實現(xiàn)簡單文件上傳功能

    SpringBoot實現(xiàn)簡單文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了SpringBoot實現(xiàn)簡單文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • springboot訪問靜態(tài)資源遇到的坑及解決

    springboot訪問靜態(tài)資源遇到的坑及解決

    這篇文章主要介紹了springboot訪問靜態(tài)資源遇到的坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java基礎(chǔ)--反射機制

    Java基礎(chǔ)--反射機制

    本文主要介紹了Java反射機制的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • JAVA 使用正則提取A標(biāo)簽以及href鏈接

    JAVA 使用正則提取A標(biāo)簽以及href鏈接

    這篇文章主要介紹了JAVA 使用正則提取A標(biāo)簽以及href鏈接的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java 創(chuàng)建線程的幾種方式

    java 創(chuàng)建線程的幾種方式

    本文主要介紹了java中創(chuàng)建線程的幾種方式。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02

最新評論

临洮县| 抚松县| 大理市| 沾益县| 滨海县| 前郭尔| 福建省| 行唐县| 怀仁县| 古浪县| 德江县| 萨嘎县| 湖南省| 本溪市| 那坡县| 玉林市| 阜阳市| 交城县| 马公市| 大庆市| 鄂伦春自治旗| 花莲县| 淮北市| 盐城市| 蕲春县| 北流市| 同心县| 永修县| 天祝| 林甸县| 石河子市| 珠海市| 彰武县| 酉阳| 耿马| 瓦房店市| 许昌县| 彭山县| 都江堰市| 广西| 六盘水市|