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
中
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论