基於雲原生網關的流量防護實踐

背景

在分佈式系統架構中,每個請求都會經過很多層處理,比如從入口網關再到 Web Server 再到服務之間的調用,再到服務訪問緩存或 DB 等存儲。在下圖流量防護體系中,我們通常遵循流量漏斗原則進行流量防護。在流量鏈路的每一層,我們都需要進行鍼對性的流量防護與容錯手段,來保障服務的穩定性;同時,我們要儘可能地將流量防護進行前置,比如將一部分 HTTP 請求的流量控制前置到網關層,提前將一部分流量進行控制,這樣可以避免多餘的流量打到後端,對後端造成壓力同時也造成資源的浪費,爲此,在網關側做流量防護是十分有必要的。

在傳統的流量網關場景下,對流量進行訪問控制是一個很常見的需求。比如在 nginx 中,limit_req 就是一個最爲常見的限流配置,而在 Envoy 中,也支持本地以及全局兩種模式的限流,但是二者均有其侷限性。在功能的豐富度上,二者不及常見的限流組件開源項目,如 Sentinel 、Hystrix 等,在實際的使用場景中,實用性也很弱,比如不支持無性能損耗的集羣限流等等。

雲原生網關的流量防護功能,底層使用了 Sentinel 內核,並做了一定的強化和改造。Sentinel 是以流量與容錯爲切入點,從流量控制、不穩定調用隔離、熔斷降級、熱點流量防護、系統自適應保護、集羣流控等多個維度來幫助保障服務和網關的穩定性,同時提供秒級的流量監控分析功能。其商業化產品不僅在阿里內部淘寶、天貓等電商領域有着廣泛的應用,在互聯網金融、在線教育、遊戲、直播行業和其他大型政央企行業也有着大量的實踐。

雲原生網關作爲集安全、流量、微服務三位於一體的下一代雲上網關,在誕生之初,就被賦予了全場景使用的一個定位,爲此流量防護也是其必備的一個能力,在流量防護能力上,具備以下優勢:

  • 具備與流行的流量防護項目如 Sentinel、Hystrix 等同等豐富的流量防護功能,並且還在不斷迭代更新中。
  • 天然支持均攤式的集羣流控,使得用戶無需關心網關以及 Upstream 服務的節點數。
  • 提供配套的秒級監控,並支持 QPS、拒絕 QPS 、異常 QPS 、RT 以及併發數等豐富的流量指標,同時支持歷史數據的查看,便捷地實現先觀測,再配防護規則的使用路徑。
  • 流量防護規則秒級生效,配置防護規則後,無需等待,秒級生效。

Sentinel 流量模型介紹

如下圖所示,流量防護是指,針對不同的流量,設置一道適合的屏障策略,在該屏障的觀測下,一旦判定該流量不能被通過,應該及時攔截,從而達到保護網關、以及後端 Upstream 服務的作用。

雲原生網關目前支持 QPS 限流、併發控制、熔斷三種不同的流量防護能力,本文將從這三個功能分別去闡述其具體的效果,以及適用的場景。

  • QPS 限流

這是流量防護最通用的一個場景,顧名思義,就是限制某個路由的流量,使其只能在一定的速率內訪問網關,防止某個路由流量激增,造成後端服務的崩潰。雲原生網關不僅支持路由級別的限流,而且天然支持均攤式的集羣流控,用戶無需關心網關節點的數量或者後端服務節點的數量,只需要配置一個總體的閾值,就可以輕鬆實現對某個路由的總體閾值限流。

  • 併發控制

併發控制的具體實現,是通過實時維護一個併發值(這個值指的是一秒內,該路由流量的最大並行值,即未完成的請求數量),一旦下一個請求超過了設定的閾值,就攔截該請求。該功能不同於 QPS 限流,即使是在 QPS 較低的場景下,也能保證關鍵的資源,不被持續累積的慢調用所佔用,而導致服務不可用,比如後端 Upstream 服務的線程池以及數據庫資源等等,假設長期被佔用,就會導致該 Upstream 服務出現異常。和 QPS 限流類似,雲原生網關天然支持均攤式集羣併發限流,只需配置一個總體的併發閾值,就可以實現對某個路由的總體併發控制。

  • 熔斷

