Spring Cloud Alibaba 教程(基於首個畢業版)(六):Sentinel限流、降級等規則介紹

上篇我們已經成功接入了Sentinel控制檯接下來,我們將介紹控制檯

1.實時監控

我們在瀏覽器請求之前的接口/shares/1會發現實時監控會把我們請求信息顯示出來

2.簇點鏈路

通過控制檯菜單,我們可以查看所有的簇點

3.流控規則(官方文檔

3.1概述

流量控制(flow control),其原理是監控應用流量的 QPS 或併發線程數等指標,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峯沖垮,從而保障應用的高可用性。

FlowSlot 會根據預設的規則,結合前面 NodeSelectorSlotClusterNodeBuilderSlotStatisticSlot 統計出來的實時信息進行流量控制。

限流的直接表現是在執行 Entry nodeA = SphU.entry(resourceName) 的時候拋出 FlowException 異常。FlowException 是 BlockException 的子類,您可以捕捉 BlockException 來自定義被限流之後的處理邏輯。

同一個資源可以創建多條限流規則。FlowSlot 會對該資源的所有限流規則依次遍歷,直到有規則觸發限流或者所有規則遍歷完畢。

3.2 基於QPS/併發數的流量控制

流量控制主要有兩種統計類型,一種是統計併發線程數,另外一種則是統計 QPS。類型由 FlowRule的 grade 字段來定義。其中,0 代表根據併發數量來限流,1 代表根據 QPS 來進行流量控制。其中線程數、QPS 值,都是由 StatisticSlot 實時統計獲取的。

3.2.1 併發線程數流量控制

併發線程數限流用於保護業務線程數不被耗盡。例如,當應用所依賴的下游應用由於某種原因導致服務不穩定、響應延遲增加,對於調用者來說,意味着吞吐量下降和更多的線程數佔用,極端情況下甚至導致線程池耗盡。爲應對太多線程佔用的情況,業內有使用隔離的方案,比如通過不同業務邏輯使用不同線程池來隔離業務自身之間的資源爭搶(線程池隔離)。這種隔離方案雖然隔離性比較好,但是代價就是線程數目太多,線程上下文切換的 overhead 比較大,特別是對低延時的調用有比較大的影響。Sentinel 併發線程數限流不負責創建和管理線程池,而是簡單統計當前請求上下文的線程數目,如果超出閾值,新的請求會被立即拒絕,效果類似於信號量隔離。

3.2.2 QPS流量控制

當 QPS 超過某個閾值的時候,則採取措施進行流量控制。流量控制的效果包括以下幾種:直接拒絕Warm Up勻速排隊。對應 FlowRule 中的 controlBehavior 字段。

注意:若使用除了直接拒絕之外的流量控制效果,則調用關係限流策略(strategy)會被忽略。

3.2.2.1 直接拒絕

直接拒絕RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默認的流量控制方式,當QPS超過任意規則的閾值後,新的請求就會被立即拒絕,拒絕方式爲拋出FlowException。這種方式適用於對系統處理能力確切已知的情況下,比如通過壓測確定了系統的準確水位時

3.2.2.2 Warm Up

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即預熱/冷啓動方式。當系統長期處於低水位的情況下,當流量突然增加時,直接把系統拉昇到高水位可能瞬間把系統壓垮。通過"冷啓動",讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限,給冷系統一個預熱的時間,避免冷系統被壓垮。詳細文檔可以參考 流量控制 - Warm Up 文檔

3.2.2.3 勻速排隊

勻速排隊(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式會嚴格控制請求通過的間隔時間,也即是讓請求以均勻的速度通過,對應的是漏桶算法。詳細文檔可以參考 流量控制 - 勻速器模式

3.3 例子演示

3.3.1 添加規則

我們可以在簇點鏈路中添加一條流控規則

3.3.2 請求接口,在經歷多次請求之後會發現已經被限流了

4. 降級規則(官方文檔

3.1 概述

除了流量控制以外,對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。由於調用關係的複雜性,如果調用鏈路中的某個資源不穩定,最終會導致請求發生堆積。Sentinel 熔斷降級會在調用鏈路中某個資源出現不穩定狀態時(例如調用超時或異常比例升高),對這個資源的調用進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯錯誤。當資源被降級後,在接下來的降級時間窗口之內,對該資源的調用都自動熔斷(默認行爲是拋出 DegradeException)。

3.2 降級策略

我們通常用以下幾種方式來衡量資源是否處於穩定的狀態:

  • 平均響應時間 (DEGRADE_GRADE_RT):當 1s 內持續進入 5 個請求,對應時刻的平均響應時間(秒級)均超過閾值(count,以 ms 爲單位),那麼在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 爲單位)之內,對這個方法的調用都會自動地熔斷(拋出 DegradeException)。注意 Sentinel 默認統計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啓動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置。
  • 異常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):當資源的每秒請求量 >= 5,並且每秒異常總數佔通過量的比值超過閾值(DegradeRule 中的 count)之後,資源進入降級狀態,即在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 爲單位)之內,對這個方法的調用都會自動地返回。異常比率的閾值範圍是 [0.0, 1.0],代表 0% - 100%。
  • 異常數 (DEGRADE_GRADE_EXCEPTION_COUNT):當資源近 1 分鐘的異常數目超過閾值之後會進行熔斷。注意由於統計時間窗口是分鐘級別的,若 timeWindow 小於 60s,則結束熔斷狀態後仍可能再進入熔斷狀態。

