摘要:要使用注解來(lái)保護(hù)資源需要引入下面的依賴引入之后我們需要配置切面讓其生效,因?yàn)槭峭ㄟ^切面來(lái)實(shí)現(xiàn)的,我這邊以中使用進(jìn)行配置示列然后在需要限制的方法上加注解即可錯(cuò)誤發(fā)生在表示資源名,必填項(xiàng)處理的方法名,可選項(xiàng)。
在前面我們對(duì)Sentinel做了一個(gè)詳細(xì)的介紹,可以手動(dòng)的通過Sentinel提供的SphU類來(lái)保護(hù)資源。這種做法不好的地方在于每個(gè)需要限制的地方都得寫代碼,從 0.1.1 版本開始,Sentinel 提供了 @SentinelResource 注解的方式,非常方便。
要使用注解來(lái)保護(hù)資源需要引入下面的Maven依賴:
com.alibaba.csp sentinel-annotation-aspectj 1.4.1
引入之后我們需要配置SentinelResourceAspect切面讓其生效,因?yàn)槭峭ㄟ^SentinelResourceAspect切面來(lái)實(shí)現(xiàn)的,我這邊以Spring Boot中使用進(jìn)行配置示列:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect; @Configuration public class AopConfiguration { @Bean public SentinelResourceAspect sentinelResourceAspect() { return new SentinelResourceAspect(); } }
然后在需要限制的方法上加SentinelResource注解即可:
@SentinelResource(value = "get", blockHandler = "exceptionHandler") @Override public String get(String id) { return "http://cxytiandi.com"; } public String exceptionHandler(String id, BlockException e) { e.printStackTrace(); return "錯(cuò)誤發(fā)生在" + id; }SentinelResource:value
表示資源名,必填項(xiàng)
SentinelResource:blockHandler處理 BlockException 的方法名,可選項(xiàng)。若未配置,則將 BlockException 直接拋出。
blockHandler 函數(shù)訪問范圍需要是 public
返回類型需要與原方法相匹配
參數(shù)類型需要和原方法相匹配并且最后加一個(gè)額外的參數(shù),類型為 BlockException
blockHandler 函數(shù)默認(rèn)需要和原方法在同一個(gè)類中
如果你不想讓異常處理方法跟業(yè)務(wù)方法在同一個(gè)類中,可以使用 blockHandlerClass 為對(duì)應(yīng)的類的 Class 對(duì)象,注意對(duì)應(yīng)的函數(shù)必需為 static 函數(shù),否則無(wú)法解析。
業(yè)務(wù)方法:
@SentinelResource(value = "get2", blockHandler = "handleException", blockHandlerClass = { ExceptionUtil.class }) @Override public String get2() { return "http://cxytiandi.com"; }
異常處理類:
import com.alibaba.csp.sentinel.slots.block.BlockException; public final class ExceptionUtil { public static String handleException(BlockException ex) { System.err.println("錯(cuò)誤發(fā)生: " + ex.getClass().getCanonicalName()); return "error"; } }如何測(cè)試?
我們可以在Spring Boot的啟動(dòng)類中定義規(guī)則,然后快速訪問接口,就可以看出效果啦,或者用壓力測(cè)試工具ab等。
@SpringBootApplication public class App { public static void main(String[] args) { initFlowRules(); SpringApplication.run(App.class, args); } private static void initFlowRules() { List源碼分析rules = new ArrayList<>(); FlowRule rule = new FlowRule(); rule.setResource("get"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setCount(1); rules.add(rule); rule = new FlowRule(); rule.setResource("get2"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setCount(1); rules.add(rule); FlowRuleManager.loadRules(rules); } }
只需要配置了SentinelResourceAspect就可以使用注解,我們來(lái)簡(jiǎn)單的看下SentinelResourceAspect的源碼
@Aspect public class SentinelResourceAspect extends AbstractSentinelAspectSupport { @Pointcut("@annotation(com.alibaba.csp.sentinel.annotation.SentinelResource)") public void sentinelResourceAnnotationPointcut() { } @Around("sentinelResourceAnnotationPointcut()") public Object invokeResourceWithSentinel(ProceedingJoinPoint pjp) throws Throwable { // 獲取當(dāng)前訪問的方法 Method originMethod = resolveMethod(pjp); // 獲取方法上的SentinelResource注解 SentinelResource annotation = originMethod.getAnnotation(SentinelResource.class); if (annotation == null) { // Should not go through here. throw new IllegalStateException("Wrong state for SentinelResource annotation"); } // 獲取資源名 String resourceName = getResourceName(annotation.value(), originMethod); EntryType entryType = annotation.entryType(); Entry entry = null; try { entry = SphU.entry(resourceName, entryType, 1, pjp.getArgs()); Object result = pjp.proceed(); return result; } catch (BlockException ex) { // 處理被限制的異常,回調(diào)事先配置的異常處理方法 return handleBlockException(pjp, annotation, ex); } catch (Throwable ex) { Tracer.trace(ex); throw ex; } finally { if (entry != null) { entry.exit(); } } } }
上面是整個(gè)切面的代碼,對(duì)所有加了SentinelResource注解的方法進(jìn)去切入。細(xì)節(jié)代碼在AbstractSentinelAspectSupport中,大家自己去看看。
歡迎加入我的知識(shí)星球,一起交流技術(shù),免費(fèi)學(xué)習(xí)猿天地的課程(http://cxytiandi.com/course) PS:目前星球中正在星主的帶領(lǐng)下組隊(duì)學(xué)習(xí)Sentinel,等你哦!文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77463.html
摘要:實(shí)現(xiàn)熔斷降級(jí)注解除了可以用來(lái)做限流控制之外,還能實(shí)現(xiàn)與類似的熔斷降級(jí)策略。函數(shù)簽名要求返回值類型必須與原函數(shù)返回值類型一致方法參數(shù)列表需要為空,或者可以額外多一個(gè)類型的參數(shù)用于接收對(duì)應(yīng)的異常。若未配置和,則被限流降級(jí)時(shí)會(huì)將直接拋出。 在之前的《使用Sentinel實(shí)現(xiàn)接口限流》一文中,我們僅依靠引入Spring Cloud Alibaba對(duì)Sentinel的整合封裝spring-clo...
摘要:開發(fā)階段很有意義。源碼整合配置文件中添加來(lái)開啟編寫類,實(shí)現(xiàn)默認(rèn)用戶遠(yuǎn)程調(diào)用被限流降級(jí),默認(rèn)用戶應(yīng)用定義可以拿到異常信息無(wú)法拿到異常信息若初啟動(dòng)應(yīng)用,設(shè)置流控規(guī)則,結(jié)果展示如下默認(rèn)用戶源碼 Sentinel API Github : WIKI Sphu (指明要保護(hù)的資源名稱) Tracer (指明調(diào)用來(lái)源,異常統(tǒng)計(jì)接口) ContextUtil(標(biāo)示進(jìn)入調(diào)用鏈入口) 流控規(guī)則(針...
摘要:應(yīng)對(duì)突發(fā)請(qǐng)求時(shí)額外允許的請(qǐng)求數(shù)目。勻速排隊(duì)模式下的最長(zhǎng)排隊(duì)時(shí)間,單位是毫秒,僅在勻速排隊(duì)模式下生效。和為后續(xù)參數(shù)匹配特性預(yù)留,目前未實(shí)現(xiàn)。 1. 前言 4月25號(hào),Sentinel 1.6.0 正式發(fā)布,帶來(lái) Spring Cloud Gateway 支持、控制臺(tái)登錄功能、改進(jìn)的熱點(diǎn)限流和注解 fallback 等多項(xiàng)新特性,該出手時(shí)就出手,緊跟時(shí)代潮流,昨天剛發(fā)布,今天我就要給大家分...
摘要:現(xiàn)狀分布式場(chǎng)景中。因此要對(duì)在原服務(wù)不可用時(shí)進(jìn)行熔斷降級(jí)處理。分析熔斷降級(jí)可以服務(wù)端限流網(wǎng)關(guān)限流客戶端限流。它提供兩種資源隔離的模式信號(hào)量隔離和線程池隔離。支持流控熔斷降級(jí)系統(tǒng)保護(hù)等。它支持并發(fā)數(shù)的流量控制也支持熔斷降級(jí)。 現(xiàn)狀 分布式場(chǎng)景中。若服務(wù)不穩(wěn)定,會(huì)導(dǎo)致調(diào)用方服務(wù)也不可用,從而造成雪崩效應(yīng)。因此要對(duì)在原服務(wù)不可用時(shí)進(jìn)行熔斷降級(jí)處理。 分析 熔斷降級(jí)可以服務(wù)端限流、網(wǎng)關(guān)限流、客戶...
摘要:上一篇我們介紹了如何通過的配置功能來(lái)存儲(chǔ)限流規(guī)則。第六步啟動(dòng)應(yīng)用。深入思考在使用存儲(chǔ)規(guī)則配置的時(shí)候與存儲(chǔ)一樣,對(duì)于控制臺(tái)這些數(shù)據(jù)是只讀的,也就是說(shuō)控制臺(tái)中修改規(guī)則僅存在于服務(wù)的內(nèi)存中,不會(huì)修改中的配置值,重啟后恢復(fù)原來(lái)的值。 上一篇我們介紹了如何通過Nacos的配置功能來(lái)存儲(chǔ)限流規(guī)則。Apollo是國(guó)內(nèi)用戶非常多的配置中心,所以,今天我們繼續(xù)說(shuō)說(shuō)Spring Cloud Alibaba...
閱讀 9078·2021-11-18 10:02
閱讀 2619·2019-08-30 15:43
閱讀 2668·2019-08-30 13:50
閱讀 1388·2019-08-30 11:20
閱讀 2714·2019-08-29 15:03
閱讀 3636·2019-08-29 12:36
閱讀 936·2019-08-23 17:04
閱讀 625·2019-08-23 14:18