• 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

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

  • 相关阅读:
    008Spring & JPA & Hibernate & MySQL
    007Spring Security
    006Spring面向切面
    005运行时值注入
    004bean作用域
    003自动装配歧义性解决
    002Conditional条件化创建bean
    001profile条件化创建bean
    007API网关服务Zuul
    Sqlserver2008R2 如何使用bak备份文件还原数据库以及对应的失败解决方案
  • 原文地址:https://www.cnblogs.com/think90/p/11443376.html
Copyright © 2020-2023  润新知