分散式流量控制框架sentinel初探

abreaking2012發表於2018-08-27

from:http://blog.abreaking.com/c/%E5%88%86%E5%B8%83%E5%BC%8F%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6%E6%A1%86%E6%9E%B6sentinel%E5%88%9D%E6%8E%A2

最近需要對公司的服務整合平臺做一個流量控制、服務熔斷等功能。剛好之前,也就是這個月初,在社群上看到阿里開源了一個流量控制的框架: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);
    }
  1. 整體的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次以丟擲異常的方式被隔離了。

相關文章