摘要:要使用注解來保護資源需要引入下面的依賴引入之后我們需要配置切面讓其生效,因為是通過切面來實現的,我這邊以中使用進行配置示列然后在需要限制的方法上加注解即可錯誤發生在表示資源名,必填項處理的方法名,可選項。
在前面我們對Sentinel做了一個詳細的介紹,可以手動的通過Sentinel提供的SphU類來保護資源。這種做法不好的地方在于每個需要限制的地方都得寫代碼,從 0.1.1 版本開始,Sentinel 提供了 @SentinelResource 注解的方式,非常方便。
要使用注解來保護資源需要引入下面的Maven依賴:
com.alibaba.csp sentinel-annotation-aspectj 1.4.1
引入之后我們需要配置SentinelResourceAspect切面讓其生效,因為是通過SentinelResourceAspect切面來實現的,我這邊以Spring Boot中使用進行配置示列:
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 "錯誤發生在" + id; }SentinelResource:value
表示資源名,必填項
SentinelResource:blockHandler處理 BlockException 的方法名,可選項。若未配置,則將 BlockException 直接拋出。
blockHandler 函數訪問范圍需要是 public
返回類型需要與原方法相匹配
參數類型需要和原方法相匹配并且最后加一個額外的參數,類型為 BlockException
blockHandler 函數默認需要和原方法在同一個類中
如果你不想讓異常處理方法跟業務方法在同一個類中,可以使用 blockHandlerClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
業務方法:
@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("錯誤發生: " + ex.getClass().getCanonicalName()); return "error"; } }如何測試?
我們可以在Spring Boot的啟動類中定義規則,然后快速訪問接口,就可以看出效果啦,或者用壓力測試工具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就可以使用注解,我們來簡單的看下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 { // 獲取當前訪問的方法 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) { // 處理被限制的異常,回調事先配置的異常處理方法 return handleBlockException(pjp, annotation, ex); } catch (Throwable ex) { Tracer.trace(ex); throw ex; } finally { if (entry != null) { entry.exit(); } } } }
上面是整個切面的代碼,對所有加了SentinelResource注解的方法進去切入。細節代碼在AbstractSentinelAspectSupport中,大家自己去看看。
歡迎加入我的知識星球,一起交流技術,免費學習猿天地的課程(http://cxytiandi.com/course) PS:目前星球中正在星主的帶領下組隊學習Sentinel,等你哦!文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77463.html
摘要:實現熔斷降級注解除了可以用來做限流控制之外,還能實現與類似的熔斷降級策略。函數簽名要求返回值類型必須與原函數返回值類型一致方法參數列表需要為空,或者可以額外多一個類型的參數用于接收對應的異常。若未配置和,則被限流降級時會將直接拋出。 在之前的《使用Sentinel實現接口限流》一文中,我們僅依靠引入Spring Cloud Alibaba對Sentinel的整合封裝spring-clo...
摘要:開發階段很有意義。源碼整合配置文件中添加來開啟編寫類,實現默認用戶遠程調用被限流降級,默認用戶應用定義可以拿到異常信息無法拿到異常信息若初啟動應用,設置流控規則,結果展示如下默認用戶源碼 Sentinel API Github : WIKI Sphu (指明要保護的資源名稱) Tracer (指明調用來源,異常統計接口) ContextUtil(標示進入調用鏈入口) 流控規則(針...
摘要:應對突發請求時額外允許的請求數目。勻速排隊模式下的最長排隊時間,單位是毫秒,僅在勻速排隊模式下生效。和為后續參數匹配特性預留,目前未實現。 1. 前言 4月25號,Sentinel 1.6.0 正式發布,帶來 Spring Cloud Gateway 支持、控制臺登錄功能、改進的熱點限流和注解 fallback 等多項新特性,該出手時就出手,緊跟時代潮流,昨天剛發布,今天我就要給大家分...
摘要:現狀分布式場景中。因此要對在原服務不可用時進行熔斷降級處理。分析熔斷降級可以服務端限流網關限流客戶端限流。它提供兩種資源隔離的模式信號量隔離和線程池隔離。支持流控熔斷降級系統保護等。它支持并發數的流量控制也支持熔斷降級。 現狀 分布式場景中。若服務不穩定,會導致調用方服務也不可用,從而造成雪崩效應。因此要對在原服務不可用時進行熔斷降級處理。 分析 熔斷降級可以服務端限流、網關限流、客戶...
摘要:上一篇我們介紹了如何通過的配置功能來存儲限流規則。第六步啟動應用。深入思考在使用存儲規則配置的時候與存儲一樣,對于控制臺這些數據是只讀的,也就是說控制臺中修改規則僅存在于服務的內存中,不會修改中的配置值,重啟后恢復原來的值。 上一篇我們介紹了如何通過Nacos的配置功能來存儲限流規則。Apollo是國內用戶非常多的配置中心,所以,今天我們繼續說說Spring Cloud Alibaba...
閱讀 8892·2021-11-18 10:02
閱讀 2578·2019-08-30 15:43
閱讀 2651·2019-08-30 13:50
閱讀 1363·2019-08-30 11:20
閱讀 2701·2019-08-29 15:03
閱讀 3623·2019-08-29 12:36
閱讀 926·2019-08-23 17:04
閱讀 613·2019-08-23 14:18