91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Spring Cloud Gateway 之 Predict

發布時間:2020-08-09 20:51:44 來源:網絡 閱讀:308 作者:程序員果果 欄目:編程語言

Spring Cloud gateway工作流程

在之前的文章的Spring Cloud Gateway初體驗中,大家已經對Spring Cloud Gateway的功能有一個初步的認識,網關作為一個系統的流量的入口,有著舉足輕重的作用,通常的作用如下:

  • 協議轉換,路由轉發
  • 流量聚合,對流量進行監控,日志輸出
  • 作為整個系統的前端工程,對流量進行控制,有限流的作用
  • 作為系統的前端邊界,外部流量只能通過網關才能訪問系統
  • 可以在網關層做權限的判斷
  • 可以在網關層做緩存

Spring Cloud Gateway作為Spring Cloud框架的第二代網關,在功能上要比Zuul更加的強大,性能也更好。隨著Spring Cloud的版本迭代,Spring Cloud官方有打算棄用Zuul的意思。在筆者調用了Spring Cloud Gateway的使用和功能上,Spring Cloud Gateway替換掉Zuul的成本上是非常低的,幾乎可以無縫切換。Spring Cloud Gateway幾乎包含了zuul的所有功能。

Spring Cloud Gateway 之 Predict

如上圖所示,客戶端向Spring Cloud Gateway發出請求。 如果Gateway Handler Mapping確定請求與路由匹配(這個時候就用到predicate),則將其發送到Gateway web handler處理。 Gateway web handler處理請求時會經過一系列的過濾器鏈。 過濾器鏈被虛線劃分的原因是過濾器鏈可以在發送代理請求之前或之后執行過濾邏輯。 先執行所有“pre”過濾器邏輯,然后進行代理請求。 在發出代理請求之后,收到代理服務的響應之后執行“post”過濾器邏輯。這跟zuul的處理過程很類似。在執行所有“pre”過濾器邏輯時,往往進行了鑒權、限流、日志輸出等功能,以及請求頭的更改、協議的轉換;轉發之后收到響應之后,會執行所有“post”過濾器的邏輯,在這里可以響應數據進行了修改,比如響應頭、協議的轉換等。

在上面的處理過程中,有一個重要的點就是講請求和路由進行匹配,這時候就需要用到predicate,它是決定了一個請求走哪一個路由。

Predicate 介紹

Predicate 來源于 Java 8,是 Java 8 中引入的一個函數,Predicate 接受一個輸入參數,返回一個布爾值結果。該接口包含多種默認方法來將 Predicate 組合成其他復雜的邏輯(比如:與,或,非)。可以用于接口請求參數校驗、判斷新老數據是否有變化需要進行更新操作。

在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性實現了各種路由匹配規則,有通過 Header、請求參數等不同的條件來進行作為條件匹配到對應的路由。網上有一張圖總結了 Spring Cloud 內置的幾種 Predicate 的實現。

Spring Cloud Gateway 之 Predict

說白了 Predicate 就是為了實現一組匹配規則,方便讓請求過來找到對應的 Route 進行處理,接下來我們接下 Spring Cloud GateWay 內置幾種 Predicate 的使用。

Predicate 實戰

通過時間匹配

Predicate 支持設置一個時間,在請求進行轉發的時候,可以通過判斷在這個時間之前或者之后進行轉發。比如我們現在設置只有在2019年2月15日才會轉發到我的簡書地址,在這之前不進行轉發,我就可以這樣配置:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: http://httpbin.org
          predicates:
          - After=2018-02-15T00:00:00+08:00[Asia/Shanghai]

Spring 是通過 ZonedDateTime 來對時間進行的對比,ZonedDateTime 是 Java 8 中日期時間功能里,用于表示帶時區的日期與時間信息的類,ZonedDateTime 支持通過時區來設置時間,中國的時區是:Asia/Shanghai。

After Route Predicate 是指在這個時間之后的請求都轉發到目標地址。上面的示例是指,請求時間在 2019年2月15日0點0分0秒之后的所有請求都轉發到地址http://httpbin.org。+08:00是指時間和UTC時間相差八個小時,時間地區為Asia/Shanghai

添加完路由規則之后,訪問地址 http://127.0.0.1:8080/get 會自動轉發到 http://httpbin.org/get

Before Route Predicate 剛好相反,在某個時間之前的請求的請求都進行轉發。我們把上面路由規則中的 After 改為 Before,如下:

spring:
  cloud:
    gateway:
      routes:
        - id: before_route
          uri: http://httpbin.org
          predicates:
          - Before=2019-02-15T00:00:00+08:00[Asia/Shanghai]

就表示在2019-02-14之前可以進行路由,在這時間之后停止路由,修改完之后重啟項目再次訪問地址http://localhost:8080,頁面會報 404 沒有找到地址。

除過在時間之前或者之后外,Gateway 還支持限制路由請求在某一個時間段范圍內,可以使用 Between Route Predicate 來實現。

spring:
  cloud:
    gateway:
      routes:
        - id: between_route
          uri: http://httpbin.org
          predicates:
          - Between=2018-02-14T00:00:00+08:00[Asia/Shanghai], 2019-02-16T23:59:59+08:00[Asia/Shanghai]

這樣設置就意味著在 2019-02-14到2019-02-16 時間段內可以匹配到此路由,超過這個時間段范圍則不會進行匹配。通過時間匹配路由的功能很酷,可以用在限時搶購的一些場景中。

通過 Cookie 匹配

Cookie Route Predicate 可以接收兩個參數,一個是 Cookie name ,一個是正則表達式,路由規則會通過獲取對應的 Cookie name 值和正則表達式去匹配,如果匹配上就會執行路由,如果沒有匹配上則不執行。

