怎么使用BlockExceptionHandler?

定义了继承自BlockExceptionHandler的bean,然后对一个api进行了限流

提问36.png

但是bean的handle没有触发,而是抛了UndeclaredThrowableException异常。

然后看了SentinelResourceAspect,里面抛异常时好像先按有blockHander就按blockHandler处理,否则按fallback处理, 如果两者都没时抛异常

@Component public class SentinelExceptionHandler implements BlockExceptionHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception { Map<String, Object> resp = new HashMap<>(); // 不同的异常返回不同的提示语 String message = null; if (e instanceof FlowException) { message = "被限流了"; } else if (e instanceof DegradeException) { message = "服务降级了"; } else if (e instanceof ParamFlowException) { message = "被限流了"; } else if (e instanceof SystemBlockException) { message = "被系统保护了"; } else if (e instanceof AuthorityException) { message = "被授权了"; } response.setCharacterEncoding("utf-8"); response.setHeader("content-Type", "application/json"); response.getWriter().print("{"status":"1", "message":"" + message +""}"); } }

限流api

@RestController @RequestMapping(value = "/api/test", produces = {"application/json"}) public class TestController { @GetMapping(value = "/hello/{name}") @SentinelResource(value = "sayHello") public String apiHello(@PathVariable String name) { return "hello, " + name; } }

怎么使用BlockExceptionHandler?

原提问者GitHub用户jmbkeyes

展开
收起
学习娃 2023-05-19 14:58:03 234 分享 版权
1 条回答
写回答
取消 提交回答
  • BlockExceptionHandler 仅对 Sentinel 自带的 Web 埋点生效(URL 维度)。对于注解方式埋点,参考注解埋点文档,配置 blockHandler。

    原回答者GitHub用户sczyh30

    2023-05-19 20:09:43
    赞同 展开评论
问答分类:
API
问答地址:

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

还有其他疑问?
咨询AI助理