這篇文章主要講解了“使用alibaba sentinel失敗的問題有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“使用alibaba sentinel失敗的問題有哪些”吧!
創(chuàng)新互聯(lián)從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站制作、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元白堿灘做網(wǎng)站,已為上家服務(wù),為白堿灘各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
sentinel 是面向分布式服務(wù)架構(gòu)的流量控制組件,主要以流量為切入點,從限流、流量整形、熔斷降級、系統(tǒng)負載保護、熱點防護等多個維度來幫助開發(fā)者保障微服務(wù)的穩(wěn)定性。自從hytrix 2018年進入維護狀態(tài),再到springcloud 2020.0版本hytrix被移除,就可以料想未來一段時間springcloud全家桶的熔斷降級組件基本上的首選就是alibaba sentinel。
a、原因分析
項目中使用了自定義全局異常處理,而異常數(shù)或者異常比例的統(tǒng)計在
com.alibaba.csp.sentinel.adapter.spring.webmvc.AbstractSentinelInterceptor.afterCompletion
這個方法執(zhí)行, 自定義全局異常的處理會先于
com.alibaba.csp.sentinel.adapter.spring.webmvc.AbstractSentinelInterceptor.afterCompletion
這個方法執(zhí)行執(zhí)行, 因為我們在全局異常里面已經(jīng)對異常進行處理,比如轉(zhuǎn)換為一個對象,這樣導(dǎo)致AbstractSentinelInterceptor.afterCompletion無法獲取到異常,進而無法統(tǒng)計異常數(shù)或者異常比例。
b、解決方案
在官方的issue中已經(jīng)有網(wǎng)友提出了解決思路 https://github.com/alibaba/Sentinel/issues/1281 和 https://github.com/alibaba/Sentinel/issues/404
因為我是在查issue的之前,就通過源碼跟蹤,找到答案,這邊說下我的實現(xiàn)思路。我的思路是定義一個切面,在切面的AfterThrowing進行異常統(tǒng)計。因為切面會在全局異常之前執(zhí)行。統(tǒng)計的源碼我是直接把sentinel統(tǒng)計的源拷貝過來,核心代碼如下
@Aspect @Component @Slf4j public class StatisticsExceptionCountAspect { @Autowired @Lazy private BaseWebMvcConfig baseWebMvcConfig; @Pointcut("execution(* com.github.lybgeek.sentinel.controller..*.*(..))") public void pointcut(){ } @AfterThrowing(pointcut = "pointcut()",throwing = "ex") public void afterAfterThrowing(Throwable ex){ log.info("statisticsExceptionCount..."); traceException(ex); } /** * 統(tǒng)計異常 * @param ex */ private void traceException(Throwable ex) { Entry entry = getEntryInRequest(); if (entry != null) { Tracer.traceEntry(ex, entry); } } protected Entry getEntryInRequest() { RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); ServletRequestAttributes attributes = (ServletRequestAttributes)requestAttributes; HttpServletRequest request = attributes.getRequest(); Object entryObject = request.getAttribute(baseWebMvcConfig.getRequestAttributeName()); return entryObject == null ? null : (Entry)entryObject; } }
a、原因分析
項目中沒有實現(xiàn)
com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser
接口,導(dǎo)致無法解析請求來源
b、解決方案
在項目中自定義請求來源解析器。示例代碼如下
** * @description: 解析訪問來源,用于授權(quán)規(guī)則--黑白名單。 * 當(dāng)要進行授權(quán)規(guī)則時,則必須配置RequestOriginParser,否則授權(quán)規(guī)則無法生效 * **/ @Component public class CustomRequestOriginParser implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest request) { String origin = request.getParameter("origin"); if(!StringUtils.isEmpty(origin)){ //根據(jù)接口是否攜帶origin參數(shù),如果攜帶參數(shù)為origin=pc, // 且sentinel-dashbord授權(quán)規(guī)則,來源設(shè)置為pc時,則表示要對請求來源為pc,進行黑白名單配置 return origin; } //如果沒請求參數(shù)接口沒有攜帶,則表示按ip進行黑白名單設(shè)置 return request.getRemoteAddr(); } }
a、原因分析
web埋點如果以url作為資源名,規(guī)則不生效
b、解決方案
以@SentinelResource注解定義的name作為資源名
參考官方issuehttps://github.com/alibaba/Sentinel/issues/1734
配置熱點規(guī)則配置@SentinelResource后,可能還會出現(xiàn)
java.lang.reflect.UndeclaredThrowableException: null
解決方法:需要在方法中添加throws BlockException或添加blockHandler來處理異常
參考官方issue
https://github.com/alibaba/Sentinel/issues/776
示例代碼
@GetMapping(value = "/paramFlowRule/{msg}") @ApiImplicitParams({ @ApiImplicitParam(name="msg",defaultValue = "hello",value="信息", paramType = "path"), }) @ApiOperation(value = "測試熱點規(guī)則") @SentinelResource(value = "testParamFlowRule") public AjaxResult<String> testParamFlowRule(@PathVariable("msg") String msg) throws BlockException { System.out.println(String.format("msg : %s",msg)); return AjaxResult.success("測試熱點規(guī)則"); }
感謝各位的閱讀,以上就是“使用alibaba sentinel失敗的問題有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對使用alibaba sentinel失敗的問題有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
分享名稱:使用alibabasentinel失敗的問題有哪些
文章來源:http://aaarwkj.com/article38/igjipp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站收錄、ChatGPT、企業(yè)網(wǎng)站制作、營銷型網(wǎng)站建設(shè)、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)