Alibaba开源组件-分布式流量控制框架sentinel初探

Alibaba开源组件-分布式流量控制框架sentinel初探

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zj20142213/article/details/84930313

Sentinel 是什么?
还是皮一下吧详细的介绍在Alibaba已经介绍的很详细了。

Sentinel: 分布式系统的流量防卫兵

如何使用:
其实也就三个步骤:
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

运行结果:
在这里插入图片描述

posted on 2019-09-01 19:56  曹明  阅读(716)  评论(0编辑  收藏  举报