SpringCloud Alibaba @SentinelResource 注解

一、前言

        接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第十五篇,即介绍 SpringCloud Alibaba 的 @SentinelResource 注解。

二、简介

        这个注解用于标记需要被流量控制、熔断降级以及系统保护等功能覆盖的方法或类。这个注解允许开发者自定义资源名称,并且可以配置异常处理逻辑和 fallback 函数。

        接下来我们分别使用按照资源名称限流和按照 url 地址限流分别来演示下。首先在 cloudalibaba-sentinel-service8401 模块新建一个 RateLimitController 类,用于下面的测试。

三、按资源名称限流

        在 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()+"\t 服务不可用");}
}

        在 sentinel 的管理界面根据资源名称配置限流规则,如下图:

        输入 http://localhost:8401/byResource,进行测试,当 1s 访问一次时,效果如下:

        当频繁点击时效果如下,达到了我们的效果。

四、按照 url 地址限流

        在 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()+"\t 服务不可用");}@GetMapping("/rateLimit/byUrl")@SentinelResource(value = "byUrl")public CommonResult byUrl(){return new CommonResult(200,"按url限流测试OK",new Payment(2020L,"serial002"));}}

         在 sentinel 的管理界面根据 url 地址配置限流规则,如下图:

        输入 http://localhost:8401/rateLimit/byUrl,进行测试,当 1s 访问一次时,效果如下:

        当频繁点击时效果如下,出现的是默认的限流返回消息,达到了我们的效果。

五、临时节点问题

        此时,关闭我们的 cloudalibaba-sentinel-service8401 模块,并等待一会,然后刷新我们

sentinel 管理界面,可以看到,节点全部消失了,证明我们所配置的这些限流规则均为临时节点。

六、兜底方案面临的问题

        虽然限流发生时,我们可以指定兜底的方案,也可以不指定使用系统默认的兜底方案,但是也不是很好,总结起来有下面四点不好的地方:

        1、若使用系统默认的,则没有体现我们自己的业务要求。

        2、依照现有条件,我们自定义的处理方法又和业务代码耦合在一个类中,不直观。

        3、每个业务方法都添加一个兜底的,那代码膨胀加剧。

        4、全局统一的处理方法没有体现。

七、自定义限流处理

        为了解决上面提出的这四点问题,我们可以采用自定义的限流处理逻辑,首先创建一个自定义处理的 hanler 类,代码如下:

package com.springcloud.myhandler;import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.springcloud.entities.CommonResult;public class CustomerBlockHandler {public static CommonResult handlerException(BlockException exception) {return new CommonResult(4444, "按客戶自定义,global handlerException----1");}public static CommonResult handlerException2(BlockException exception) {return new CommonResult(4444, "按客戶自定义,global handlerException----2");}
}

        在 RateLimitController 中创建一个测试方法,其中 blockHandlerClass 属性指定了兜底方法的类,blockHandler 属性指定了兜底的方法,代码如下:

    @GetMapping("/rateLimit/customerBlockHandler")@SentinelResource(value = "customerBlockHandler",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "handlerException2")public CommonResult customerBlockHandler(){return new CommonResult(200,"按客戶自定义",new Payment(2020L,"serial003"));}

        打开 sentinel 的管理界面,配置对应的限流规则,如下:

         输入 http://localhost:8401/rateLimit/customerBlockHandler,进行测试,当 1s 访问一次时,效果如下:

        当频繁点击时效果如下,出现的是我们自定义的限流返回消息,达到了我们的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/301326.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一切皆是为了交流-DDD通用语言

通用语言是什么? 通用语言是一种在特定领域内的沟通方式,可以由文字、语言、手势、图像等一切与达到沟通目的的元素组成。 比如,在中国内,方言是闽南的小王与方言是粤语的小张进行交流,那么,普通话是他们…

item_get_app在竞品分析中的应用与效果评估

item_get_app作为淘宝开放平台的重要API接口,为商家在竞品分析中提供了强大的数据支持。在竞争激烈的电商市场中,竞品分析是商家不可或缺的一环,而item_get_app的应用则使得这一分析过程更加高效、精准。通过调用item_get_app接口&#xff0c…

