SpringCloud Alibaba学习(九):Sentinel的@SentinelResource注解详解
前言:
如果不知道如何配置sentinel或者不知道如何打开文章中的一些网页,可以参考我前面的文章: SpringCloud Alibaba学习(五):Sentinel的介绍与搭建
有关流控规则的讲解与实战:SpringCloud Alibaba学习(六):Sentinel的流控规则
有关降级规则的讲解与实战:SpringCloud Alibaba学习(七):Sentinel的降级规则
有关热点规则的讲解与实战:SpringCloud Alibaba学习(八):Sentinel的热点规则
一、按资源名称限流+后续处理
1、修改8401
(1)在pom中增加自己之前写过的的工具api
<dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --> <groupId>com.shang.cloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
api的具体代码详见我之前的文章:
(2) 新建一个业务类RateLimitController
为了和之前的控制类分开,不让代码混淆到一起。
@RestController public class RateLimitController { @GetMapping("/byResource") @SentinelResource(value = "byResource",blockHandler = "handleException") public CommonResult byResource() { return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001")); } public CommonResult handleException(BlockException exception) { return new CommonResult(444,exception.getClass().getCanonicalName()+" 服务不可用"); } }
代码也很简单,一个简单的方法和兜底方法。
2、配置流控规则
3、测试
先访问一次byResource,正常访问。
然后疯狂刷新,出现限流。
这是正常的现象,我们在前文中已经见过,这里有传送门,忘记的可以复习一下:
SpringCloud Alibaba学习(六):Sentinel的流控规则
二、按照Url地址限流+后续处理
通过访问的URL来限流,会返回Sentinel自带默认的限流处理信息
1、修改8401
在controller类中再增加一个方法
@GetMapping("/rateLimit/byUrl") @SentinelResource(value = "byUrl") public CommonResult byUrl() { return new CommonResult(200,"按url限流测试OK",new Payment(2020L,"serial002")); }
由于没有指定blockedHandler,就会使用系统默认的降级提示。
2、配置方法
由于我们是通过URL来限流,所以资源名前面要记得加上/
3、测试
疯狂点击后,出现了降级。
三、上面的兜底方法面临的问题
1 、 显示的提示为系统默认的,没有体现我们自己的业务要求;
2 、 如果自定义提示,那么自定义的处理方法又和业务代码耦合在一块,不直观;
3 、 每个业务方法都添加一个兜底方法,那么会导致代码膨胀加剧;
4 、 没有体现全局统一的处理方法。
这些问题在我们学习Hystrix时就已经提出并解决过,可以参考我之前的文章:
SpringCloud学习(十三):Hystrix的服务降级实现
下面我们来看一下sentinel如何解决这些问题。
四、客户自定义限流处理逻辑
1、创建CustomerBlockHandler类用于自定义限流处理逻辑
这是一个全局的限流处理方法,我将它写在myhandler包下。
public class CustomerBlockHandler { //写多个方法,我们希望能够自主选择其中一个方法进行处理 public static CommonResult handlerException(BlockException exception){ return new CommonResult(4444, "按用户自定义处理global CustomerBlockHandler------1"); } public static CommonResult handlerException2(BlockException exception){ return new CommonResult(4444, "按用户自定义处理global CustomerBlockHandler------2"); } }
2、自定义限流处理逻辑
写在RateLimitController类中
@GetMapping("/rateLimit/customerBlockHandler") @SentinelResource(value = "customerBlockHandler", blockHandlerClass = CustomerBlockHandler.class, //兜底方法的类 blockHandler = "handlerException2" //具体调用该类中的哪个兜底方法 ) public CommonResult customerBlockHandler(){ return new CommonResult(200,"按用户自定义",new Payment(2020L,"serial003")); }
3、配置流控规则
4、测试
先访问一次 http://localhost:8401/rateLimit/customerBlockHandler
能够正常显示。
然后疯狂刷新
可以看到,显示的是我们自定义的限流处理规则,并且是我们指定的方法。
5、说明
五、更多注解属性
另外,sentinel还提供了三个核心api,除了用注解方式配置之外,还可以用代码来配置,但是并不推荐。
相关文章
- 发现 Linux SpaceFM 文件管理器的威力
- 夯实数据智能底座 共筑数字经济发展“新基石”
- 五分钟教你使用console.log发布公司的招聘信息
- 微软发布 Windows 11 Beta 预览版 Build 22621.1250 和 22623.1250 (KB5023008)
- Windows 11 学院:在 Windows 11 Build 25290 上如何为文件管理器启用标签页拖拽支持
- 微软Windows 11 Dev 预览版 Build 25290 发布:带来新的开始菜单提醒角标
- 微软正用全屏通知提醒 Windows 10 用户免费升级 Windows 11,要点击 5 次才能退出
- Linux Mint 21.2 将于 6 月发布:改进登录屏幕,优化 Pix 图像管理程序等等
- 字节面试也会问SPI机制?
- 微软正式停售 Windows 10 产品密钥 / 许可证:继续提供 ISO 镜像下载,推荐用户升级 Windows 11
- 用复古电脑程序 Toy CPU 学习低级编程
- Windows 11 新功能泄露:现代音量合成器、实验工具和新的文件管理器
- 微软 Windows 11 文件资源管理器全新设计曝光:UI 迎来大修,整合 Microsoft 365
- 对比Pandas,学习PySpark大数据处理
- 微软宣布为Windows 11 21H2设备开启自动更新到22H2版本
- 互联网都在说降本增效,小红书技术团队是怎么做的?
- 微软将继续提供 Windows 10 ISO 镜像下载,即将停售产品密钥 / 许可证
- 微软宣布为Windows 11 21H2 设备开启自动更新到 22H2 版本
- 面试突击:Properties和Yml有什么区别?
- 微软 Windows 11 Beta 预览版 22621.1245 和 22623.1245 (KB5022358) 发布