限流(Rate Limiting)、熔斷與降級入門(含 Sentinel 實戰)
結合課件第 3 章(3-1 ~ 3-9)的影片要點,整理一套面向初學者的服務保護指南,幫助理解「為什麼需要限流(Rate Limiting)、熔斷與降級」,以及如何用 Sentinel 快速上手。
學習路線速覽
- 3-1 理解服務雪崩與限流(Rate Limiting)、熔斷、降級的背景
- 3-2 Sentinel 與 Hystrix 對比,明確技術選型
- 3-3 Sentinel QPS 限流(Rate Limiting)基礎
- 3-4 預測型限流(Rate Limiting)與冷啟動
- 3-5 Throttling 配置演示
- 3-6 Sentinel 熔斷降級策略
- 3-7 熔斷策略——基於錯誤比率
- 3-8 降級策略——基於回應時間
- 3-9 Gin + Sentinel 實戰限流(Rate Limiting)
服務雪崩的成因
當突發流量超過系統承載力(例如系統容量 1k QPS 卻突然湧入 2k QPS)時,會引發回應變慢、錯誤率飆升,進而拖垮更多依賴,形成「雪崩」。常見誘因:
- 流量突增:大促、熱點新聞、爬蟲等造成訪問量暴漲。
- 依賴故障:下游服務延遲或掛掉,呼叫堆積。
- 資源耗盡:執行緒/連線/CPU 被佔滿,導致更多請求排隊。
應對策略三件套:限流(Rate Limiting)擋住洪水、熔斷拉下斷路器、降級提供備用體驗。
graph LR
A[突發流量] --> B(限流:削峰填谷)
B --> C{依賴正常?}
C -->|是| D[服務穩定運行]
C -->|否| E(熔斷:暫時切斷調用)
E --> F(降級:返回備用方案)
F --> D
限流(Rate Limiting):給入口加「閘門」
限流(Rate Limiting)透過控制單位時間內的請求數量或併發度,讓系統在可控範圍內運行。常見策略:
| 策略 | 場景 | 優點 | 可能副作用 |
|---|---|---|---|
| 固定視窗 QPS | 介面需要簡單限速 | 實現簡單 | 邊界瞬時突刺 |
| 滑動視窗 | API 閘道、統一出口 | 控制更平滑 | 計算稍複雜 |
| 漏桶(Leak Bucket) | 回放請求、削峰填谷 | 輸出穩定 | 突發流量被排隊 |
| 令牌桶(Token Bucket) | 允許部分突刺 | 指標靈活(QPS/併發) | 需要監控桶狀態 |
限流(Rate Limiting)提示語應友善:「目前存取人數較多,請稍後重試或關注通知」。
graph TD
subgraph 限流閘門
Tokens[令牌桶] -->|取令牌| Request[請求放行]
Request --> Service[核心服務]
end
Tokens -.超限.-> Fallback[返回 429 或排隊提示]
熔斷:讓系統「精神煥發」
「熔斷」類似電路斷路器——當偵測到錯誤率、回應時間等指標異常,就暫時切斷呼叫,防止故障擴散。因為拉閘後系統可以喘口氣恢復元氣,課堂上也打趣稱它讓系統「精神煥發」。
Sentinel 支援三類熔斷規則:
- 慢呼叫比例:超出設定耗時閾值的請求佔比過高時觸發。
- 異常比例:統計視窗內異常數佔比超標時熔斷。
- 異常數:在單位時間內異常總數達到閾值時熔斷。
熔斷後通常經歷三個階段:Open(全阻斷) -> Half-Open(少量探測) -> Closed(恢復正常)。
降級:提供備用體驗
當核心流程壓力過大或依賴熔斷時,降級策略給使用者提供「簡化但可用」的結果:
- 返回快取(Cache)或備用資料(例如展示昨日庫存)。
- 提示稍後處理,非同步回呼(訂單排隊、工單受理)。
- 將高成本功能臨時關閉(例如關閉推薦列表,只保留基礎搜尋)。
降級重點是提前準備:文案、備用介面、前端佔位都要就緒。
Sentinel 速覽
Sentinel 是阿里巴巴開源的高可用防護框架,核心價值:
- 統一控制台管理限流(Rate Limiting)、熔斷、降級、系統保護等規則。
- 支援 Java 與 Go,提供豐富的生態系(Ecosystem)適配(Dubbo、Spring Cloud、Gin 等)。
- 具備即時監控、鏈路聚合、規則推送等能力。
Sentinel 結構示意:
graph LR
subgraph 控制台
Dashboard[Dashboard 控制台]
end
Dashboard -- 推送規則 --> DataSource[數據源/配置中心]
DataSource -- 動態規則 --> Sentinel[Sentinel 客戶端]
Sentinel -- 上報指標 --> Dashboard
Sentinel --> App[業務應用]
Go 語言快速上手(以 Gin 專案為例)
- 安裝依賴
bash
go get github.com/alibaba/sentinel-golang@latest
go get github.com/alibaba/sentinel-golang/pkg/adapters/gin
- 初始化 Sentinel
```go
package main
import (
"log"
"github.com/alibaba/sentinel-golang/api"
"github.com/alibaba/sentinel-golang/core/flow"
)
func initSentinel() {
if err := api.InitDefault(); err != nil {
log.Fatalf("init sentinel: %v", err)
}
_, err := flow.LoadRules([]*flow.Rule{
{
Resource: "GET:/api/orders",
MetricType: flow.QPS,
Count: 200,
ControlBehavior: flow.WarmUp,
WarmUpPeriodSec: 10,
WarmUpColdFactor: 3,
},
})
if err != nil {
log.Fatalf("load flow rules: %v", err)
}
}
<code>
<ol>
<li><strong>接入 Gin 中介軟體(Middleware)</strong></li>
</ol>
</code>go
r := gin.Default()
r.Use(sgin.SentinelMiddleware())
r.GET("/api/orders", func(c *gin.Context) {
if entry, blockErr := api.Entry("GET:/api/orders"); blockErr != nil {
c.JSON(429, gin.H{"code": 429, "msg": "擁擠,請稍後重試"})
return
} else {
defer entry.Exit()
}
c.JSON(200, gin.H{"orders": []string{"#1201", "#1202"}})
})
```
- 本地偵錯建議
- 使用
ab/wrk進行壓力測試,驗證限流(Rate Limiting)是否生效。 - 觀察日誌和 Dashboard 中的即時 QPS、Block 指標。
Java 環境接入要點
<!-- Maven -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.6</version>
</dependency>
@Configuration
public class SentinelConfig {
@PostConstruct
public void init() throws Exception {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule("product_list");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(1000);
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
rule.setMaxQueueingTimeMs(500);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
}
結合 Spring Cloud Alibaba,可透過 @SentinelResource 標註降級回呼方法。
Dashboard 啟動指引
- 下載控制台:
bash
wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar
- 啟動:
bash
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 \
-Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar
- 客戶端參數(Java 範例):
bash
-Dcsp.sentinel.dashboard.server=localhost:8080 \
-Dcsp.sentinel.api.port=8719 \
-Dproject.name=demo-service
- 登入控制台(預設帳號密碼均為
sentinel),在介面中建立流控/熔斷/系統保護規則並即時下發。
制定自己的防護「作戰圖」
- 觀測指標:QPS、平均回應時間、錯誤率、下游依賴健康度。
- 閾值設定:基於容量評估與壓力測試資料;對不同介面設定差異化規則。
- 熔斷恢復:配置 Half-Open 探測邏輯,確保服務恢復後能自動合閘。
- 降級文案:提前與產品/前端確認備用頁面和提示語。
- 回溯複盤:每次限流(Rate Limiting) / 熔斷觸發後記錄原因、調整閾值或擴容。
sequenceDiagram
participant User
participant Gateway as API 網關
participant Service as 核心服務
participant Fallback as 降級/緩存
User->>Gateway: 請求下單
Gateway->>Service: 令牌校驗
alt QPS 超限
Gateway-->>User: 429 擁堵提示
else 調用異常
Service-->>Gateway: 熔斷觸發
Gateway->>Fallback: 查詢兜底方案
Fallback-->>User: 排隊中,請稍後
end
快速複習清單
- 限流(Rate Limiting)將入口流量控制在系統承載範圍內,優先保護核心能力。
- 熔斷在依賴異常時主動切斷呼叫,讓系統盡快「回血」。
- 降級是備用方案,讓使用者即使在故障時也感知到服務「還活著」。
- Sentinel 涵蓋限流(Rate Limiting)、熔斷、降級和系統保護,控制台視覺化配置與即時監控。
- 提前準備閾值、文案、監控與演練,才能在真正的雪崩到來前「精神煥發」地應對。
主題測試文章,只做測試使用。發佈者:Walker,轉轉請注明出處:https://walker-learn.xyz/archives/4788