注意:異常降級僅針對業務異常,對 Sentinel 限流降級本身的異常(BlockException)不生效。爲了統計異常比例或異常數,需要通過 Tracer.trace(ex) 記錄業務異常。

3.3 示例

3.3.1 添加規則

3.3.2 請求多次,在經歷多次請求之後會發現已經被限流降級了

5.熱點規則(官方文檔

5.1 概述

何爲熱點?熱點即經常訪問的數據。很多時候我們希望統計某個熱點數據中訪問頻次最高的 Top K 數據,並對其訪問進行限制。比如:

  • 商品 ID 爲參數,統計一段時間內最常購買的商品 ID 並進行限制
  • 用戶 ID 爲參數,針對一段時間內頻繁訪問的用戶 ID 進行限制

熱點參數限流會統計傳入參數中的熱點參數,並根據配置的限流閾值與模式,對包含熱點參數的資源調用進行限流。熱點參數限流可以看做是一種特殊的流量控制,僅對包含熱點參數的資源調用生效。

5.2 示例

5.2.1 新建一個controller

@RequestMapping("test_hot")
    @SentinelResource("hot")
    // 熱點規則
    public String testHot(@RequestParam(required = false) String a,
                          @RequestParam(required = false) String b){
        return a+ ""+ b;
    }

5.2.2 新建規則

5.2.3 調用總結

在經歷調用之前,你會發現:

  1. a 有值時,值不等於10 限流閾值是1
  2. a 有值時,值等於10 限流閾值是100
  3. a沒有值時,不限流

6.授權規則(官方文檔

6.1 概述

很多時候,我們需要根據調用方來限制資源是否通過,這時候可以使用 Sentinel 的黑白名單控制的功能。黑白名單根據資源的請求來源(origin)限制資源是否通過,若配置白名單則只有請求來源位於白名單內時纔可通過;若配置黑名單則請求來源位於黑名單時不通過,其餘的請求通過。

調用方信息通過 ContextUtil.enter(resourceName, origin) 方法中的 origin 參數傳入。

規則配置

黑白名單規則(AuthorityRule)非常簡單,主要有以下配置項:

  • resource:資源名,即限流規則的作用對象
  • limitApp:對應的黑名單/白名單,不同 origin 用 , 分隔,如 appA,appB
  • strategy:限制模式,AUTHORITY_WHITE 爲白名單模式,AUTHORITY_BLACK 爲黑名單模式,默認爲白名單模式

7. 系統規則(官方文檔

8. 集羣流控(官方文檔

9. Alibaba Sentinel 規則參數總結

在這裏感謝慕課網的大目老師爲我們總結的規則參數 地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章