使用說明
如果只是為了讓使 用Sentinel 的限流功能,只需要引入相關的jar包依賴。
添加依賴
添加相關模塊的Adapter
Sentinel
為每個構建項目的各個組件都打包成了相應的Adapter
。項目需要按需引入。現階段的Dubbo-Adapter模塊最高只支持到dubbo 2.6.6
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-dubbo-adapter</artifactId>
<version>1.6.3</version>
</dependency>
各個模塊的adapter
限流信息上傳dashboard
添加參數
添加此依賴,客戶端的實時限流信息能匯總到后台管理界面。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.6.3</version>
</dependency>
修改啟動參數
# 指定 dashboard的訪問地址和自己在dashbaord中要顯示的名字。
-Dcsp.sentinel.dashboard.server=localhost:8888 -Dproject.name=sentinel-dashboard
經過以上幾個步驟,就可以在dashboard中看到相關的項目。里面的流控規則就根據自己實際需要來進行設置。
規則說明
流量控制規則
field | 說明 | 默認值 |
---|---|---|
resource | 資源名,限流規則的作用對象如具體的url | |
count | 限流閥值,超過這個值就會觸發 | |
grade | 閾值類型,QPS或者線程數 | QPS |
limitApp | 流控針對的調用來源 | default,代表不區分調用來源 |
strategy | 判斷是根據資源本身還是根據其它關聯資源(refResource)還是根據鏈路入口 | 根據資源本身 |
controlBehavior | 流控效果(直接拒絕/排隊等待/慢啟動) | 直接拒絕 |
同一個資源可以同時有多個限流規則。
private void initFlowQpsRule() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule(resourceName);
// set limit qps to 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 | 說明 | 默認值 |
---|---|---|
highestSystemLoad | 最大的load | -1 (不生效) |
avgRt | 所有入口流量的平均響應時間 | -1 (不生效) |
maxThread | 入口流量的最大並發數 | -1 (不生效) |
qps | 所有入口資源的qps | -1 (不生效) |
private void initSystemRule() {
List<SystemRule> rules = new ArrayList<>();
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(10);
rules.add(rule);
// 加載系統規則
SystemRuleManager.loadRules(rules);
}
與 Hystrix
對比
為什么要引入隔離的。當系統中的慢調用一直運行的時候,會對資源造成一種獨占的情況,從而影響其它進程對該資源的訪問造成系統相應變慢的現象。
為解決這種情況,引入隔離的方式來運行,使資源間的訪問都是相互獨立的。
兩者隔離方式的區別
線程隔離
Hystrix
默認的隔離方式。針對不同的資源創建不同的線程池,不同服務調用都在不同的線程池中,在線程池排隊、超時等阻塞情況下可以快速失敗、並提供fallback機制。
- 優點
線程池隔離的好處是隔離程度比較高,可以針對某個資源的線程池去進行處理二部影響其它資源 - 缺點
代價是線程的上下文切換的代價比較大,特別是對低延時的調用影響比較大。
會讓機器資源碎片化。比如項目運行於tomcat容器中,本身tomcat自身的線程數就非常多,如果再加上Hystrix
創建的線程池,這樣上下文切換會有非常大的損耗。
線程池模式比較徹底的隔離性使得Hystrix
可以針對不同資源線程池進行排隊、超時情況分別做處理。
信號量隔離
限制對某個資源調用的並發數。
- 優點
這樣的隔離是輕量級,僅限制對某個資源調用的並發數,而不是顯式地去創建線程池,所以對系統地負載比較小。 - 缺點
無法對慢調用的自動進行降級,只能等待客戶端自己超時,因此可能會出現級聯阻塞的情況。
Sentinel
可以通過並發線程數模式的流量控制來提供信號量的隔離功能。並結合基於響應時間的熔斷降級模式,可以在不穩定的平均相應時間比較高的時候自動降級,防止過多的慢調用占滿並發數,影響整個系統
熔斷降級對比
兩者的熔斷降級功能本質上都是基於熔斷器模式
。Sentinel
與Hystrix
都支持基於失敗比率的熔斷降級,在調用達到一定量級並且失敗率達到設定閾值時自動進行熔斷,此時所有對改資源的調用都會被block,直到過了指定的失敗窗口才啟發性的恢復。