本文主要是介绍使用Sentinel自定义返回和实现区分来源方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教...
Sentinel自定义返回和实现区分来源
1. 自定义错误返回
因为流控和降级页面报的异常都是相同的,所以可以优化一下。
使用官方的接口blockExceptionHandler
(2.2.7.RELEASE)、UrlBlockHandler
(0.9.0.RELEASE)
定义处理类:
@Component public class MyUrlBlockHandler implements BlockExceptionHandler { @Ov编程erride public void handle(HttpServletRequest httpServletRequest, HttpServletResponse response, BlockException ex) throws Exception { ErrorMsg msg = null; if (ex instanceof FlowException) { msg = ErrorMsg.builder() .status(100) .msg("限流了") .bphpuild(); } else if (ex instanceof DegradeException) { msg = ErrorMsg.builder() .status(101) .msg("降级了") .build(); } else if (ex instanceof ParamFlowException) { msg = ErrorMsg.builder() .status(102) .msg("热点参数限流") .build(); } else if (ex instanceof SystemBlockException) { msg = ErrorMsg.builder() .status(103) .msg("系统规则(负载/...不满足要求)") .build(); } else if (ex instanceof AuthorityException) { msg = ErrorMsg.builder() .status(104) .msg("授权规则不通过") .build(); } // http状态码 response.setStatus(500); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Type", "application/json;charset=utf-8"); response.setContentType("apwww.chinasem.cnplication/json;charset=utf-8"); // spring mvc自带的json操作工具,叫jackson new ObjectMapper() .writeValue( responsephp.getWriter(), msg ); } } @Data @Builder @AllArgsConst编程ructor @NoArgsConstructor class ErrorMsg { private Integer status; private String msg; }
效果:
2. 实现区分来源
使用RequestOriginParser
接口
@Component public class MyRequestOriginParser implements RequestOriginParser { @Override public String parseorigin(HttpServletRequest request) { // 从请求参数中获取名为 origin 的参数并返回 // 如果获取不到origin参数,那么就抛异常 String origin = request.getParameter("origin"); if (StringUtils.isBlank(origin)) { throw new IllegalArgumentException("origin must be specified"); } return origin; } }
访问:http://127.0.0.1:8010/shares/1
控制台:
加上参数就可以了:
新加授权规则
再访问就不行了:
新增流控规则
换个名字就不会被限流
真实项目中一般把需要的参数放在请求header
中
总结
这篇关于使用Sentinel自定义返回和实现区分来源方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!