Spring Cloud Gateway 4.0 上有趣的新篩檢程式

工程 | Marta Medio | 2023 年 1 月 18 日 | ...

Spring Cloud Gateway 4.0 終於推出了!感謝我們社群的貢獻,我們引入了新功能和有趣的篩檢程式。

這篇部落格文章詳細介紹了值得注意的新功能,並解釋了包含在內的一些新篩檢程式、它們如何運作以及您如何使用它來更深入了解您的應用程式。

首先,讓我們來談談快取!快取是一個複雜的問題,這就是為什麼我們引入了兩個與其相關的新篩檢程式,但請注意,這些篩檢程式可能會使閘道記憶體受限,因此請謹慎使用它們。

CacheRequestBody

如果不正確地操作請求正文可能會導致問題,因此我們為您簡化了操作;透過此篩檢程式,我們提供了在請求正文傳送到下游之前快取它的可能性,並從交換屬性中取得該正文。它將在 ServerWebExchange.getAttributes() 中以 ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR 中定義的鍵提供,以便在稍後的篩檢程式中使用。

要設定它,只需指示要將其轉換成的正文類型的類別即可

spring:
  cloud:
    gateway:
      routes:
      - id: cache_request_body_route
        uri: http://downstream
        predicates:
        - Path=/get/**
        filters:
        - name: CacheRequestBody
          args:
            bodyClass: java.lang.String

此篩檢程式僅適用於 HTTP 請求(包括 HTTPS)。

LocalCacheResponseBody

有時您的閘道會取用您知道其回應不會隨時間變更的服務。為了提高效能並避免每次點擊都向下游取得相同的回應,我們新增了一個新的篩檢程式,允許在本機快取回應正文和標頭。

這項新功能是在全域層級實作的,但也提供在路由層級覆寫全域組態的功能,以便為那些您知道需要特殊處理的路由設定特定的行為。

有一些條件必須考慮到

  • 它只會快取無正文的 GET 請求。
  • 它只會快取具有以下狀態碼的回應:HTTP 200 (OK)、HTTP 206 (Partial Content) 和 HTTP 301 (Moved Permanently)。
  • 我們遵循 HTTP Cache-Control 規範,因此只有在 Cache-Control 標頭允許的情況下才會快取。這表示它不具有以下任何值:請求中存在的 no-store、回應中存在的 no-storeprivate。此外,如果回應已經快取,並且使用 Cache-Control 標頭中的 no-cache 值執行新的請求,它將傳回狀態碼為 HTTP 304 (Not Modified) 的無正文回應。

要啟用此全域快取篩檢程式,只需將以下屬性設定為 truespring.cloud.gateway.filter.local-response-cache.enabled

我們提供了一些組態屬性來管理回應快取應如何運作,使用 spring.cloud.gateway.filter.local-response-cache.size 您可以設定快取的最大大小以逐出條目,它採用 KBMBGB 的大小格式;spring.cloud.gateway.filter.local-response-cache.timeToLive 屬性設定快取條目的到期時間,以 s 表示秒,m 表示分鐘,h 表示小時。

spring:
  cloud:
    gateway:
      filter:
	  local-response-cache:
	    enabled: true
	    timeToLive: 20m
	    size: 6MB

如果未設定這些參數,但已啟用啟用全域篩檢程式的屬性,則 Gateway 預設會為快取的回應設定 5 分鐘的存活時間,且沒有大小限制。

如前所述,我們提供了為每個路由實作篩檢程式來覆寫全域組態的可能性。請注意,必須啟用全域篩檢程式才能設定每個路由的組態!路由組態接受第一個參數來覆寫此路由的快取最大大小以逐出條目(大小格式為 KBMBGB),以及第二個參數來覆寫快取條目的到期時間(以 s 表示秒,m 表示分鐘,h 表示小時)

spring:
 cloud:
   gateway:
     routes:
     - id: local_response_cache_get_route
       uri: http://downstream
       predicates:
       - Path=/get/data
       filters:
       - LocalResponseCache=10s,10MB

此功能背後一個有趣的事情是,它還實作了 HTTP Cache-Control 標頭中 max-age 值的計算。因此,如果原始回應中存在 max-age,則該值將被重寫為 timeToLive 組態參數中設定的秒數,並且在後續呼叫中,將使用回應到期前的剩餘秒數重新計算此值。

AddRequestHeadersIfNotPresent

篩檢程式的名稱幾乎解釋了它本身,它與 AddRequestHeader 的運作方式非常相似,但與 AddRequestHeader 不同的是,它只會在標頭尚未出現在請求中時才新增標頭。否則,將傳送用戶端請求中的原始值。

它採用以冒號分隔的名稱和值對的集合

spring:
 cloud:
   gateway:
     routes:
     - id: add_request_header_route
       uri: http://downstream
       predicates:
       - Path=/colors
       filters:
       - AddRequestHeadersIfNotPresent=X-Request-Color:blue,X-Header-Color:red

它也支援用於比對路徑或主機的 URI 變數

spring:
 cloud:
   gateway:
     routes:
     - id: add_request_header_route
       uri: http://downstream
       predicates:
       - Path=/colors/{segment}
       filters:
       - AddRequestHeadersIfNotPresent=X-Request-Red:blue-{segment}

您也可以設定多值標頭!只需多次新增標頭名稱/值即可

spring:
 cloud:
   gateway:
     routes:
     - id: add_request_header_route
       uri: http://downstream
       predicates:
       - Path=/colors/
       filters:
       - AddRequestHeadersIfNotPresent=X-Request-Color:blue,X-Request-Color:green

RemoveJsonAttributesResponseBody

JSON 是最常用的資料表示格式之一,這就是為什麼我們想要新增更多特定的功能來處理此格式的回應。此篩檢程式提供了一種方便的方法,可透過從 JSON 正文內容中刪除屬性來對其進行轉換。

它採用要搜尋的屬性名稱集合,清單中的最後一個可選參數可以是布林值,用於僅在根層級移除屬性(如果未出現在參數組態的末尾,則為預設值 false)或遞迴地移除(true)。

spring:
 cloud:
   gateway:
     routes:
     - id: remove_json_attributes_route
       uri: https://downstream
 	 predicates:
       - Path=/json/
       filters:
       - RemoveJsonAttributesResponseBody=created_date,color

上述組態將從 JSON 內容正文中移除屬性,但僅在根層級移除。

spring:
 cloud:
   gateway:
     routes:
     - id: remove_json_attributes_route
       uri: https://downstream
 	 predicates:
       - Path=/json/
       filters:
       - RemoveJsonAttributesResponseBody=created_date,color,true

在結尾新增該 true 屬性將從 JSON 內容正文的任何層級移除屬性。

這些篩檢程式新增了強大的新功能。我們很想聽聽您們的意見,了解它們如何支援您的使用案例,以及我們如何提高您的生產力。您可以在其參考文件中找到有關此新篩檢程式和其他功能的更多資訊。

感謝所有透過報告和提取請求做出貢獻的人!

其他資源

想了解更多關於 Spring Cloud 的資訊嗎?請透過線上方式加入我們的 SpringOne!想了解更多關於 Spring Cloud Gateway 的產品嗎?請查看 我們支援 Kubernetes 的商業平台

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

搶先一步

VMware 提供培訓和認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部