在 Sentinel 、Hystrix 等限流項目中,都能見到該功能,就如字面上的意義,熔斷是指,在路由的流量出現了某個異常狀態,需要及時熔斷該流量,從而保證與該路由相關 Upstream 服務能夠高效穩定的運行,而不受某個異常路由流量的影響。

熔斷機制背後對應熔斷器模型 (Circuit Breaker)。當調用處於某種不穩態(通常是出現異常或慢調用)達到一定程度(通常關注比例而不是絕對量),熔斷開啓 (OPEN),所有的請求都會 fallback 掉;過一段時間後進入探測恢復階段 (HALF-OPEN),放過一定數量的請求,以這些請求的情況來 indicate 下游服務的恢復情況,若這些請求達到穩態,則恢復對應調用 (CLOSED);否則重回熔斷狀態,具體原理如下圖所示:

另外,雲原生網關的流量防護能力底層是基於 Sentinel 的毫秒級滑動窗口精確統計,爲此,雲原生網關的流量防護功能界面也配套了一個秒級監控系統,可以通過觀測=>發現問題=>創建防護規則這個使用路徑去更好地在雲原生網關上創建流量防護規則。

如何在雲原生網關上進行流量防護

QPS 限流

下面,我們將動手去實踐,在雲原生網關上去使用上述的三大流量防護功能。

首先,進入到雲原生網關實例中的路由配置界面,選擇“策略配置”裏的“限流”選項,手動給這個路由注入一個 QPS 10000 左右的流量,在配套的秒級監控可以看到 5 分鐘內該路由的 QPS 情況。

在秒級監控的下方,可以看到流控規則、併發規則,熔斷規則三個配置項,首先先配置一條限流規則,具體參數如下圖所示:

打開開啓開關並點擊保存按鈕,就順利加入了一個 QPS 限流策略,這個策略的含義是,當路由流量的總 QPS 達到 5000 的時候,統計窗口內下一個到來的流量會被拒絕,拒絕的行爲是,返回一個HTTP包,返回碼是 429 ,內容是一個 JSON 格式的文本,內容是:

{
  "context": "just for test"
}

此時再返回查看秒級監控,就可以看到如下的曲線圖:

併發控制

併發規則也是類似,只不過,控制值由 QPS 變成併發數,具體的參考配置參數如下:

 

返回查看秒級監控,既可以看到以下的結果:

 

熔斷

熔斷規則的配置較爲複雜,具體的含義可以查看配置界面的說明,具體的參考配置如下:

 

這個規則的具體含義是,在 20 秒的統計窗口內,從第 5 個請求之後,開始統計慢調用的比例,一旦比例超過 20% ,立馬熔斷該路由的流量,其中慢調用的定義爲 RT 超過 1 ms 的請求。配置完成之後,監控的表現如下圖的所示:

 

上述的例子只是爲了演示效果,在實際生產環境中,需要更爲謹慎的去定義慢調用比例以及熔斷時長等參數,否則可能會導致後端服務整體不可用,是一個風險較高的流量防護功能。除了慢調用比例之外,還支持異常比例的熔斷條件判斷,異常的定義是指 HTTP 調用發生 5XX 的情況。

總結

本文詳盡地介紹瞭如何在雲原生網關上做流量防護,包括在不同的場景下該配置何種防護規則,並給出了詳細的使用路徑,可以從中體驗出雲原生網關的流量防護功能相對於其它網關產品限流功能的優勢。作爲雲上網關的核心功能之一,後續我們也會持續強化流量防護功能,也歡迎大家持續關注阿里雲官網的 MSE 微服務引擎產品動態。

作者:塗鴉

點擊立即免費試用雲產品 開啓雲上實踐之旅!

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章