当前位置: 首页 > web >正文

Sentinel源码—7.参数限流和注解的实现二

大纲

1.参数限流的原理和源码

2.@SentinelResource注解的使用和实现

2.@SentinelResource注解的使用和实现

(1)@SentinelResource注解的使用

(2)@SentinelResource注解和实现

(1)@SentinelResource注解的使用

一.引入Sentinel Spring Boot Starter依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel</artifactId><version>2.2.1.RELEASE</version>
</dependency>

二.为方法添加@SentinelResource注解

下面的代码为sayHello()方法添加了@SentinelResource注解,并指定了资源名称为sayHello以及熔断降级时的回调方法fallback()。这样在请求sayHello()方法后,就可以在Sentinel Dashboard上看到此资源,然后就可以针对此资源进行一系列的规则配置了。

@Service
public class MyService {@SentinelResource(value = "sayHello", fallback = "fallback")public String sayHello(String name) {return "Hello, " + name;}public String fallback(String name, Throwable throwable) {return "Fallback: " + name + ", reason: " + throwable.getMessage();}
}

(2)@SentinelResource注解和实现

利用Spring AOP拦截@SentinelResource注解,最后调用SphU.entry()方法来进行处理。

//Aspect for methods with {@link SentinelResource} annotation.
@Aspect
public class SentinelResourceAspect extends AbstractSentinelAspectSupport {//SentinelResource注解@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();int resourceType = annotation.resourceType();//创建一个Entry对象,通过SphU.entry(resourceName)将当前方法纳入Sentinel的保护体系//如果当前资源的调用未触发任何Sentinel规则,则正常执行被拦截的方法,否则将执行对应的限流、熔断降级等处理逻辑Entry entry = null;try {entry = SphU.entry(resourceName, resourceType, entryType, pjp.getArgs());return pjp.proceed();} catch (BlockException ex) {//发生异常时,通过反射执行在注解中设置的降级方法return handleBlockException(pjp, annotation, ex);} catch (Throwable ex) {Class<? extends Throwable>[] exceptionsToIgnore = annotation.exceptionsToIgnore();//The ignore list will be checked first.if (exceptionsToIgnore.length > 0 && exceptionBelongsTo(ex, exceptionsToIgnore)) {throw ex;}if (exceptionBelongsTo(ex, annotation.exceptionsToTrace())) {traceException(ex);return handleFallback(pjp, annotation, ex);}//No fallback function can handle the exception, so throw it out.throw ex;} finally {if (entry != null) {entry.exit(1, pjp.getArgs());}}  }
}//Some common functions for Sentinel annotation aspect.
public abstract class AbstractSentinelAspectSupport {...protected Object handleBlockException(ProceedingJoinPoint pjp, SentinelResource annotation, BlockException ex) throws Throwable {//Execute block handler if configured.Method blockHandlerMethod = extractBlockHandlerMethod(pjp, annotation.blockHandler(), annotation.blockHandlerClass());if (blockHandlerMethod != null) {Object[] originArgs = pjp.getArgs();//Construct args.Object[] args = Arrays.copyOf(originArgs, originArgs.length + 1);args[args.length - 1] = ex;return invoke(pjp, blockHandlerMethod, args);}//If no block handler is present, then go to fallback.return handleFallback(pjp, annotation, ex);}private Object invoke(ProceedingJoinPoint pjp, Method method, Object[] args) throws Throwable {try {if (!method.isAccessible()) {makeAccessible(method);}if (isStatic(method)) {return method.invoke(null, args);}return method.invoke(pjp.getTarget(), args);} catch (InvocationTargetException e) {//throw the actual exceptionthrow e.getTargetException();}}...
}

http://www.xdnf.cn/news/942.html

相关文章:

  • 字符串拼接问题的最佳解决方案
  • Shell常用功能详细使用
  • STM32 栈地址起始位置不正确
  • 【GIT】为什么要变基下拉,变基下拉失败,提示没有暂存如何解决?
  • 华为OD机试2025A卷七日集训第6期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
  • Transformer系列(三):Transformer架构
  • Spring Boot
  • Batch Size
  • MySQL 按照日期统计记录数量
  • VOS3000内存满了怎么删除,录音格式如何转换呢
  • JVM 内存分布详解
  • 基于Spring Boot+微信小程序的智慧农蔬微团购平台-项目分享
  • 存储器综合:内存条
  • GAIA-2:用于自动驾驶的可控多视图生成世界模型
  • 基于大模型的腹股沟疝全流程预测与诊疗方案研究报告
  • 杭电oj(2031、2033、2070、2071、2075、2089、2090、2092、2096)题解
  • 学习笔记(C++篇)--- Day 3
  • 掌握Go空接口强大用途与隐藏陷阱
  • 14.QT-多元素控件|QListWidget|QTableWidget|QTreeWidget(C++)
  • SpringBoot整合JWT Token:构建安全无状态认证体系的最佳实践
  • QGraphicsItem的shape和boundingRect方法
  • HarmonyOS:Navigation实现导航之页面设置和路由操作
  • 【 Git 全局忽略文件完全指南:配置、规则与最佳实践】
  • 电商数据自动化采集方案:淘宝商品详情 API 接入与数据处理技巧
  • Spring(第一章)
  • 基于LangChain4J的AI Services实践:用声明式接口重构LLM应用开发
  • 基于陀螺仪的智能防抖平台设计与实现:从硬件到算法的全流程解析
  • 基于Springboot的自习室预约系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
  • MongoDB数据库的安装到入门使用详细讲解
  • [PTA]2025CCCC-GPLT天梯赛 现代战争