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:排除的,不会进行统计的异常类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值