我是靠谱客的博主 无情魔镜,最近开发中收集的这篇文章主要介绍spring cloud alibaba (5)- sentinel熔断,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

当某个服务发生异常、响应慢等状态时,可能会影响到服务链中的所有服务,sentinel主要用于在发生状况时保护整体的可用性。

pom.xml


<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

定义保护资源

首先定义一个需要被保护的资源,比如一个控制层的请求,资源名为hello。之后可定义不同的保护规则对其进行保护

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

平均响应时间规则 (秒级)

如下规则将适用于资源hello,这里每秒内只要有1次调用hello方法的处理时间超过阈值(1毫秒),则会触发熔断。后续5秒时间内,所有对hello方法的请求都会直接抛出异常DegradeException。以防止这个方法发生状况响应太慢,从而影响整个系统。

	@PostConstruct
private void initDegradeRule() {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource("hello");
//保护资源名,对应hello
rule.setCount(1);
//熔断阈值,响应时间超过N毫秒
rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);//熔断策略为平均响应时间
rule.setTimeWindow(5);//触发熔断后,持续时间N秒
rule.setRtSlowRequestAmount(1);//每秒内有N次请求超出阈值,就触发熔断
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}

异常比例规则 (秒级)

以下规则与上面类似,有3个参数不一样。这里每秒至少有2次请求,而且超过10%的请求发生异常,就触发熔断。

	@PostConstruct
private void initDegradeRule() {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource("hello");
rule.setCount(0.1);
//阈值。发生请求异常的百分比,以小数表示
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);//策略为异常比例
rule.setTimeWindow(5);
rule.setMinRequestAmount(2);//每秒至少N次请求,达到阈值,会触发熔断
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}

异常数规则 (分钟级)

类似,这里是在1分钟内,发生的异常次数达到阈值(1次),即触发熔断。注意,如果设置timeWindow熔断时间小于1分钟,在熔断时间过后可能仍然是熔断状态,因为之前发生的异常,仍然在当前1分钟有效范围内。

	@PostConstruct
private void initDegradeRule() {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource("hello");
rule.setCount(1);//阈值
异常数N
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);//策略为异常数
rule.setTimeWindow(120);//触发熔断后,持续时间N秒
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}

熔断处理

发生熔断会抛出DegradeException异常,可在spring全局异常处理类中捕捉处理,也可单独处理。如下,配置了fallback对应的方法fallbackHandler,无论发生异常还是熔断,都会调用fallbackHandler,自行判断是否DegradeException即可区别处理。

	@SentinelResource(value = "hello", fallback = "fallbackHandler")
@RequestMapping("/hello")
public String hello() throws Exception {
int i=1/0;
return "业务处理";
}
public String fallbackHandler(Throwable e) {
if(e instanceof DegradeException) {
return "发生熔断";
}
return "发生异常";
}

fallback指定的方法返回类型和参数必须和原方法一致,只能多加一个Throwable e参数,用于接收异常。

@SentinelResource中的其他参数:

  • defaultFallback:和fallback一样作用,返回类型必须 一致,但是没有参数,或只有Throwable 参数。可用于多个服务的通用熔断处理。
  • fallbackClass:指定一个类中,fallback方法放在类中,必须是static
  • exceptionsToIgnore:排除的,不会进行统计的异常类型

最后

以上就是无情魔镜为你收集整理的spring cloud alibaba (5)- sentinel熔断的全部内容,希望文章能够帮你解决spring cloud alibaba (5)- sentinel熔断所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部