Spring Cloud Alibaba學習筆記(5) - 整合Sentinel及Sentinel規則


整合Sentinel

應用整合Sentinel

在dependencies中添加依賴,即可整合Sentinel

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

搭建Sentinel控制台

可以從這個地址:https://github.com/alibaba/Sentinel/releases 下載控制台應用。因為下載速度較慢,給出一個我下載的版本(1.6.3)
百度雲地址:鏈接: https://pan.baidu.com/s/1UV4OzfjfuBZQfpPb28z0sw&shfl=sharepset 密碼: i68g
運行命令啟動控制台:java -jar sentinel-dashboard-1.6.3.jar
打開瀏覽器,輸入http://localhost:8080進入控制台頁面(賬號密碼默認sentinel)
Sentinel控制台登錄頁面

應用整合Sentinel控制台

添加配置文件:

spring:
  cloud:
    sentinel:
      transport:
        # 指定sentinel控制台地址
        dashboard: localhost:8080

PS:其他的配置項

spring:
  cloud:
    sentinel:
      transport:
        # 指定sentinel控制台地址
        dashboard: localhost:8080
        # 指定和控制台通信的IP,若不配置,會自動選擇一個IP注冊
        client-ip: 127.0.0.1
        # 指定和控制台通信的端口哦,默認值8719
        # 若不配置,會自動掃貓從8719開始掃貓,依次+1,知道值找到未被占用的端口
        port: 8719
        # 心跳發送周期,默認值null
        # 但在SimpleHttpHeartbeatSender會用默認值10秒
        heartbeat-interval-ms: 10000

這樣,就為應用整合好Sentinel了,應用發生請求后,控制台如下:

控制台配置規則

流控規則

打開Sentinel控制台,點擊簇點鏈路,可以看見微服務曾經被訪問過的路徑

點擊流控按鈕,便可以為應用設置流控規則

  • 資源名:唯一名稱,默認請求路徑
  • 針對來源:Sentinel可以針對調用者進行限流,填寫微服務名,默認default(不區分來源)
  • 閾值類型/單機閾值:
    • QPS(每秒鍾的請求數量):當調用該api的QPS達到閾值的時候,進行限流
    • 線程數:當調用該api的線程數達到閾值的時候,進行限流
  • 是否集群:不需要集群,暫不研究
  • 流控模式:
    • 直接:api達到限流條件時,直接限流
    • 關聯:當關聯的資源達到閾值時,就限流自己
    • 鏈路:只記錄指定鏈路上的流量(指定資源從入口資源進來的流量,如果達到閾值,就進行限流)【api級別的針對來源】
  • 流控效果:
    • 快速失敗:直接失敗,拋異常
    • Warm Up:根據codeFactor(冷加載因子,默認3)的值,從閾值/codeFactor,經過預熱時長,才達到設置的QPS閾值
    • 排隊等待:勻速排隊,讓請求以勻速的速度通過,閾值類型必須設置為QPS,否則無效

降級規則(斷路器模式)

點擊降級按鈕,便可以為應用設置降級規則

降級策略:

  • RT:平均響應時間(秒級統計)超出閾值且在時間窗口內的請求 >= 5時,觸發降級;時間窗口結束后,關閉降級【Sentinel默認最大的RT為4900ms,可以通過-Dcsp.sentinel.statistic.max.rt=xxx修改】
  • 異常比例:QPS >= 5 且異常比例(秒級統計)超過閾值時,觸發降級;時間窗口結束后,關閉降級
  • 異常數:異常數(分鍾統計)超過閾值時,觸發降級;時間窗口結束后,關閉降級【時間窗口 < 60秒可能會出現問題】

熱點規則(熱點參數限流規則)

Sentinel默認顯示的端點並不支持熱點規則,要顯示熱點規則,需要自己添加代碼:

@GetMapping("test")
@SentinelResource("test")
public String testHot(@RequestParam(required = false) String a,
                      @RequestParam(required = false) String b) {
    return a + "-" + b;
}

點擊熱點按鈕,便可以為test設置熱點規則

在時間窗口以內,一旦該api指定索引的參數QPS達到了域名,就會觸發限流

  • 參數索引:從0開始,上面的代碼中:a的參數索引為0;b的參數索引為1【參數索引對應的參數必須時基本類型或者String】

系統規則

