Sentinel熔斷降級
Sentinel除了流量控制以外,對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。由于調用關系的復雜性,如果調用鏈路中的某個資源不穩定,最終會導致請求發生堆積。Sentinel 熔斷降級會在調用鏈路中某個資源出現不穩定狀態時(例如調用超時或異常比例升高),對這個資源的調用進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯錯誤。當資源被降級后,在接下來的降級時間窗口之內,對該資源的調用都自動熔斷(默認行為是拋出 DegradeException)。
降級策略
通常用以下幾種方式來衡量資源是否處于穩定的狀態:
- 平均響應時間 (
DEGRADE_GRADE_RT):當 1s 內持續進入 N 個請求,對應時刻的平均響應時間(秒級)均超過閾值(count,以 ms 為單位),那么在接下的時間窗口(DegradeRule中的timeWindow,以 s 為單位)之內,對這個方法的調用都會自動地熔斷(拋出DegradeException)。注意 Sentinel 默認統計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啟動配置項-Dcsp.sentinel.statistic.max.rt=xxx來配置。 - 異常比例 (
DEGRADE_GRADE_EXCEPTION_RATIO):當資源的每秒請求量 >= N(可配置),并且每秒異常總數占通過量的比值超過閾值(DegradeRule中的count)之后,資源進入降級狀態,即在接下的時間窗口(DegradeRule中的timeWindow,以 s 為單位)之內,對這個方法的調用都會自動地返回。異常比率的閾值范圍是[0.0, 1.0],代表 0% - 100%。 - 異常數 (
DEGRADE_GRADE_EXCEPTION_COUNT):當資源近 1 分鐘的異常數目超過閾值之后會進行熔斷。注意由于統計時間窗口是分鐘級別的,若timeWindow小于 60s,則結束熔斷狀態后仍可能再進入熔斷狀態。
示例
示例代碼搭建參考:Spring Cloud Alibaba 之 Sentinel哨兵介紹入門(二十九)
平均響應時間
1、編輯項目Controller中的代碼,增加方法testD
1 @GetMapping("/testD")
2 public String testD(){
3 try {
4 Thread.sleep(800);
5 } catch (InterruptedException e) {
6 e.printStackTrace();
7 }
8 return "--------testD";
9 }
2、在Sentinel控制臺,增加降級規則

3、降級規則,設置testD的平均響應時長為200毫秒,時間窗口為1s,如下:

4、測試
1)啟動項目(啟動項目-訪問testD-設置規則-測試)
2)訪問地址:http://localhost:8401/testD,正常訪問
3)使用JMeter 1s內并發10個請求到地址,循環執行,http://localhost:8401/testD
4)使用瀏覽器訪問,http://localhost:8401/testD,服務被熔斷

異常比例
1、編輯項目Controller中的代碼,修改方法testD,使testD方法每次請求都異常
@GetMapping("/testD")
public String testD(){
int n = 10/0;
return "--------testD";
}
2、降級規則,設置testD的異常比例為0.2,時間窗口為1s,如下:

3、測試
1)啟動項目(啟動項目-訪問testD-設置規則-測試)
2)訪問地址:http://localhost:8401/testD,出現異常界面Error Page

3)使用JMeter 1s內并發10個請求到地址,循環執行,http://localhost:8401/testD
4)使用瀏覽器訪問,http://localhost:8401/testD,服務被熔斷
異常數
1、編輯項目Controller中的代碼,修改方法testD,使testD方法每次請求都異常
1 @GetMapping("/testD")
2 public String testD(){
3 int n = 10/0;
4 return "--------testD";
5 }
2、降級規則,設置testD的異常數為5,時間窗口為70s,如下:

3、測試
1)啟動項目(啟動項目-訪問testD-設置規則-測試)
2)訪問地址:http://localhost:8401/testD,出現異常界面Error Page
3)使用JMeter 1s內并發10個請求到地址,循環執行,http://localhost:8401/testD
4)使用瀏覽器訪問,http://localhost:8401/testD,服務被熔斷
5)停止JMeter,70秒后,訪問地址:http://localhost:8401/testD,出現異常界面Error Page
Sentinel熱點參數限流
何為熱點?熱點即經常訪問的數據。很多時候我們希望統計某個熱點數據中訪問頻次最高的 Top K 數據,并對其訪問進行限制。比如:
- 商品 ID 為參數,統計一段時間內最常購買的商品 ID 并進行限制
- 用戶 ID 為參數,針對一段時間內頻繁訪問的用戶 ID 進行限制
熱點參數限流會統計傳入參數中的熱點參數,并根據配置的限流閾值與模式,對包含熱點參數的資源調用進行限流。熱點參數限流可以看做是一種特殊的流量控制,僅對包含熱點參數的資源調用生效。
Sentinel 利用 LRU 策略統計最近最常訪問的熱點參數,結合令牌桶算法來進行參數級別的流控。熱點參數限流支持集群模式。
熱點參數限流DEMO
1、編輯項目Controller中的代碼,增加方法testHotKey
1 @GetMapping("/testHotKey")
2 // 定義資源名稱及處理方法
3 @SentinelResource(value = "testHotKey", blockHandler = "deal_testHotKey")
4 public String testHotKey(@RequestParam(value = "p1", required = false) String p1,
5 @RequestParam(value = "p2", required = false) String p2){
6 System.out.println(Thread.currentThread().getName() + "--------testHotKey");
7 return "--------testHotKey";
8 }
9
10 public String deal_testHotKey(String p1, String p2, BlockException excetion){
11 System.out.println(Thread.currentThread().getName() + "--------deal_testHotKey");
12 return "--------deal_testHotKey";
13 }
2、在Sentinel控制臺,熱點規則,設置對第一個參數的請求閥值為1

