Alibaba开源组件-分布式流量控制框架sentinel初探
版权声明:本文为博主原创文章,遵循版权协议,转载请附上原文出处链接和本声明。
本文链接:
Sentinel 是什么?
还是皮一下吧详细的介绍在Alibaba已经介绍的很详细了。如何使用:
其实也就三个步骤:1、添加依赖目前的最新的版本是0.2com.alibaba.csp sentinel-core 0.2.0
- 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
运行结果: