搶先一步
VMware 提供培訓和認證,以加速您的進展。
了解更多Spring Cloud Gateway 4.0 終於推出了!感謝我們社群的貢獻,我們引入了新功能和有趣的篩檢程式。
這篇部落格文章詳細介紹了值得注意的新功能,並解釋了包含在內的一些新篩檢程式、它們如何運作以及您如何使用它來更深入了解您的應用程式。
首先,讓我們來談談快取!快取是一個複雜的問題,這就是為什麼我們引入了兩個與其相關的新篩檢程式,但請注意,這些篩檢程式可能會使閘道記憶體受限,因此請謹慎使用它們。
如果不正確地操作請求正文可能會導致問題,因此我們為您簡化了操作;透過此篩檢程式,我們提供了在請求正文傳送到下游之前快取它的可能性,並從交換屬性中取得該正文。它將在 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)。
有時您的閘道會取用您知道其回應不會隨時間變更的服務。為了提高效能並避免每次點擊都向下游取得相同的回應,我們新增了一個新的篩檢程式,允許在本機快取回應正文和標頭。
這項新功能是在全域層級實作的,但也提供在路由層級覆寫全域組態的功能,以便為那些您知道需要特殊處理的路由設定特定的行為。
有一些條件必須考慮到
Cache-Control
標頭允許的情況下才會快取。這表示它不具有以下任何值:請求中存在的 no-store
、回應中存在的 no-store
或 private
。此外,如果回應已經快取,並且使用 Cache-Control
標頭中的 no-cache
值執行新的請求,它將傳回狀態碼為 HTTP 304 (Not Modified) 的無正文回應。要啟用此全域快取篩檢程式,只需將以下屬性設定為 true
:spring.cloud.gateway.filter.local-response-cache.enabled
我們提供了一些組態屬性來管理回應快取應如何運作,使用 spring.cloud.gateway.filter.local-response-cache.size
您可以設定快取的最大大小以逐出條目,它採用 KB
、MB
和 GB
的大小格式;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 分鐘的存活時間,且沒有大小限制。
如前所述,我們提供了為每個路由實作篩檢程式來覆寫全域組態的可能性。請注意,必須啟用全域篩檢程式才能設定每個路由的組態!路由組態接受第一個參數來覆寫此路由的快取最大大小以逐出條目(大小格式為 KB
、MB
和 GB
),以及第二個參數來覆寫快取條目的到期時間(以 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
組態參數中設定的秒數,並且在後續呼叫中,將使用回應到期前的剩餘秒數重新計算此值。
篩檢程式的名稱幾乎解釋了它本身,它與 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
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 的商業平台。