限流、熔斷與降級入門(含 Sentinel 實戰)
結合課件第 3 章(3-1 ~ 3-9)的視頻要點,整理一套面向初學者的服務保護指南,幫助理解“爲什麼需要限流、熔斷和降級”,以及如何用 Sentinel 快速上手。
學習路線速覽
- 3-1 理解服務雪崩與限流、熔斷、降級的背景
- 3-2 Sentinel 與 Hystrix 對比,明確技術選型
- 3-3 Sentinel QPS 限流基礎
- 3-4 預測型限流與冷啓動
- 3-5 Throttling 配置演示
- 3-6 Sentinel 熔斷降級策略
- 3-7 熔斷策略——基於錯誤比率
- 3-8 降級策略——基於響應時間
- 3-9 Gin + Sentinel 實戰限流
服務雪崩的成因
當突發流量超過系統承載力(例如系統容量 1k QPS 卻突然湧入 2k QPS)時,會引發響應變慢、錯誤率飆升,繼而拖垮更多依賴,形成“雪崩”。常見誘因:
- 流量突增:大促、熱點新聞、爬蟲等造成訪問量暴漲。
- 依賴故障:下游服務延遲或掛掉,調用堆積。
- 資源耗盡:線程 / 連接 /CPU 被佔滿,導致更多請求排隊。
應對策略三件套:限流 擋住洪水、熔斷 拉下斷路器、降級 提供兜底體驗。
graph LR
A[突發流量] --> B(限流:削峯填谷)
B --> C{依賴正常?}
C -->| 是 | D[服務穩定運行]
C -->| 否 | E(熔斷:暫時切斷調用)
E --> F(降級:返回備用方案)
F --> D
限流:給入口加“閘門”
限流(Rate Limiting)通過控制單位時間內的請求數量或併發度,讓系統在可控範圍內運行。常見策略:
| 策略 | 場景 | 優點 | 可能副作用 |
|---|---|---|---|
| 固定窗口 QPS | 接口需要簡單限速 | 實現簡單 | 邊界瞬時突刺 |
| 滑動窗口 | API 網關、統一出口 | 控制更平滑 | 計算稍複雜 |
| 漏桶(Leak Bucket) | 回放請求、削峯填谷 | 輸出穩定 | 突發流量被排隊 |
| 令牌桶(Token Bucket) | 允許部分突刺 | 指標靈活(QPS/ 併發) | 需要監控桶狀態 |
限流提示語 應友好:“當前訪問人數較多,請稍後重試或關注通知”。
graph TD
subgraph 限流閘門
Tokens[令牌桶] -->| 取令牌 | Request[請求放行]
Request --> Service[核心服務]
end
Tokens -. 超限.-> Fallback[返回 429 或排隊提示]
熔斷:讓系統“精神煥發”
“熔斷”類似電路斷路器——當檢測到錯誤率、響應時間等指標異常,就暫時切斷調用,防止故障擴散。因爲拉閘後系統可以喘口氣恢復元氣,課堂上也打趣稱它讓系統“精神煥發”。
Sentinel 支持三類熔斷規則:
- 慢調用比例:超出設定耗時閾值的請求佔比過高時觸發。
- 異常比例:統計窗口內異常數佔比超標時熔斷。
- 異常數:在單位時間內異常總數達到閾值時熔斷。
熔斷後通常經歷三個階段:
Open(全阻斷)-> Half-Open(少量探測)-> Closed(恢復正常)。
降級:提供備用體驗
當核心流程壓力過大或依賴熔斷時,降級策略給用戶提供“簡化但可用”的結果:
- 返回緩存或兜底數據(例如展示昨日庫存)。
- 提示稍後處理,異步回調(訂單排隊、工單受理)。
- 將高成本功能臨時關閉(例如關閉推薦列表,只保留基礎搜索)。
降級重點是 提前準備:文案、兜底接口、前端佔位都要就緒。
Sentinel 速覽
Sentinel 是阿里開源的高可用防護框架,核心價值:
- 統一控制檯管理限流、熔斷、降級、系統保護等規則。
- 支持 Java 與 Go,提供豐富的生態適配(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)
}
}
“`
- 接入 Gin 中間件
“`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進行壓測,驗證限流是否生效。 - 觀察日誌和 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 探測邏輯,確保服務恢復後能自動合閘。
- 降級文案:提前與產品 / 前端確認兜底頁面和提示語。
- 回溯覆盤:每次限流 / 熔斷觸發後記錄原因、調整閾值或擴容。
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
快速複習清單
- 限流把入口流量控制在系統承載範圍內,優先保護核心能力。
- 熔斷在依賴異常時主動切斷調用,讓系統儘快“回血”。
- 降級是兜底方案,讓用戶即使在故障時也感知到服務“還活着”。
- Sentinel 覆蓋限流、熔斷、降級和系統保護,控制檯可視化配置與實時監控。
- 提前準備閾值、文案、監控與演練,才能在真正的雪崩到來前“精神煥發”地應對。