定义了继承自BlockExceptionHandler的bean,然后对一个api进行了限流
但是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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
BlockExceptionHandler 仅对 Sentinel 自带的 Web 埋点生效(URL 维度)。对于注解方式埋点,参考注解埋点文档,配置 blockHandler。
原回答者GitHub用户sczyh30
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。