开发者社区 > 云原生 > 正文

主流框架适配Servlet 时,设置熔断降级异常比例和异常数规则均不生效

接口测试类

@Api(tags = "sentinel适配器测试控制器") @RestController @RequestMapping(value = "/sentinel/adapter") public class SentinelAdapterTestController extends BaseController {

@ApiOperation(value = "降级测试-平均响应时间", httpMethod = "GET")
@RequestMapping(value = "degrade", method = RequestMethod.GET)
public Result degrade() {
	List<DegradeRule> rules = DegradeRuleManager.getRules();
	System.out.println("rules:" + rules);
    try {
		TimeUnit.MILLISECONDS.sleep(600);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
    return succeed();
}


@ApiOperation(value = "降级测试-异常比例", httpMethod = "GET")
@RequestMapping(value = "exceptionRatioDegrade", method = RequestMethod.GET)
public Result exceptionRatioDegrade() {
	List<DegradeRule> rules = DegradeRuleManager.getRules();
	System.out.println("rules:" + rules);
	int a = 1 / 0;
	return succeed();
}

@ApiOperation(value = "降级测试-异常数", httpMethod = "GET")
@RequestMapping(value = "exceptionCountDegrade", method = RequestMethod.GET)
public Result exceptionCountDegrade() {
	List<DegradeRule> rules = DegradeRuleManager.getRules();
	System.out.println("rules:" + rules);
	int a = 1 / 0;
	return succeed();
}

}

设置的降级规则

提问250.png

问题描述: 设置的异常比例和异常数规则均不生效,一直请求都可以进入方法

原提问者GitHub用户ftpxzxh

展开
收起
码字王 2023-05-19 19:07:38 108 0
1 条回答
写回答
取消 提交回答
  • 经过测试,发现是自己项目中有全局异常拦截,导致无法进入到Sentinel的自动异常统计代码,可以在全局异常的处理逻辑方法的最前面调用一下以下代码即可解决该问题

    private void recordExceptionToSentinel(Throwable e) throws Throwable { if (e instanceof BlockException) { throw e; }else if(e instanceof IOException){ Tracer.trace(e); }else if(e instanceof ServletException){ Tracer.trace(e); }else if(e instanceof RuntimeException){ Tracer.trace(e); } }

    回答10.png

    原回答者GitHub用户ftpxzxh

    2023-05-19 22:46:03
    赞同 展开评论 打赏
问答分类:
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载