Alibaba开源组件-分布式流量控制框架sentinel初探
2018年12月09日 18:23:11 SuperPurse 阅读数 1965更多 分类专栏: J2EESentinel 是什么?
还是皮一下吧详细的介绍在Alibaba已经介绍的很详细了。
如何使用:
其实也就三个步骤:
1、添加依赖
目前的最新的版本是0.2
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>0.2.0</version>
</dependency>
- 1
- 2
- 3
- 4
- 5
2、初始化资源
需要使用如下的代码块将 你自己的代码块给包围起来。
Entry entry = null;
try {
entry = SphU.entry(resource);
//我的代码块
doSomething();
} catch (BlockException e1) {
//怎么处理那些被阻塞的请求
} finally {
if (entry != null) {
entry.exit();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
在Sentinel中,对那些被阻塞的请求,都是用catch到BlockException异常的方式进行处理的。
3、定义流量控制规则
Sentinel定义了三种规则对象,分别是:
FlowRule:流量控制规则
DegradeRule:熔断降级规则
SystemRule:系统负载规则
- 1
- 2
- 3
- 4
- 5
我们需要定义的规则的参数都是对应这些类的属性。这三个规则分别对应者三个RuleManager来加载规则。比如对于流量控制规则,使用FlowRuleManager.loadRules(List rules)来加载定义好的流控规则,从API可以看出,定义的规则可以不止一个。
定义流量控制规则一个demo如下:
publicp 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); //将定义好的rule放在List中
FlowRuleManager.loadRules(rules);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
详细demo如下:
package com.alibaba.alibabaSentinel.test;
/**
*
* Copyright: Copyright (c) 2018 Jun_Zhou
*
* @ClassName: SentinelTest.java
* @Description: 分布式流量框架sentinel测试程序;
*
* @version: v1.0.0
* @author: JunZhou
* @Email: 1769676159@qq.com
* @Site: CERNO
* @date: 2018年12月9日 下午5:57:51
*/
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
public class SentinelTest
{
static int executedNumber = 0;
@Test
public void test01()
{
String resourceName = "qpsSentinel";
initFlowRules(resourceName); //上面定义的规则
for (int i = 0; i < 10; i++)
{
Entry entry = null;
try
{
entry = SphU.entry(resourceName);
//我的代码块
doSomething();
}
catch (BlockException e1)
{
e1.printStackTrace(); //直接将异常打出来
}
finally
{
if (entry != null)
{
entry.exit();
}
}
}
}
public static void doSomething()
{
// TODO Auto-generated method stub
executedNumber++;
System.out.print("-------CurrentExecutedNumber-------" + executedNumber);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
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); //将定义好的rule放在List中
FlowRuleManager.loadRules(rules);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
运行结果: