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