最近需要对公司的服务集成平台做一个流量控制、服务熔断等功能。刚好之前,也就是这个月初,在社区上看到阿里开源了一个流量控制的框架: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次以抛出异常的方式被隔离了。