Go工程師體系課 017【學習筆記】

限流(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 專案為例)

  1. 安裝依賴

bash
go get github.com/alibaba/sentinel-golang@latest
go get github.com/alibaba/sentinel-golang/pkg/adapters/gin

  1. 初始化 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"}})
})
```

  1. 本地偵錯建議
  2. 使用 ab/wrk 進行壓力測試,驗證限流(Rate Limiting)是否生效。
  3. 觀察日誌和 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 啟動指引

  1. 下載控制台:

bash
wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar

  1. 啟動:

bash
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 \
-Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar

  1. 客戶端參數(Java 範例):

bash
-Dcsp.sentinel.dashboard.server=localhost:8080 \
-Dcsp.sentinel.api.port=8719 \
-Dproject.name=demo-service

  1. 登入控制台(預設帳號密碼均為 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

(0)
Walker的頭像Walker
上一篇 2026年3月10日 00:00
下一篇 2026年3月8日 15:40

相關推薦

  • 深入理解ES6 001【學習筆記】

    區塊作用域繫結 之前的變數宣告 `var` 無論在哪裡宣告,都會被視為作用域頂部宣告。由於函式是一等公民,因此順序通常是 `function 函式名稱()`、`var 變數`。 區塊宣告 區塊宣告用於宣告在指定區塊的作用域之外無法存取的變數。區塊作用域存在於: 函式內部 區塊中(字元 `{` 和 `}` 之間的區域) 暫時性死區 JavaScript 引擎在掃描程式碼發現變數宣告時,要麼會將它們提升至作…

    個人 2025年3月8日
    1.7K00
  • TS珠峰 003【學習筆記】

    裝飾器 // 裝飾器 // 只能在類別中使用(類別本身,類別成員使用) // 裝飾器,類別的裝飾器,屬性裝飾器,存取器裝飾器 參數裝飾器 // 1. 類別裝飾器 給類別進行擴充,也可以回傳一個子類別 // 必須先在tsconfig.json中啟用experimentalDecorators const classDecorator1 =

    個人 2025年3月27日
    1.5K00
  • Go工程師體系課 008【學習筆記】

    訂單及購物車 先從庫存服務中將 srv 的服務程式碼框架複製過來,搜尋取代對應的名稱(order_srv) 加密技術基礎 對稱式加密(Symmetric Encryption) 原理: 使用同一個金鑰進行加密和解密 就像一把鑰匙,既能鎖門也能開門 加密速度快,適合大量資料傳輸 使用情境: 本機檔案加密 資料庫內容加密 大量資料傳輸時的內容加密 內部系統間的快速通…

    個人 2025年11月25日
    26700
  • 無畏前行,拳釋力量 🥊💪

    拚搏,是一種態度。生活就像一場比賽,沒有捷徑可走,只有不斷訓練、突破、超越,才能站上屬於自己的舞台。這不僅是一種對抗,更是一種自我的覺醒——敢於迎戰,敢於挑戰,敢於成為更強的自己。 運動中的拚搏精神 無論是拳擊、跑步,還是力量訓練,每一次出拳、每一次揮汗、每一次咬牙堅持,都是對身體與心靈的磨練。拚搏不是單純的對抗,而是一種態度——面對挑戰,不退縮;面對失敗,…

    個人 2025年2月26日
    1.4K00
  • Go 工程師體系課 012【學習筆記】

    在 Go 中整合 Elasticsearch 1. 客戶端函式庫選擇 1.1 主流 Go ES 客戶端 olivere/elastic:功能最完整,API 設計優雅,支援 ES 7.x/8.x elastic/go-elasticsearch:官方客戶端,輕量級,更接近原生 REST API go-elasticsearch/elasticsearch:社群維護的官…

    個人 2025年11月25日
    28100
簡體中文 繁體中文 English