Sentinel同时配置fallback和blockHandler的问题

在SpringCloud中使用Sentinel进行服务治理时,当同时配置了fallback和blockHandler,服务熔断后会执行blockHandler逻辑而不是fallback。文章通过示例代码解释了当服务触发熔断规则时,BlockException会进入blockHandler处理流程,而不是fallback方法。
摘要由CSDN通过智能技术生成

Spring Cloud在使用Sentinel进行服务降级和熔断时,如果同时配置了fallbackblockHandler,则在服务熔断后,抛出的BlockException不会再fallback逻辑中执行,而是在blockHandler逻辑中执行。

首先来看只配置了fallback的情况,接口代码如下

	// 批量读取
	@GetMapping("/getBatch")
	@SentinelResource(value = "getTemplateInBatch"
		, fallback = "getTemplateInBatch_fallback")
	public Map<Long, CouponTemplateInfo> getTemplateInBatch(@RequestParam("ids") Collection<Long> ids){
		// 如果服务熔断,则不会打印以下日志,直接进入服务降级getTemplateInBatch_fallback方法中
		log.info("getTemplateInBatch: {}", JSON.toJSONString(ids));
		// 添加条件,如果满足则手动抛出一个运行时异常
		if(ids.contains(Long.valueOf(2))) {		
			throw new RuntimeException("测试sentinel熔断");
		}
		return this.couponTemplateService.getTemplateInfoMap(ids);
	}

	// getTemplateInBatch服务降级方法
	public Map<Long, CouponTemplateInfo> getTemplateInBatch_fallback(Collection<Long> ids){
		log.info("接口被降级了");
		return Maps.newHashMap();
	}
	
	// getTempalteInBatch限流后方法
	public Map<Long, CouponTemplateInfo> getTemplateInBatch_block(Collection<Long> ids,BlockException exception){
		log.info("接口被限流");
		return null;
	}

配置一个Sentinel熔断规则,即在10秒内5次及以上请求getTemplateInBatch资源,如果异常次数比率达到了60%,则服务熔断10秒
在这里插入图片描述
我们通过postman或者编写测试脚本对/getBatch接口进行测试,控制台打印日志如下
在这里插入图片描述
通过上面的日志可以看到,在前5次请求中打印了getTemplateInBatch: [2] 日志,说明执行了原方法,在第6次时因为满足了熔断条件,因此没有执行原方法,而是直接执行服务降级方法。这说明只配置fallback时,服务熔断后会进入fallback逻辑中进行处理。

接下来,在@SentinelResource注解中添加blockHandler属性

@GetMapping("/getBatch")
	@SentinelResource(value = "getTemplateInBatch"
		, fallback = "getTemplateInBatch_fallback"
		, blockHandler = "getTemplateInBatch_block")
	public Map<Long, CouponTemplateInfo> getTemplateInBatch(@RequestParam("ids") Collection<Long> ids){
		// 如果服务熔断,则不会打印以下日志,直接进入服务降级getTemplateInBatch_fallback方法中
		log.info("getTemplateInBatch: {}", JSON.toJSONString(ids));
		// 添加条件,如果满足则手动抛出一个运行时异常
		if(ids.contains(Long.valueOf(2))) {		
			throw new RuntimeException("测试sentinel熔断");
		}
		return this.couponTemplateService.getTemplateInfoMap(ids);
	}

并在Sentinel控制台中增加一条流量规则
在这里插入图片描述
重启应用后再次进行测试
在这里插入图片描述
可以看到,在同时配置了fallbackblockHandler的情况下,当服务熔断后,直接进入了blockHandler逻辑中处理,而没有进入fallback,因此如果同时配置了blockHandlerfallback,则BlockException只会进到blockHandler处理逻辑中(熔断后不会再进入原方法中,不会执行throw new RuntimeException,而是抛出BlockException)。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值