使用Sentinel自定义返回和实现区分来源方式
作者:Gangbb
这篇文章主要介绍了使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Sentinel自定义返回和实现区分来源
1. 自定义错误返回
因为流控和降级页面报的异常都是相同的,所以可以优化一下。
使用官方的接口BlockExceptionHandler
(2.2.7.RELEASE)、UrlBlockHandler
(0.9.0.RELEASE)
定义处理类:
@Component public class MyUrlBlockHandler implements BlockExceptionHandler { @Override public void handle(HttpServletRequest httpServletRequest, HttpServletResponse response, BlockException ex) throws Exception { ErrorMsg msg = null; if (ex instanceof FlowException) { msg = ErrorMsg.builder() .status(100) .msg("限流了") .build(); } 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("application/json;charset=utf-8"); // spring mvc自带的json操作工具,叫jackson new ObjectMapper() .writeValue( response.getWriter(), msg ); } } @Data @Builder @AllArgsConstructor @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
中
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。