閾值類型

  • LOAD(僅對 Linux/Unix-like 機器生效):當系統 load1 超過閾值,且系統當前的並發線程數超過系統容量時才會觸發系統保護。系統容量由系統的 maxQps * minRt 計算得出。設定參考值一般是 CPU cores * 2.5
  • RT:當單台機器上所有入口流量的平均 RT 達到閾值即觸發系統保護,單位是毫秒
  • 線程數:當單台機器上所有入口流量的並發線程數達到閾值即觸發系統保護
  • 入口 QPS:當單台機器上所有入口流量的 QPS 達到閾值即觸發系統保護
  • CPU 使用率:當系統 CPU 使用率超過閾值即觸發系統保護(取值范圍 0.0-1.0)

授權規則

點擊授權按鈕,便可以為應用設置授權規則

資源名所代表的資源只允許流控應用中添加的微服務使用(白名單)、不允許使用(黑名單)

代碼配置規則

流控規則

參數

Field 說明 默認值
resource 資源名,資源名是限流規則的作用對象
count 限流閾值
grade 限流閾值類型,QPS 或線程數模式 QPS模式
limitApp 流控針對的調用來源 default,代表不區分調用來源
strategy default,代表不區分調用來源 根據資源本身
controlBehavior 流控效果(直接拒絕 / 排隊等待 / 慢啟動模式) 直接拒絕

代碼

private void initFlowQpsRule() {
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule(resourceName);
    // 設置QPS閾值為20
    rule.setCount(20);
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    rule.setLimitApp("default");
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
}

降級規則

參數

Field 說明 默認值
resource 資源名,即限流規則的作用對象
count 閾值
grade 降級模式,根據 RT 降級還是根據異常比例降級 RT
timeWindow 降級的時間,單位為 s

代碼

private void initDegradeRule() {
    List<DegradeRule> rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule();
    rule.setResource(KEY);
    // set threshold RT, 10 ms
    rule.setCount(10);
    rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
    rule.setTimeWindow(10);
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);
}

熱點規則

參數

Field 說明 默認值
resource 資源名,必填
count 限流閾值,必填
grade 限流模式 QPS 模式
durationInSec 統計窗口時間長度(單位為秒) 1s
controlBehavior 流控效果(支持快速失敗和勻速排隊模式) 快速失敗
maxQueueingTimeMs 最大排隊等待時長(僅在勻速排隊模式生效) 0ms
paramIdx 熱點參數的索引,必填,對應 SphU.entry(xxx, args) 中的參數索引位置
paramFlowItemList 參數例外項,可以針對指定的參數值單獨設置限流閾值,不受前面 count 閾值的限制。僅支持基本類型
clusterMode 是否是集群參數流控規則 false
clusterConfig 集群流控相關配置

代碼

ParamFlowRule rule = new ParamFlowRule(resourceName)
    .setParamIdx(0)
    .setCount(5);
// 針對 int 類型的參數 PARAM_B,單獨設置限流 QPS 閾值為 10,而不是全局的閾值 5.
ParamFlowItem item = new ParamFlowItem().setObject(String.valueOf(PARAM_B))
    .setClassType(int.class.getName())
    .setCount(10);
rule.setParamFlowItemList(Collections.singletonList(item));

ParamFlowRuleManager.loadRules(Collections.singletonList(rule));

系統規則

參數

Field 說明 默認值
highestSystemLoad 最大的 load1 -1(不生效)
avgRt 所有入口流量的平均響應時間 -1(不生效)
maxThread 入口流量的最大並發數 -1(不生效)
qpa 所有入口資源的 QPS -1(不生效)

代碼

private void initSystemRule() {
    List<SystemRule> rules = new ArrayList<>();
    SystemRule rule = new SystemRule();
    rule.setHighestSystemLoad(10);
    rules.add(rule);
    SystemRuleManager.loadRules(rules);
}

授權規則

參數

Field 說明 默認值
resource 資源名,即限流規則的作用對象
limitApp 對應的黑名單/白名單,不同 origin 用 , 分隔,如 appA,appB default,代表不區分調用來源
strategy 限制模式,AUTHORITY_WHITE 為白名單模式,AUTHORITY_BLACK 為黑名單模式,默認為白名單模式 AUTHORITY_WHITE

代碼

AuthorityRule rule = new AuthorityRule();
rule.setResource("test");
rule.setStrategy(RuleConstant.AUTHORITY_WHITE);
rule.setLimitApp("appA,appB");
AuthorityRuleManager.loadRules(Collections.singletonList(rule));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM