整合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控制台
添加配置文件:
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));