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

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次以抛出异常的方式被隔离了。

猜你喜欢

转载自blog.csdn.net/abreaking2012/article/details/82116993