数据分析案例-牛油果价格和销量数据可视化分析与预测(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

ctfshow web入门 php特性 web108--web115

web108 ereg函数相当于而preg_match()函数 ereg函数的漏洞:00截断。%00截断及遇到%00则默认为字符串的结束 strrev函数就是把字符串倒过来 就是说intval处理倒过来的传参c0x36d(877)?ca%00778 web109 异常处理类 通过异常处理类Excepti…

心理健康教育宣传活动

为进一步加强未成年人心理健康教育,宣传心理健康知识,促进未成年人心理健康发展,在重庆儿童救助基金会的支持下,喜洋洋社工在桥头镇开展心理健康教育宣传活动。 活动中社工通过表格《我是一个怎样的人》引导青少年观察自己&#…

【LAMMPS学习】八、基本知识的讨论(1.3)从一个输入脚本运行多个模拟

8. 基本知识的讨论 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和…

SAP ERP 公有云有哪些模块?

随着全球化竞争的加剧和企业管理需求的日益复杂化,越来越多的企业开始采用云端企业资源计划(ERP)系统来优化业务流程。SAP ERP 公有云(SAP S/4HANA Cloud, public edition)作为一款领先的云端ERP解决方案,为…

jest单元测试——项目实战

jest单元测试——项目实战 一、纯函数测试二、组件测试三、接口测试四、React Hook测试💥 其他的疑难杂症另:好用的方法 🌟 温故而知新:单元测试工具——JEST 包括:什么是单元测试、jest的基本配置、快照测试、mock函数…

算法刷题Day24 | 回溯算法基础理论、 77. 组合

目录 0 引言1 回溯算法基础理论1.1 回溯算法模板1.2 2 组合2.1 我的解题2.2 剪枝操作 🙋‍♂️ 作者:海码007📜 专栏:算法专栏💥 标题:算法刷题Day23 | 回溯算法基础理论、 77. 组合❣️ 寄语:书…

2024年第七届信息管理与管理科学国际会议(IMMS 2024)即将召开!

2024年第七届信息管理与管理科学国际会议(IMMS 2024)将于2024年8月23-25日在中国北京举行。数字化时代,我们面临着诸多挑战,如信息安全问题、数据治理难题、管理创新需求等。IMMS 2024的召开,旨在让全球信息管理与管理…

Centos7 安装GitLab

安装环境: 虚拟机:Centos7 最小安装 4核8G 下载GitLab 本次实验下载的是 gitlab-ce-14.1.0-ce.0.el7.x86_64.rpm 官网截图 清华源截图 安装包下载地址(官网;下载CE版本,EE是收费版本):https://packages.gitlab.com/gitlab/gitlab-ce国内镜像源下载地址(清华源):htt…

(源码+部署+讲解)基于Spring Boot和Vue的大学志愿者服务平台的设计与实现

摘要: 随着互联网技术的快速发展,大学校园内的志愿者活动日益增多,传统的志愿者管理方式已难以满足现代化、信息化的需求。因此,设计并实现一个基于Spring Boot和Vue的大学志愿者服务平台显得尤为重要。本文详细阐述了该平台的设计…

前端三剑客 —— CSS (第五节)

目录 内容回顾: 特殊样式 特殊样式 CSS变量 常见函数 倒影效果 页面布局 Table 布局(了解即可) DIVCSS布局 弹性布局 1)不使用弹性布局,而是使用DIVCSS 2)使用弹性布局实现导航菜单 内容回顾…

Windows深度学习环境----Cuda version 10.2 pytorch3d version 0.3.0

Requirements Python version 3.8.5Pytorch version: pytorch1.6.0 torchvision0.8.2 torchaudio0.7.0 cudatoolkit10.2.89pytorch3d version 0.3.0Cuda version 10.2 感觉readme文件里的不适配,跟pytorch官网不同 以前的 PyTorch 版本 |PyTorch的 # CUDA 10.2 c…

睿考网:小白怎么准备二级建造师考试?

小白想要准备二级建造师考试,可以遵循以下策略: 1.定位明确,设定目标,确保三门科目达到及格标准,避免学科偏重。 2.基础知识扎实,考试内容主要来自教材,因此,理解和记忆所学的基础…

Redis: 持久化

文章目录 一、RDB持久化1、概念2、生成、载入RDB文件3、执行时机(1) 执行save命令(2)执行bgsave命令(3)Redis停机时(4)触发RDB条件 4、bgsave原理5、小结 二、AOF持久化1、概念2、AO…

Linux初学(十四)LampLnmp

一、简介 LAMP和LNMP是两种常见的web服务器组合。具体如下: LAMP:LAMP代表的是Linux(操作系统) Apache(HTTP服务器) MySQL(数据库) PHP(编程语言)。这个组合被…

微信小程序 电影院售票选座票务系统5w7l6

uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言:pythonjavanode.jsphp均支持 运行软件…

OpenCV单通道图像按像素成倍比例放大(无高斯平滑处理)

OpenCV中的resize函数可以对图像做任意比例的放大(/缩小)处理,该处理过程会对图像做高斯模糊化以保证图像在进行放大(/缩小)后尽可能保留源图像所展现的具体内容(消除固定频率插值/采样带来的香农采样信息损失)&#x…