首页/新闻资讯/正文详情

Spring Cloud Alibaba Sentinel @SentinelResource

发布时间:2026/9/25 16:50:14 来源:云帆数科 栏目:资讯中心
Spring Cloud Alibaba Sentinel @SentinelResource
一、前言Sentinel提供了SentinelResource注解用于定义资源并提供可选的异常回退和Block回退。异常回退指的是SentinelResource注解标注的方法发生Java异常时的回退处理Block回退指的是当SentinelResource资源访问不符合Sentinel控制台定义的规则时的回退默认返回Blocked by Sentinel (flow limiting)。这节简单记录下该注解的用法。二、框架搭建2.1 项目搭建使用IDEA创建一个maven项目artifactId为spring-cloud-alibaba-sentinelresource然后在其下面创建两个ModuleSpring Boot项目artifactId分别为consumer和provider充当服务消费端和服务提供端spring-cloud-alibaba-sentinelresource的pom内容?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.3.2.RELEASE/versionrelativePath/!-- lookup parent from repository --/parentgroupIdcom.wno704/groupIdartifactIdspring-cloud-alibaba-sentinelresource/artifactIdversion0.0.1-SNAPSHOT/versionnameAlibaba-SentinelResource/namedescriptionDemo project for Spring Boot/descriptionpackagingpom/packagingpropertiesjava.version1.8/java.versionspring-cloud-alibaba.version2.2.3.RELEASE/spring-cloud-alibaba.version/propertiesmodulesmoduleconsumer/modulemoduleprovider/module/modulesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scopeexclusionsexclusiongroupIdorg.junit.vintage/groupIdartifactIdjunit-vintage-engine/artifactId/exclusion/exclusions/dependency/dependenciesdependencyManagementdependenciesdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project引入了spring-boot-starter-web和spring-cloud-starter-alibaba-nacos-discovery服务注册发现依赖。provider的pom的内容如下所示?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.wno704/groupIdartifactIdspring-cloud-alibaba-sentinelresource/artifactIdversion0.0.1-SNAPSHOT/versionrelativePath../pom.xml/relativePath/parentartifactIdprovider/artifactIdnameAlibaba-Provider/namedescriptionDemo project for Spring Boot/descriptionbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/projectconsumer的pom内容如下?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.wno704/groupIdartifactIdspring-cloud-alibaba-sentinelresource/artifactIdversion0.0.1-SNAPSHOT/versionrelativePath../pom.xml/relativePath/parentartifactIdconsumer/artifactIdnameAlibaba-Consumer/namedescriptionDemo project for Spring Boot/descriptiondependenciesdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project因为要演示在消费端使用SentinelResource注解所以我们引入了spring-cloud-starter-alibaba-sentinel依赖。2.2 项目配置provider的配置文件application.yml内容如下server:port:8900spring:application:name:providercloud:nacos:server-addr:127.0.0.1:8848配置了端口号服务名和nacos地址。consumer的配置文件application.yml内容如下server:port:8901spring:application:name:consumercloud:nacos:server-addr:127.0.0.1:8848sentinel:transport:dashboard:127.0.0.1:8080port:8719配置了端口号服务名nacos地址和sentinel控制台地址等。三、基本用法3.1 创建controller我们在provider下添加一个REST资源。在provider的cc.mrbird.provider目录下新建controller包然后在该包下新建GoodsControllerRestControllerRequestMapping(goods)publicclassGoodsController{GetMapping(buy/{name}/{count})publicStringbuy(PathVariableStringname,PathVariableIntegercount){returnString.format(购买%d份%s,count,name);}}接着在consumer端通过Ribbon消费这个资源。在consumer的com.wno704.alibaba的目录下新建config文件夹新建ConsumerConfig配置类注册RestTemplate。ConfigurationpublicclassConsumerConfig{BeanpublicRestTemplaterestTemplate(){returnnewRestTemplate();}BeanpublicSentinelResourceAspectsentinelResourceAspect(){returnnewSentinelResourceAspect();}}在consumer的com.wno704.alibaba下新建controller包然后在该包下新建ConsumeControllerRestControllerpublicclassConsumeController{AutowiredprivateLoadBalancerClientloadBalancerClient;AutowiredprivateRestTemplaterestTemplate;GetMapping(buy/{name}/{count})SentinelResource(valuebuy,fallbackbuyFallback,blockHandlerbuyBlock)publicStringbuy(PathVariableStringname,PathVariableIntegercount){if(count20){thrownewIllegalArgumentException(购买数量过多);}if(wno704.equalsIgnoreCase(name)){thrownewNullPointerException(已售罄);}MapString,ObjectparamsnewHashMap(2);params.put(name,name);params.put(count,count);ServiceInstanceserviceInstanceloadBalancerClient.choose(provider);StringpathString.format(http://%s:%s/goods/buy/{name}/{count},serviceInstance.getHost(),serviceInstance.getPort());returnthis.restTemplate.getForEntity(path,String.class,params).getBody();}// 异常回退publicStringbuyFallback(PathVariableStringname,PathVariableIntegercount,Throwablethrowable){returnString.format(【进入fallback方法】购买%d份%s失败%s,count,name,throwable.getMessage());}// sentinel回退publicStringbuyBlock(PathVariableStringname,PathVariableIntegercount,BlockExceptione){returnString.format(【进入blockHandler方法】购买%d份%s失败当前购买人数过多请稍后再试,count,name);}}在buy方法中我们通过Ribbon的RestTemplate访问provider的/goods/buy接口。当count参数大于20或者name参数的值为miband的时候方法将抛出异常。buy方法上使用SentinelResource注解标注标识为一个sentinel资源资源名称为buy并且配置了fallback方法和blockHandler方法。如前面所说当buy方法本身抛出异常时会进入fallback指定的回退方法中当buy方法调用不符合sentinel控制台规定的规则如流控规则降级规则等时会进入blockHander指定的block方法中。为了确保成功地进入回退方法成功反射它们必须满足以下规则函数访问范围需要是publicFallback函数函数签名与原函数一致或末尾加一个Throwable类型的参数Block异常处理函数参数最后多一个BlockException其余与原函数一致。3.2 测试启动provider、consumer、nacos和sentinel控制台http访问http://localhost:8901/buy/ipad/2我们在sentinel控制台中添加如下流控规则QPS阈值为2。然后快速访问http://localhost:8901/buy/ipad/2可以看到当方法访问不符合sentinel控制台规则时进入的是blockHandler指定的回退方法。如果访问http://localhost:8901/buy/ipad/21或者http://localhost:8901/buy/wno704/2方法自身抛出异常引发回退进入的是fallback指定的回退方法。四、其他属性在当前类中编写回退方法会使得代码变得冗余耦合度高我们可以将回退方法抽取出来到一个指定类中。在com.wno704.alibaba包下新建reveal包然后在该包下新建BuyBlockHandlerpublicclassBuyBlockHandler{// sentinel回退publicstaticStringbuyBlock(PathVariableStringname,PathVariableIntegercount,BlockExceptione){returnString.format(【进入blockHandler方法】购买%d份%s失败当前购买人数过多请稍后再试,count,name);}}可以看到我们只是将buyBlock方法挪到了BuyBlockHandler中不过这里的方法必须是static的。接着新建BuyFallBackpublicclassBuyFallBack{// 异常回退publicstaticStringbuyFallback(PathVariableStringname,PathVariableIntegercount,Throwablethrowable){returnString.format(【进入fallback方法】购买%d份%s失败%s,count,name,throwable.getMessage());}}这样BuyController的代码就可以精简为RestControllerpublicclassConsumeController{AutowiredprivateLoadBalancerClientloadBalancerClient;AutowiredprivateRestTemplaterestTemplate;GetMapping(buy/{name}/{count})SentinelResource(valuebuy,fallbackbuyFallback,fallbackClassBuyFallBack.class,blockHandlerbuyBlock,blockHandlerClassBuyBlockHandler.class)publicStringbuy(PathVariableStringname,PathVariableIntegercount){if(count20){thrownewIllegalArgumentException(购买数量过多);}if(wno704.equalsIgnoreCase(name)){thrownewNullPointerException(已售罄);}MapString,ObjectparamsnewHashMap(2);params.put(name,name);params.put(count,count);ServiceInstanceserviceInstanceloadBalancerClient.choose(provider);StringpathString.format(http://%s:%s/goods/buy/{name}/{count},serviceInstance.getHost(),serviceInstance.getPort());returnthis.restTemplate.getForEntity(path,String.class,params).getBody();}}此外我们也可以当遇到某个类型的异常时不进行回退。比如RestControllerpublicclassConsumeController{AutowiredprivateLoadBalancerClientloadBalancerClient;AutowiredprivateRestTemplaterestTemplate;GetMapping(buy/{name}/{count})SentinelResource(valuebuy,fallbackbuyFallback,fallbackClassBuyFallBack.class,blockHandlerbuyBlock,blockHandlerClassBuyBlockHandler.class,exceptionsToIgnoreNullPointerException.class)publicStringbuy3(PathVariableStringname,PathVariableIntegercount){if(count20){thrownewIllegalArgumentException(购买数量过多);}if(wno704.equalsIgnoreCase(name)){thrownewNullPointerException(已售罄);}MapString,ObjectparamsnewHashMap(2);params.put(name,name);params.put(count,count);ServiceInstanceserviceInstanceloadBalancerClient.choose(provider);StringpathString.format(http://%s:%s/goods/buy/{name}/{count},serviceInstance.getHost(),serviceInstance.getPort());returnthis.restTemplate.getForEntity(path,String.class,params).getBody();}}exceptionsToIgnore指定当遇到空指针异常时不回退。重启consumerhttp访问http://localhost:8901/buy/wno704/2可以看到此次并没有进行回退而是直接返回error page。

相关推荐

GEO服务公司怎么选?按需求成熟度建立评估方法
GEO服务公司怎么选?按需求成熟度建立评估方法

GEO服务公司怎么选?按需求成熟度建立评估方法同样是做 GEO,不同企业需要的协作方式差别很大。有的团队已经有内容人员和业务资料,缺的是一套诊断与监控工具。有的企业刚启动,资料分散,也没人专门推进。先判断自身准备程… · 2026/9/25 16:50:02

断点续学是核心卖点?Echo Loop如何让你5分钟碎片时间也能接上进度
断点续学是核心卖点?Echo Loop如何让你5分钟碎片时间也能接上进度

断点续学是核心卖点?Echo Loop如何让你5分钟碎片时间也能接上进度 【免费下载链接】Echo-Loop Echo Loop 是一款科学、高效的 AI 英语听说训练 App,通过精听、跟读、盲听、复述和间隔复习,自动驱动学习者把每一段音频真正练懂、练熟、练到会说… · 2026/9/25 16:50:02

GEO系统怎么选?从系统能力到项目验收的决策框架
GEO系统怎么选?从系统能力到项目验收的决策框架

GEO系统怎么选?从系统能力到项目验收的决策框架GEO 系统应帮助企业了解品牌在 AI 搜索里被怎样提及,并把后续内容建设和观察接在一起。选系统时,可以沿着项目实际推进的顺序判断。先看能否把问题和品牌信息管理起来右以云 GEO 支持用品牌、产… · 2026/9/25 16:50:02

Datawhale组队学习-深度学习笔记(一)
Datawhale组队学习-深度学习笔记(一)

文章目录第 1 章 神经网络简介第 2 章 PyTorch 入门总结第 1 章 神经网络简介 神经网络的学习,并不是灌输规则,也不是理解概念,而是通过反复调整参数,让函数逐步逼近我们期望的映射关系。 具体来说,神经网络的学习过程… · 2026/9/25 18:03:42

12G显存跑27B模型:量化、KV Cache优化与投机解码实战
12G显存跑27B模型:量化、KV Cache优化与投机解码实战

1. 为什么要在12G显存上折腾27B模型先把结论摆在前面:12G显存跑27B模型,128K上下文,decode速度50 tokens/s,这件事在一年前基本属于天方夜谭,但现在通过量化压缩、KV Cache优化、投机解码这几条路组合起来,… · 2026/9/25 18:03:30

50万AI Agent上线一周关停:企业级Agent落地失败复盘与实操指南
50万AI Agent上线一周关停:企业级Agent落地失败复盘与实操指南

1. 50万AI Agent上线一周就关停,问题到底出在哪上周跟一个做企业数字化的老朋友吃饭,他跟我讲了个事:他们隔壁公司老板花了50万找外包团队搞了个AI Agent,对接了内部知识库和工单系统,上线发布会搞得挺隆重&#xff0c… · 2026/9/25 18:03:30

ax:面向LLM智能体的Kubernetes原生执行基底协议
ax:面向LLM智能体的Kubernetes原生执行基底协议

1. 项目概述:从“ax”这个代号说起,它到底是什么?如果你最近在云原生、AI工程化或分布式系统开发的圈子里刷到“ax”,大概率不是指某个新出的手机型号,也不是某款健身器械的缩写——而是正在悄然成型的一套面向智能体&… · 2026/9/25 18:03:24

LangGraph 智能体开发框架深度解析:从核心概念到工程实战
LangGraph 智能体开发框架深度解析:从核心概念到工程实战

LangGraph 智能体开发框架深度解析:从核心概念到工程实战 大模型应用从"单次问答"走向"多步任务",是这一轮 Agent 热潮的核心驱动力。当任务需要检索、推理、调用工具、再推理、再行动这样的循环时,简单的"请求-响应… · 2026/9/25 18:03:24

LangGraph 工程化实践:构建可观测、可运维的智能体流水线
LangGraph 工程化实践:构建可观测、可运维的智能体流水线

LangGraph 工程化实践:构建可观测、可运维的智能体流水线 能把 Agent Demo 跑起来的人越来越多,但能把智能体系统送进生产环境、稳定运行、持续迭代的团队依然稀缺。Demo 与生产的差距,不在模型能力,而在工程化程度:状… · 2026/9/25 18:03:18

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码