3、測試
1)啟動項目(啟動項目-訪問-設置規則-測試)
2)訪問地址:http://localhost:8401/testHotKey?p1=1,正常響應
訪問地址:http://localhost:8401/testHotKey?p2=1,正常響應
3)高頻(快速刷新界面)訪問地址:http://localhost:8401/testHotKey?p1=1,被限流

高頻(快速刷新界面)訪問地址:http://localhost:8401/testHotKey?p2=1,正常響應

熱點參數限流-
1、沿用上面代碼示例
2、編輯熱點規則,設置對第一個參數的請求閥值為1,且設置參數例外項,但參數值為5的時候,閥值為200

3、測試
1)啟動項目(啟動項目-訪問-設置規則-測試)
2)訪問地址:http://localhost:8401/testHotKey?p1=1,正常響應
訪問地址:http://localhost:8401/testHotKey?p1=5,正常響應
3)高頻(快速刷新界面)訪問地址:http://localhost:8401/testHotKey?p1=1,被限流
高頻(快速刷新界面,未超過沒秒200次請求)訪問地址:http://localhost:8401/testHotKey?p1=5,正常響應
Sentinel系統自適應限流
Sentinel 系統自適應限流從整體維度對應用入口流量進行控制,結合應用的 Load、CPU 使用率、總體平均 RT、入口 QPS 和并發線程數等幾個維度的監控指標,通過自適應的流控策略,讓系統的入口流量和系統的負載達到一個平衡,讓系統盡可能跑在最大吞吐量的同時保證系統整體的穩定性。
系統規則
系統保護規則是從應用級別的入口流量進行控制,從單臺機器的 load、CPU 使用率、平均 RT、入口 QPS 和并發線程數等幾個維度監控應用指標,讓系統盡可能跑在最大吞吐量的同時保證系統整體的穩定性。
系統保護規則是應用整體維度的,而不是資源維度的,并且僅對入口流量生效。入口流量指的是進入應用的流量(EntryType.IN),比如 Web 服務或 Dubbo 服務端接收的請求,都屬于入口流量。
系統規則支持以下的模式:
- Load 自適應(僅對 Linux/Unix-like 機器生效):系統的 load1 作為啟發指標,進行自適應系統保護。當系統 load1 超過設定的啟發值,且系統當前的并發線程數超過估算的系統容量時才會觸發系統保護(BBR 階段)。系統容量由系統的
maxQps * minRt估算得出。設定參考值一般是CPU cores * 2.5。 - CPU usage(1.5.0+ 版本):當系統 CPU 使用率超過閾值即觸發系統保護(取值范圍 0.0-1.0),比較靈敏。
- 平均 RT:當單臺機器上所有入口流量的平均 RT 達到閾值即觸發系統保護,單位是毫秒。
- 并發線程數:當單臺機器上所有入口流量的并發線程數達到閾值即觸發系統保護。
- 入口 QPS:當單臺機器上所有入口流量的 QPS 達到閾值即觸發系統保護。
入口 QPS系統規則示例
1、編輯項目Controller中的代碼,增加方法testE
1 @GetMapping("/testE")
2 public String testE(){
3 System.out.println(Thread.currentThread().getName() + "--------testE");
4 return "--------testE";
5 }
2、新增系統規則,設置閥值類型為入口QPS,閥值為1

3、測試
1)啟動項目(啟動項目-訪問-設置規則-測試)
2)訪問地址:http://localhost:8401/testE,正常訪問
3)高頻(快速刷新界面)訪問地址:http://localhost:8401/testE,被限流,說明系統規則已生效
本文來自博客園,作者:榮慕平,轉載請注明原文鏈接:http://www.rzrgm.cn/rongmuping/articles/16323309.html

浙公網安備 33010602011771號