使用Sentinel自定義返回和實(shí)現(xiàn)區(qū)分來(lái)源方式
Sentinel自定義返回和實(shí)現(xiàn)區(qū)分來(lái)源
1. 自定義錯(cuò)誤返回
因?yàn)榱骺睾徒导?jí)頁(yè)面報(bào)的異常都是相同的,所以可以?xún)?yōu)化一下。
使用官方的接口BlockExceptionHandler
(2.2.7.RELEASE)、UrlBlockHandler
(0.9.0.RELEASE)
定義處理類(lèi):
@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("降級(jí)了") .build(); } else if (ex instanceof ParamFlowException) { msg = ErrorMsg.builder() .status(102) .msg("熱點(diǎn)參數(shù)限流") .build(); } else if (ex instanceof SystemBlockException) { msg = ErrorMsg.builder() .status(103) .msg("系統(tǒng)規(guī)則(負(fù)載/...不滿(mǎn)足要求)") .build(); } else if (ex instanceof AuthorityException) { msg = ErrorMsg.builder() .status(104) .msg("授權(quán)規(guī)則不通過(guò)") .build(); } // http狀態(tài)碼 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. 實(shí)現(xiàn)區(qū)分來(lái)源
使用RequestOriginParser
接口
@Component public class MyRequestOriginParser implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest request) { // 從請(qǐng)求參數(shù)中獲取名為 origin 的參數(shù)并返回 // 如果獲取不到origin參數(shù),那么就拋異常 String origin = request.getParameter("origin"); if (StringUtils.isBlank(origin)) { throw new IllegalArgumentException("origin must be specified"); } return origin; } }
訪問(wèn):http://127.0.0.1:8010/shares/1
控制臺(tái):
加上參數(shù)就可以了:
新加授權(quán)規(guī)則
再訪問(wèn)就不行了:
新增流控規(guī)則
換個(gè)名字就不會(huì)被限流
真實(shí)項(xiàng)目中一般把需要的參數(shù)放在請(qǐng)求header
中
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java String字符串補(bǔ)0或空格的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java String字符串補(bǔ)0或空格的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-09-09完美解決springboot中使用mybatis字段不能進(jìn)行自動(dòng)映射的問(wèn)題
今天在springboot中使用mybatis的時(shí)候不能字段不能夠進(jìn)行自動(dòng)映射,接下來(lái)給大家給帶來(lái)了完美解決springboot中使用mybatis字段不能進(jìn)行自動(dòng)映射的問(wèn)題,需要的朋友可以參考下2023-05-05JavaWeb中轉(zhuǎn)發(fā)與重定向的區(qū)別小結(jié)
轉(zhuǎn)發(fā)和重定向是JavaWeb中常用的兩種頁(yè)面跳轉(zhuǎn)方式,它們?cè)趯?shí)現(xiàn)上有一些區(qū)別,本文主要介紹了JavaWeb中轉(zhuǎn)發(fā)與重定向的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Java實(shí)現(xiàn)UDP多線程在線咨詢(xún)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)UDP多線程在線咨詢(xún),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04java Spring MVC4環(huán)境搭建實(shí)例詳解(步驟)
spring WEB MVC框架提供了一個(gè)MVC(model-view-controller)模型-視圖-控制器的結(jié)構(gòu)和組件,利用它可以開(kāi)發(fā)更靈活、松耦合的web應(yīng)用。MVC模式使得整個(gè)服務(wù)應(yīng)用的各部分(控制邏輯、業(yè)務(wù)邏輯、UI界面展示)分離開(kāi)來(lái),使它們之間的耦合性更低2017-08-08spring boot配合前端實(shí)現(xiàn)跨域請(qǐng)求訪問(wèn)
本篇文章主要介紹了spring boot配合前端實(shí)現(xiàn)跨域請(qǐng)求訪問(wèn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04詳解Spring注解--@Autowired、@Resource和@Service
本篇文章主要介紹最重要的三個(gè)Spring注解,也就是@Autowired、@Resource和@Service,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05