ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

spring cloud alibaba (6)- sentinel限流

2020-12-06 13:32:45  阅读:198  来源: 互联网

标签:10 请求 spring rule 限流 sentinel hello RuleConstant


当访问量过大,超出系统可能承受的范围时,就会把整个系统压垮。限流就是限制请求数量,以保障系统稳定。

定义限流资源

和熔断一样,先定义一个要被限流的资源。

	@SentinelResource(value = "hello")
	@RequestMapping("/hello")
	public String hello() throws Exception {
		Thread.sleep(10);
		return "业务处理";
	}

并发限流规则 

每秒之内,当hello资源的并发请求数达到10,就会触发限流。即第11个请求开始全部会被拒绝,抛出FlowException异常。

	@PostConstruct
	private void initFlowRule() {
	    List<FlowRule> rules = new ArrayList<>();
	    FlowRule rule = new FlowRule();    
	    rule.setResource("hello");    //保护资源名
	    rule.setCount(10);    //并发数
	    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);  //策略为QPS并发
	    rules.add(rule);
	    FlowRuleManager.loadRules(rules);
    }

也可以修改策略,根据并发线程数来限流。一个请求耗时可能只需要几毫秒,在1秒之内,一个线程处理完这个请求后,马上可以继续处理更多N个请求,其占用的并发线程数是1。

 rule.setGrade(RuleConstant.FLOW_GRADE_THREAD);  //策略为线程并发

Warm Up预热模式

当请求量从较低的数量突然变得很大时,有时可能希望给系统一个逐步适应的预热过程。比如限流数为10,预热时间10秒,突然每秒都会收到100个语法,可能第一秒只接收3-5个请求,第二秒4-6个等,每秒逐步递增,直到10秒后,会稳定接收10个请求。

FlowRule rule = new FlowRule();
rule.setResource("hello");
rule.setCount(10);
rule.setGrade(RuleConstant.GRADE_QPS);
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP); //预热控制行为
rule.setWarmUpPeriodSec(10);    //预热时间为10秒

匀速排队模式

可能在某一时点请求特别大,比如秒杀。系统无法及时处理,但是可以放在队列中,每间隔一定时间,匀速逐个处理。如下,假如瞬间有100个请求,而我们每秒处理极限是10,排除时间是10秒,那么系统每100毫秒只会接收1个请求。并且预估在排队时间内能否完成剩余请求,能完成的就去排队,不能完成的就直接拒绝。这里理论上,10秒之内会匀速完成全部100个请求。

rule.setGrade(RuleConstant.GRADE_QPS);
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER); //匀速排队模式
rule.setCount(10);
rule.setMaxQueueingTimeMs(10 * 1000);//排队时间为10秒

限流处理

和熔断类似,限流后会抛出FlowException异常,可在spring全局异常处理类中捕捉处理,也可单独处理。配置blockHandler对应的方法即可.

	@SentinelResource(value = "hello", blockHandler = "blockHandler")
	@RequestMapping("/hello")
	public String hello() throws Exception {
		Thread.sleep(10);
		return "业务处理";
	}
	
	public String blockHandler(BlockException e) {
		return "发生限流";

    }

blockHandler指定的方法返回类型和参数必须和原方法一致,只能多加一个BlockException e参数,用于接收异常。也可以通过blockHandlerClass指定一个类来处理,将blockHandler的方法放在类中,类中的方法必须是静态的。

标签:10,请求,spring,rule,限流,sentinel,hello,RuleConstant
来源: https://blog.csdn.net/wangb_java/article/details/108033006

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有