页面加载中...

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

| Java | 0 条评论 | 1198浏览

Preface

最近需要对公司的服务集成平台做一个流量控制、服务熔断等功能。刚好之前,也就是这个月初,在社区上看到阿里开源了一个流量控制的框架:Sentinel。  于是这次就打算试着整合一下。

官网的介绍:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

Sentinel主要以流量为切入点,对需要进行的流量控制、熔断降级的业务载体,叫做资源(resource),不同于Hystrix的线程池的方式进行熔断,Sentinel是使用一种计数的方式进行流量控制、服务熔断。通过统计该资源(resource)的qps、异常比例等等,进而对该资源实现流量控制、熔断降级的功能。

对熔断、流控的功能可自定义相应的参数,叫做规则(Rule),规则能够动态更改并及时生效。
Sentinel采用抛出异常(BlockException)的方式表示某个资源被阻塞了,超过了流控的阈值抛出FlowException,熔断后抛出DegradeException。

简单使用

该框架主要两部分,资源和规则。

资源就是:你需要对什么地方进行流量控制。

规则就是:对该资源有什么流量控制规则,比如,单位时间类只能接受多少次的请求。

1、添加依赖

目前的最新的版本是0.2


    com.alibaba.csp
    sentinel-core
    0.2.0

2、资源

需要使用如下的代码块将 你自己的代码块给包围起来。

Entry entry = null;
try {
    entry = SphU.entry(resource);
    //你的代码块
} catch (BlockException e1) {
    //怎么处理那些被阻塞的请求
} finally {
    if (entry != null) {
        entry.exit();
    }
}

在Sentinel中,对那些被阻塞的请求,都是用catch到BlockException异常的方式进行处理的。

3、规则

Sentinel定义了三种规则对象,分别是:

FlowRule:流量控制规则

DegradeRule:熔断降级规则

SystemRule:系统负载规则

我们需要定义的规则的参数都是对应这些类的属性。这三个规则分别对应者三个RuleManager来加载规则。比如对于流量控制规则,使用FlowRuleManager.loadRules(List rules)来加载定义好的流控规则,从API可以看出,定义的规则可以不止一个。

定义流量控制规则一个demo如下:

static void initFlowRules(String resource) {
    List rules = new ArrayList();
    FlowRule rule = new FlowRule();
    rule.setResource(resource);//资源名 
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//限流阈值类型,此处为qps类型
    rule.setCount(5);   //限流阈值,表示每秒钟通过5次请求 
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
}

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

发表评论

最新评论

    来第一个评论吧!