中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springcloud?Gateway相關配置方法是什么

發布時間:2023-04-04 15:39:05 來源:億速云 閱讀:218 作者:iii 欄目:開發技術

這篇“Springcloud Gateway相關配置方法是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Springcloud Gateway相關配置方法是什么”文章吧。

    Spring Cloud Gateway 的核心功能:

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

    1、路由 Route:

    Route 主要由 路由id、目標uri、斷言集合和過濾器集合組成,那我們簡單看看這些屬性到底有什么作用。
    (1)id:路由標識,要求唯一,名稱任意(默認值 uuid,一般不用,需要自定義)
    (2)uri:請求最終被轉發到的目標地址
    (3)order: 路由優先級,數字越小,優先級越高
    (4)predicates:斷言數組,即判斷條件,如果返回值是boolean,則轉發請求到 uri 屬性指定的服務中
    (5)filters:過濾器數組,在請求傳遞過程中,對請求做一些修改

    2、斷言 Predicate:

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

    3、過濾器 filter:

    Gateway 過濾器的生命周期:
    PRE:這種過濾器在請求被路由之前調用。我們可利用這種過濾器實現身份驗證、在集群中選擇請求的微服務、記錄調試信息等。
    POST:這種過濾器在路由到微服務以后執行。這種過濾器可用來為響應添加標準的 HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。
    Gateway 過濾器從作用范圍可分為兩種:
    GatewayFilter:應用到單個路由或者一個分組的路由上(需要在配置文件中配置)
    GlobalFilter:應用到所有的路由上(無需配置,全局生效)
    (1)局部過濾器 GatewayFilter:
            Spring Cloud Gateway 中內置了許多的局部過濾器;局部過濾器需要在指定路由配置才能生效,默認是不生效的

    (2)自定義局部過濾器:
            雖說內置的過濾器能夠解決很多場景,但是難免還是有些特殊需求需要定制一個過濾器,下面就來介紹一下如何自定義局部過濾器。 

      (3) GlobalFilter 全局過濾器:
            
    全局過濾器應用全部路由上,無需開發者配置,Spring Cloud Gateway 也內置了一些全局過濾器。GlobalFilter 的功能其實和 GatewayFilter 是相同的,只是 GlobalFilter 的作用域是所有的路由配置,而不是綁定在指定的路由配置上。多個 GlobalFilter 可以通過 @Order 或者 getOrder() 方法指定執行順序,order值越小,執行的優先級越高。
     注意,由于過濾器有 pre 和 post 兩種類型,pre 類型過濾器如果 order 值越小,那么它就應該在pre過濾器鏈的頂層,post 類型過濾器如果 order 值越小,那么它就應該在 post 過濾器鏈的底層

       (4) 過濾器規則(Filter)

    過濾規則實例說明
    PrefixPath- PrefixPath=/app在請求路徑前加上app
    RewritePath- RewritePath=/test, /app/test訪問localhost:9022/test,請求會轉發到localhost:8001/app/test
    SetPathSetPath=/app/{path}通過模板設置路徑,轉發的規則時會在路徑前增加app,{path}表示原請求路徑
    RedirectTo
    重定向
    RemoveRequestHeader
    去掉某個請求頭信息

    注:當配置多個filter時,優先定義的會被調用,剩余的filter將不會生效

    4、Predicate 斷言條件(轉發規則)介紹

    Springcloud?Gateway相關配置方法是什么

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

    Path 方式匹配轉發

    通過Path轉發示例,我們講解下上面的兩種配置,分別是application.yml以及RouteLocator

    配置文件匹配地址轉發

    我們在application.yml配置文件內添加對應的路由配置,如下所示:

    spring:
     
      application:
     
        name: spring-cloud-gateway-sample
     
      cloud:
     
        gateway:
     
          routes:
     
            - id: blog
     
              uri: http://blog.xx.com
     
              predicates:
     
                # 匹配路徑轉發
     
                - Path=/api-boot-datasource-switch.html
     
    # 端口號
     
    server:
     
      port: 9090

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

    • id:路由的ID

    • uri:匹配路由的轉發地址

    • predicates:配置該路由的斷言,通過PredicateDefinition類進行接收配置。

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

    訪問效果如下所示:

    Springcloud?Gateway相關配置方法是什么

    spring-cloud-gateway-path-predicate.png

    RouteLocator 匹配路徑轉發

    在上面的配置中,如果使用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 方式匹配轉發

    當部署有訪問時間限制的接口時,我們可以通過Before Predicate來完成某一個時間點之前允許訪問,過時后則不允許轉發請求到具體的服務,配置如下所示:

    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日凌晨之前通過路由轉發到http://blog.xx.com,通過查看org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory源碼我們發現,Spring Cloud GatewayBefore斷言采用的ZonedDateTime進行匹配時間,這里要注意存在時區的問題,需要配置[Asia/Shanghai]作為中國時區。

    After 方式匹配轉發

    After PredicateBefore配置使用一致,匹配某一個時間點之后允許路由轉發,如下所示配置:

    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凌晨之后進行轉發到http://blog.xx.com

    Between 方式匹配轉發

    那如果是一個時間段內允許請求轉發,通過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凌晨之前請求轉發到http://blog.xx.com

    Cookie 方式匹配轉發

    Spring Cloud Gateway 還提供了根據Cookie值的方式匹配轉發請求,如果請求中所攜帶的Cookie值與配置的Predicate匹配,那么就可以被允許轉發到指定地址,如下所示:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.xx.com
              predicates:
                - Cookie=hengboy, leo

    在上面配置中,如果客戶端發送請求時攜帶了"hengboy=leo"的Cookie信息,則允許請求轉發。

    **測試Cookie方式轉發:**

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

    通過上面方式我們是可以成功轉發請求的,如果我們修改Cookie的值,就會導致無法轉發,出現404。

    Header 方式匹配轉發

    Spring Cloud Gateway可以根據發送請求的Header信息進行匹配轉發,加入我們可以根據X-Request-Id的值進行匹配,如下所示:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.xx.com
              predicates:
                - Header=X-Request-Id, \d+

    在上面配置中,如果X-Request-Id的值為數字,那么就可以轉發到http://blog.xx.com,我們通過如下方式進行測試:

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

    如果頭信息為X-Request-Id:abc時,就會轉發失敗,出現404。

    Host 方式匹配轉發

    Spring Cloud Gateway可以根據Host主機名進行匹配轉發,如果我們的接口只允許\*\*.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"          // 不匹配

    請求方式 方式匹配轉發

    Rest請求風格的接口內往往會存在多種請求方式的接口,如果我們的接口只允許POST請求訪問,那么配置如下所示:

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

    發送GET請求測試:

    ~ curl http://localhost:9090
    {"timestamp":"2019-04-29T06:27:41.121+0000","path":"/","status":404,"error":"Not Found","message":null}

    我們的請求并未被Spring Cloud Gateway進行轉發,那么我們再來通過POST請求進行測試:

    curl -X POST http://localhost:9090

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

    請求參數 方式匹配轉發

    Spring Cloud GateWay還支持根據指定的參數進行匹配,Query方式的Predicate也有兩種方式匹配情況,如下所示:

    請求中存在xxx參數

       cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.xx.com
              predicates:
               - Query=xxx

    我們通過curl http://localhost:9090\?xxx\=123是可以被成功轉發的,只要參數存在xxx就會被成功轉發,否則出現404轉發失敗。

    請求中存在xxx參數且值為zzz

        cloud:
           gateway:
              routes:
                - id: blog
                 uri: http://blog.xx.com
                 predicates:
                    - Query=xxx, zzz

    根據上面配置,我們限定了參數xxx必須為zzz時才會被成功轉發,否則同樣會出現404抓發失敗。

    請求路徑 方式匹配轉發

    Spring Cloud Gateway提供了請求路徑變量方式匹配轉發,如下所示:

    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 方式匹配轉發

    Spring Cloud Gateway可以限制允許訪問接口的客戶端IP地址,配置后只對指定IP地址的客戶端進行請求轉發,配置如下所示:

    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則是子網掩碼。

    組合示例

    相同的Predicate也可以配置多個,請求的轉發是必須滿足所有的Predicate后才可以進行路由轉發,組合使用示例如下所示:

    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

    以上就是關于“Springcloud Gateway相關配置方法是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    壶关县| 古蔺县| 天峻县| 明光市| 乐陵市| 南川市| 大悟县| 克东县| 卢氏县| 沭阳县| 顺平县| 西城区| 织金县| 成都市| 山阳县| 万载县| 朔州市| 象山县| 雷山县| 吉木萨尔县| 永新县| 达孜县| 镶黄旗| 大邑县| 梓潼县| 志丹县| 贡嘎县| 大厂| 敖汉旗| 巨野县| 兴仁县| 紫阳县| 鄂伦春自治旗| 灵武市| 澄迈县| 万荣县| 资讯| 大冶市| 芦溪县| 阳曲县| 长顺县|