在面臨高流量衝擊、服務過載、資源耗盡或惡意攻擊的情況下,通過配置限流防護,可以實現對流量的精準控制,從而保護後端服務的穩定性,降低成本並提升使用者體驗。本文介紹限流防護的概念、限流方式以及本地限流和全域限流的實現原理。
限流防護的概念
限流防護是一種限制發送到服務端的請求數量的機制。它指定用戶端在給定時間段內可以向服務端發送的最大請求數,通常表示為一段時間內的請求數,例如每分鐘300個請求或每秒10個請求等。限流的目的是防止服務因來自同一用戶端IP或來自任何用戶端的全域請求而過載。
以每分鐘300個請求的限流機製為例,向服務發送301個請求,限流器將拒絕第301個請求。同時,限流器會返回一個429 HTTP狀態代碼(Too Many Requests),並在請求到達服務之前進行拒絕。
限流防護的方式
網格代理Envoy支援兩種類型的限流防護方式:本地限流和全域限流。本地限流用於限制每個服務執行個體的請求速率。全域限流使用全域的gRPC服務為整個網格提供限流能力。本地限流可以與全域限流結合使用,以提供不同層面的限流功能。
方式 | 說明 | 相關文檔 |
本地限流 |
| |
全域(或分布式)限流 |
|
本地限流的工作原理
Envoy代理使用令牌桶演算法實現本地限流。令牌桶演算法是一種限制發送到服務端的請求數量的方法,基於一定數量的令牌桶。儲存桶以恒定的速率不斷填充令牌,當向服務發送請求時,會從儲存桶中刪除一個令牌。如果儲存桶為空白,則請求將被拒絕。通常需要指定以下內容:
桶被填充的速率(填充間隔)。
每個填充間隔添加到桶中的令牌數。
預設情況下,當速率限制器拒絕請求,並設定x-envoy-ratelimited響應標題時,Envoy會發送狀態代碼為429的HTTP響應。您也可以將速率限制器配置為返回自訂HTTP狀態碼,並配置其他響應標題。
此外,使用速率限制器有以下兩個重要概念:
啟用速率限制器:表示正在對速率限制器進行配置,但速率限制器並未應用於請求。
執行速率限制器:表示對請求應用或執行速率限制器。
將這兩個值表示為傳入請求的百分比,例如可以設定為10%的請求啟用速率限制器,並為5%的請求強制執行。按照這種方式,可以逐步推出限流,並在對所有請求強制執行之前對其進行測試。
全域限流的工作原理
在Envoy代理中,全域限流是一種用於控制整個服務網格中請求速率的機制。它基於Envoy的限流服務(Rate Limit Service)實現。該服務可以集中處理來自整個服務網格中的流量,並根據預先定義的規則和配額來限制請求的速率。
全域限流的配置涉及兩個部分:Envoy的rate_limits過濾器和限流服務的配置。
rate_limits過濾器中包含
actions
列表。Envoy會嘗試將每個請求與rate_limits過濾器中的每個action進行匹配。每個action會產生一個descriptor描述符。描述符是與action對應的一組描述符條目。每個描述符條目是一個索引值對,通常表示為"descriptor-key-1": "descriptor-value-1"
、"descriptor-key-2": "descriptor-value-2"
等形式。更多資訊,請參見config-http-filters-rate-limit。限流服務的配置則能夠匹配每個請求所產生的描述符條目。針對特定的一組描述符條目,限流服務的配置能夠指定其對應的請求速率限制。限流服務通過與Redis緩衝互動來決定是否對請求進行限流,並將限流決策響應給Envoy代理。
通過結合rate_limits過濾器和限流服務的配置,可以實現全域限流策略。rate_limits過濾器根據配置的action產生描述符,並將其發送到限流服務。限流服務根據描述符的資訊來決定特定的限制,並返回相應的限流響應。這樣的配置能夠全面控制請求的速率,保護後端服務免受突發高負載請求的影響。