spring:
  cloud:
    gateway:
      routes:
        - id: cookie_route
          uri: http://httpbin.org:80
          predicates:
          - Cookie=name, chengxuyuanguoguo

上面的配置中,請求帶有cookie名為name, cookie值為chengxuyuanguoguo 的請求將都會轉發到uri為 http://httpbin.org的地址上。

使用 curl 測試,命令行輸入:

curl http://127.0.0.1:8080/get --cookie "name=chengxuyuanguoguo"

則有正確返回,如果去掉--cookie "name=chengxuyuanguoguo",沒有匹配成功,出現 404 錯誤。

通過 Header 屬性匹配

Header Route Predicate 和 Cookie Route Predicate 一樣,也是接收 2 個參數,一個 header 中屬性名稱和一個正則表達式,這個屬性值和正則表達式匹配則執行。

spring:
  cloud:
    gateway:
      routes:
        - id: header_route
          uri: http://httpbin.org
          predicates:
          - Header=X-Request-Id, \d+

使用 curl 測試,命令行輸入:

curl http://127.0.0.1:8080/get  -H "X-Request-Id:111111" 

則正常返回,將參數 "X-Request-Id:111111" 改為 "X-Request-Id:xxxx" 再次執行時返回404。

通過 Host 匹配

Host Route Predicate 接收一組參數,一組匹配的域名列表,這個模板是一個 ant 分隔的模板,用.號作為分隔符。它通過參數中的主機地址作為匹配規則。

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

使用 curl 測試,命令行輸入:

curl http://127.0.0.1:8080/get  -H "Host:www.httpbin.com" 

測試上述 host 可匹配到 host_route 路由,去掉 host 參數則會報 404 錯誤。

通過請求方式匹配

可以通過是 POST、GET、PUT、DELETE 等不同的請求方式來進行路由。

spring:
  cloud:
    gateway:
      routes:
        - id: method_route
          uri: http://httpbin.org
          predicates:
          - Method=GET

使用 curl 測試,命令行輸入:

curl http://127.0.0.1:8080/get

測試返回正確,證明匹配到路由,再以 POST 的方式請求測試:

curl -X POST http://127.0.0.1:8080/get

返回 404 沒有找到,沒有匹配上路由。

通過請求路徑匹配

Path Route Predicate 接收一個匹配路徑的參數來判斷是否走路由。

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://httpbin.org
          predicates:
            - Path=/foo/{segment}

使用 curl 測試,命令行輸入:

curl http://127.0.0.1:8080/foo/1
curl http://127.0.0.1:8080/fee/1

測試第一命令可以正常獲取到頁面返回值,第二個命令報404,證明路由是通過指定路由來匹配。

通過請求參數匹配

Query Route Predicate 支持傳入兩個參數,一個是屬性名一個為屬性值,屬性值可以是正則表達式。

spring:
  cloud:
    gateway:
      routes:
        - id: query_route
          uri: http://httpbin.org
          predicates:
          - Query=foo

測試發現只要請求帶有 foo 參數即會匹配路由,不帶 foo 參數則會報 404 錯誤。

通過請求 ip 地址進行匹配

Predicate 也支持通過設置某個 ip 區間號段的請求才會路由,RemoteAddr Route Predicate 接受 cidr 符號(IPv4 或 IPv6 )字符串的列表(最小大小 1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子網掩碼)。

spring:
  cloud:
    gateway:
      routes:
        - id: remoteaddr_route
          uri: http://httpbin.org
          predicates:
          - RemoteAddr=172.16.1.73/24

使用 curl 測試,命令行輸入:

curl http://172.17.1.73:8080/get

測試返回正確,改為請求 127.0.0.1:8080/get 則會報 404 錯誤。

組合使用

Predicate還可以組合在一起使用。

spring:
  cloud:
    gateway:
      routes:
        - id: group_route
          uri: http://httpbin.org
          predicates:
          - Host=**.httpbin.com
          - Header=X-Request-Id, \d+
          - Cookie=name, chengxuyuanguoguo
          - After=2019-02-15T00:00:00+08:00[Asia/Shanghai]

使用 curl 測試,命令行輸入:

curl http://127.0.0.1:8080 -H "X-Request-Id:111111" -H "Host:www.httpbin.com" --cookie "name=chengxuyuanguoguo"

測試返回正確,錯誤的規則或去除一個規則,則會報 404 錯誤。

總結

Predict作為斷言,它決定了請求會被路由到哪個router 中。在斷言之后,請求會被進入到filter過濾器的邏輯,下篇文章將會介紹Spring Cloud Gateway過濾器相關的內容。

源碼:https://github.com/gf-huanchupk/SpringCloudLearning/tree/master/chapter13/springcloud-gateway-predict

歡迎關注我的公眾號《程序員果果》,關注有驚喜~~
Spring Cloud Gateway 之 Predict

向AI問一下細節

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

AI

崇左市| 秦安县| 车致| 克什克腾旗| 西盟| 会同县| 长宁区| 南阳市| 林甸县| 墨脱县| 广宗县| 呼玛县| 彭水| 宜兴市| 柘城县| 泸定县| 米林县| 贡山| 和林格尔县| 光山县| 卢氏县| 新余市| 古田县| 佳木斯市| 壶关县| 天津市| 彩票| 曲麻莱县| 遂宁市| 修水县| 永昌县| 裕民县| 邛崃市| 慈利县| 肃宁县| 仁化县| 桓仁| 五常市| 龙门县| 措美县| 磐安县|