分散式流量控制框架sentinel初探
阿新 • • 發佈:2018-11-05
最近需要對公司的服務整合平臺做一個流量控制、服務熔斷等功能。剛好之前,也就是這個月初,在社群上看到阿里開源了一個流量控制的框架:Sentinel。 於是這次就打算試著整合一下。
官網的介紹:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
在官方的文件介紹中,可以看到,Sentinel
簡單使用
該框架主要兩部分,資源和規則。
資源就是:你需要對什麼地方進行流量控制。
規則就是:對該資源有什麼流量控制規則,比如,單位時間類只能接受多少次的請求。
- 新增依賴
目前的最新的版本是0.2.0
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>0.2.0</version> </dependency>
- 資源
需要使用如下的程式碼塊將 你自己的程式碼塊給包圍起來。
Entry entry = null; try { entry = SphU.entry(resource); //你的程式碼塊 } catch (BlockException e1) { //怎麼處理那些被阻塞的請求 } finally { if (entry != null) { entry.exit(); } }
在Sentinel中,對那些被阻塞的請求,都是用catch到BlockException異常的方式進行處理的。
- 規則
Sentinel定義了三種規則物件,分別是:
FlowRule:流量控制規則
DegradeRule:熔斷降級規則
SystemRule:系統負載規則
我們需要定義的規則的引數都是對應這些類的屬性。這三個規則分別對應者三個RuleManager來載入規則。比如對於流量控制規則,使用FlowRuleManager.loadRules(List<FlowRule> rules)來載入定義好的流控規則,從API可以看出,定義的規則可以不止一個。
定義流量控制規則一個demo如下:
public static void initFlowRules(String resource){
List<FlowRule> rules = new ArrayList<FlowRule>();
FlowRule rule = new FlowRule();
rule.setResource(resource); //資源名
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); //限流閾值型別,此處為qps型別
rule.setCount(5); //限流閾值,表示每秒鐘通過5次請求
rules.add(rule); //將定義好的rule放在List中
FlowRuleManager.loadRules(rules);
}
- 整體的demo如下:
@Test
public void test01(){
initFlowRules(resource); //上面定義的規則
for (int i = 0; i < 10; i++) {
Entry entry = null;
try {
entry = SphU.entry(resource);
//我的程式碼塊
doSomething();
} catch (BlockException e1) {
e1.printStackTrace(); //直接將異常打出來
} finally {
if (entry != null) {
entry.exit();
}
}
}
}
如上,我執行main方法10次,定義的流量規則為5個qps,執行結果如下:
如上,執行了10次,只有5次通過程式碼塊,其他5次以丟擲異常的方式被隔離了。