Envoy 可以作為 Sevice Mesh 微服務框架中的代理實現方案,Rainbond 內建的微服務框架同樣基於 Envoy 實現。本文所描述的全侷限速實踐也是基於 Envoy 已有的方案所實現。
Envoy 全侷限速
儘管分散式熔斷器在大多數情況下控制分散式系統中的吞吐量非常有效,但有時它的效果並不是很好,這時候便需要全侷限速。最常見的情況是當大量主機轉發到少量主機並且平均請求延遲很短時(例如,傳送給資料庫伺服器的連線/請求)。若目標主機成為備機,則下游主機將壓垮上游叢集。在這種情況下,很難對每個下游主機配置足夠嚴格的熔斷器,使得系統可以平穩執行,同時,當系統開始出現故障時,仍然可以防止級聯故障。對於這種情況,全侷限速是一個很好的解決方案。
Envoy 全侷限速方案需要基於一個全域性 RLS(rate limit service)服務實現,RLS 被設計為一種為不同型別應用提供不同限速場景的 Go/gRPC 服務。
構建全侷限速服務
一種開箱即用的全侷限速服務已經被納入 Rainbond 內建的開源應用商店中,使用者可以基於以下操作一鍵安裝速率限制服務。
- 訪問內建的開源應用商店
選擇左側的 應用市場 標籤頁,在頁面中切換到 開源應用商店 標籤頁,搜尋關鍵詞 速率限制** 即可找速率限制服務。
- 一鍵安裝
點選速率限制服務右側的 安裝 可以進入安裝頁面,填寫簡單的資訊之後,點選 確定 即可開始安裝,頁面自動跳轉到拓撲檢視。
引數說明:
選擇項 | 說明 |
---|---|
團隊名稱 | 使用者自建的工作空間,以名稱空間隔離 |
叢集名稱 | 選擇速率限制服務被部署到哪一個 K8s 叢集 |
選擇應用 | 選擇速率限制服務被部署到哪一個應用,應用中包含有若干有關聯的元件 |
應用版本 | 選擇速率限制服務的版本,目前版本為 1.4.0 |
等待幾分鐘後,速率限制服務就會安裝完成,並執行起來。
全侷限速配置
通過在 Rate-limit-service
元件中編輯配置檔案 /data/ratelimit/config/config.yaml
,可以配置全侷限速標準。
預設配置內容如下:
domain: limit.common
descriptors:
- key: remote_address
rate_limit:
unit: second
requests_per_unit: 10
# Black list IP
- key: remote_address
value: 50.0.0.5
rate_limit:
unit: second
requests_per_unit: 0
在這一段配置中,定義了面向域名 domain
實現每秒允許 10 個請求通過的限速配置。
面向客戶端 IP 為 50.0.0.5
的情況,則實現每秒允許 0 個請求通過的限速配置,使用者可以理解為黑名單配置。
引用全侷限速服務
需要被限速的服務元件需要滿足以下條件:
-
安裝並配置 服務綜合網路治理外掛
-
依賴
Rate-limit-service
Rainbond 通過外掛機制擴充套件業務的運維能力,通過安裝 服務綜合網路治理外掛 ,可以在被限速業務的網路入口處擴充套件治理能力。服務綜合網路治理外掛 本質上擴充套件了 Envoy 能力,通過呼叫 Rate-limit-service
,實現全侷限速功能。
確保 OPEN_LIMIT(是否開啟限流)
選項為 YES
,
LIMIT_DOMAIN(對應限流規則的域名)
與上文中全侷限流配置中的 domian
一致。至此,完成了被限速服務一側的配置。
驗證
為了驗證限速是否生效,引入 Locust 壓力測試工具,向被限速業務不斷生成訪問請求。
應用預設全侷限速策略後,被限速業務在 40 RPS 的情況下限制了 74% 左右的總訪問數。
被拒絕的訪問,得到了 429 返回碼,並提示 Too Many Requests
,這是服務限速的標準返回模式。
被限速業務所安裝的 服務綜合網路治理外掛 支援動態配置。這意味著在不停止服務的情況下,只需要將 OPEN_LIMIT(是否開啟限流)
選項為 NO
並更新配置 ,即可關閉服務限速,訪問錯誤數將下降至 0。
全侷限速生效於被限速業務的網路入口,這意味著無論請求來自 Rainbond 部署的其他微服務元件,還是來自閘道器以外的外部訪問,其請求都會被限速。
總結
全侷限速是一種在突發流量激增場景中保護微服務的有效手段,Rainbond 內建的微服務框架支援符合 RLS 規範的 Envoy 服務限速方案。配置起來很簡單,並且支援動態變更,本文中的示例力爭以直觀的方式為大家展現了全侷限速在 Rainbond 體系中的配置實踐。