最近在使用sentinel过程中发现,如果使用springboot的
@RestControllerAdvice
全局异常捕获,那么设置sentinel的异常数熔断规则就会失效,去github上看sentinel的Issues发现已经有人提过这问题,官方也是没有正面回复
官方文档更不用说,只字未提,各种搜索引擎也是未找到方案,还好经过我不懈努力,
经过分析源码后找到了解决方案,废话不多说,直接上干货
因为Sentinel的熔断规则是基于异常数统计的。
为了解决这个问题,你可以在全局异常处理器中手动调用Sentinel的统计接口,将异常信息传递给Sentinel进行统计。具体来说,你可以在@ExceptionHandler方法中使用Tracer.trace(ex)方法将异常信息传递给Sentinel进行统计。例如:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception ex) {
// 记录异常信息到Sentinel中
Tracer.trace(ex);
// 处理异常并返回响应
ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
注意:这种情况是发生在使用sentinel控制台直接在资源上设置的规则,如果使用注解@SentinelResource
标记熔断限流资源,不受影响,因为注解里标明了具体fallback
在使用sentinel过程中,还需要将规则持久化才能投入生产,持久化的方案有好几种,推荐使用nacos,但是直接在nacos里手写配置的话也是不够友好的,这里作者将sentinel源码改造,直接在控制台就可以将设置好的规则推送给nacos,利用了nacos的api接口方式,如果大家有兴趣,过段时间,我会将改造后的源码放上来