手把手教你搭建SpringCloudAlibaba之Sentinel注解SentinelResource

news2024/9/25 13:14:29

 SpringCloud Alibaba全集文章目录:

零、手把手教你搭建SpringCloudAlibaba项目

一、手把手教你搭建SpringCloud Alibaba之生产者与消费者

二、手把手教你搭建SpringCloudAlibaba之Nacos服务注册中心

三、手把手教你搭建SpringCloudAlibaba之Nacos服务配置中心

四、手把手教你搭建SpringCloudAlibaba之Nacos服务集群配置

五、手把手教你搭建SpringCloudAlibaba之Nacos服务持久化配置

六、手把手教你搭建SpringCloudAlibaba之Sentinel实现流量实时监控

七、手把手教你搭建SpringCloudAlibaba之Sentinel实现流量控制

八、手把手教你搭建SpringCloudAlibaba之Sentinel服务降级

九、手把手教你搭建SpringCloudAlibaba之Sentinel热点key限流

十、手把手教你搭建SpringCloudAlibaba之Sentinel系统保护规则

十一、手把手教你搭建SpringCloudAlibaba之Sentinel服务熔断

十二、手把手教你搭建SpringCloudAlibaba之Sentinel规则持久化

十三、手把手教你搭建SpringCloudAlibaba之Seata分布式事务

点击跳转学习 -------------->手把手教你搭建SpringCloud项目

在前边的几篇文章都使用到了SentinelResource的注解。这篇来仔细学习一下。

@SentinelResource的参数如下:

value:资源名称
entryType:entry 类型,可选项(默认为 EntryType.OUT),可选EntryType.OUT和EntryType.IN
blockHandler/ blockHandlerClass定位对应处理 BlockException 的函数名称blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException
fallback / fallbackClass:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。
defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项
exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
 

fallback参数的使用

我们在代码中加入一个算术异常,然后再进行热点限流,看看会发现什么?

//测试热点限流的方法    传递参数p1与参数p2
@GetMapping("/testHotKey")
//注意不要加/
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey" ) //指定兜底的方法 就是用blockHandler指的方法 所以就是deal_testHotKey
public String testHotKey(@RequestParam(value="p1",required =false)String p1,
                            @RequestParam(value = "p2",required = false) String p2){
   int a=10/0;
   return "------成功访问了testHotKey方法________(*^▽^*)";
}

    

public String deal_testHotKey(String p1, String p2, BlockException e){
    return "------进行了限流   deal_testHotKey,o(╥﹏╥)o";   

}

热点限流规则还跟之前一样,如下图:

访问http://localhost:8401/testHotKey?p1=2&p2=1 可以看到出现算术的异常,直接显示在我们的浏览器上。

我们在1秒内点击超过一次还是会被正常限流,不会出现以上的算术异常。

 

 这里可以得到结论:我们配置SentinelResource注解的兜底方法 deal_testHotKey。只会对Sentinel控制台配置的规则进行限流,并返回我们方法的提示,并不会对运行的异常进行提示。那那出现的情况怎么办?

这里就可以使用fallback参数,用于在抛出异常的时候提供 fallback 处理逻辑,代码如下。

@GetMapping("/testHotKey")
    //注意不要加/
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey",fallback = "fallback") 
public String testHotKey(@RequestParam(value="p1",required =false)String p1,
                                   @RequestParam(value = "p2",required = false) String p2){
      
     int a=10/0;
    
     return "------成功访问了testHotKey方法________(*^▽^*)";
}


public String deal_testHotKey(String p1, String p2, BlockException e){
    return "------进行了限流   deal_testHotKey,o(╥﹏╥)o";
}


public String fallback(@RequestParam(value="p1",required =false)String p1,
                                        @RequestParam(value = "p2",required = false) String p2,Throwable e){
     return "------进行了    fallback,出现了,"+e.getMessage()+"的错误,o(╥﹏╥)o";
}

踩坑提示:fallback方法的参数和返回类型都要与testHotKey方法保持一致,不然fallback参数不生效。

我们再次访问http://localhost:8401/testHotKey?p1=2&p2=1 ,可以看到出现了我们fallback中设置的提示,如下图:

我们1秒内请求多次,会走我们deal_testHotKey方法的限流的提示,由此可以得出:当同时配置了blockHandler和fallback,则被限流降级而抛出blockHandler的处理逻辑。如下图。 

exceptionsToIgnore参数的使用

exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

我们在代码中加上该参数看下,指定当是算术异常。

@GetMapping("/testHotKey")
    //注意不要加/
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey",fallback = "fallback",exceptionsToIgnore = {ArithmeticException.class}) 
public String testHotKey(@RequestParam(value="p1",required =false)String p1,
                                   @RequestParam(value = "p2",required = false) String p2){
      
     int a=10/0;
    
     return "------成功访问了testHotKey方法________(*^▽^*)";
}


public String deal_testHotKey(String p1, String p2, BlockException e){
    return "------进行了限流   deal_testHotKey,o(╥﹏╥)o";
}


public String fallback(@RequestParam(value="p1",required =false)String p1,
                                        @RequestParam(value = "p2",required = false) String p2,Throwable e){
     return "------进行了    fallback,出现了,"+e.getMessage()+"的错误,o(╥﹏╥)o";
}

 我们再次访问http://localhost:8401/testHotKey?p1=2&p2=1 ,可以看到出现了了error page的页面,如下图:

blockHandlerClass参数的使用

现在我们使用降级的处理方式村子的问题有哪些?

1、系统默认的,没有体现我们自己的业务要求
2、 依照现有条件,我们自定义的处理方法又和业务代码稠合在一块,不直观。
3、每个业务方法都添加一个兜底的,那代码膨胀加剧。
4、全局统一的处理方法没有体现。

那如何解决,这里就需要使用blockHandlerClass函数进行解决

新建全局兜底的类GlobalHandlerException ,里边有两个处理的方法。代码如下:

public class GlobalHandlerException {

    public static String globalHandlerException(@RequestParam(value="p1",required =false)String p1,
                             @RequestParam(value = "p2",required = false) String p2, BlockException e){

        return "------成功访问了globalHandlerException方法________(*^▽^*)";
    }

    public static String globalHandlerException1(@RequestParam(value="p1",required =false)String p1,
                                         @RequestParam(value = "p2",required = false) String p2, BlockException e){

        return "------成功访问了globalHandlerException1方法________(*^▽^*)";
    }
}

修改 @SentinelResource(value = "testHotKey",blockHandlerClass = {GlobalHandlerException.class},blockHandler = "globalHandlerException")中的参数,使用blockHandlerClass,指定上边的全局兜底的类,blockHandler指定该类中具体的那个方法。

 @GetMapping("/testHotKey")
    //注意不要加/
    @SentinelResource(value = "testHotKey",blockHandlerClass = {GlobalHandlerException.class},blockHandler = "globalHandlerException")

public String testHotKey(@RequestParam(value="p1",required =false)String p1,
                                   @RequestParam(value = "p2",required = false) String p2){
     return "------成功访问了testHotKey方法________(*^▽^*)";

}

我们访问请求,可以看到返回了全局兜底中的globalHandlerException方法返回的提示信息。

修改blockHandler参数指定该全局兜底中类中具体的globalHandlerException1的方法,可以看到

返回了全局兜底类中的globalHandlerException1方法返回的提示信息。

 fallbackClass参数的使用

fallbackClass的使用和blockHandlerClass是一样的!!!

新建全局处理异常类GlobalFallBack,里边有两个处理的方法。代码如下:

public class GlobalFallBack {
    public static String globalFallBack(@RequestParam(value="p1",required =false)String p1,
                                                @RequestParam(value = "p2",required = false) String p2, Throwable e){

        return "------进入了全局限流globalFallBack方法________(*^▽^*)";
    }

    public static String globalFallBack1(@RequestParam(value="p1",required =false)String p1,
                                                 @RequestParam(value = "p2",required = false) String p2, Throwable e){

        return "------进入了全局限流globalFallBack1方法________(*^▽^*)";
    }

修改@SentinelResource(value = "testHotKey",blockHandlerClass = {GlobalHandlerException.class},blockHandler = "globalHandlerException",
            fallbackClass = {GlobalFallBack.class}, fallback = "globalFallBack")中的参数,使用fallbackClass ,指定上边的全局处理异常的类,fallback 指定该类中具体的那个方法。

@GetMapping("/testHotKey")
    //注意不要加/
    @SentinelResource(value = "testHotKey",blockHandlerClass = {GlobalHandlerException.class},blockHandler = "globalHandlerException",
            fallbackClass = {GlobalFallBack.class}, fallback = "globalFallBack")
public String testHotKey(@RequestParam(value="p1",required =false)String p1,
                                   @RequestParam(value = "p2",required = false) String p2){

     int a=10/0;

     return "------成功访问了testHotKey方法________(*^▽^*)";
}

我们访问请求,可以看到返回了全局处理异常中类中的globalFallBack方法返回的提示信息。

修改fallback 参数指定该全局异常类中具体的globalFallBack1的方法,可以看到

返回了全局异常类中的globalFallBack1方法返回的提示信息。

 至此sentinel的注解SentinelResource就学完了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【智慧交通项目实战】《 OCR车牌检测与识别》(四):基于Pyqt的项目可视化

👨‍💻作者简介: CSDN、阿里云人工智能领域博客专家,新星计划计算机视觉导师,百度飞桨PPDE,专注大数据与AI知识分享。✨公众号:GoAI的学习小屋 ,免费分享书籍、简历、导图等&#xf…

SpringBoot 限流方案

一、背景 限流对于一个微服务架构系统来说具有非常重要的意义,否则其中的某个微服务将成为整个系统隐藏的雪崩因素,为什么这么说? 举例来讲,某个SAAS平台有100多个微服务应用,但是作为底层的某个或某几个应用来说&…

【前端】运行一个vue项目

如何运行一个vue项目 首先cd到要运行的vue文件夹下,或者是在webstorm下面的终端直接打开,就会自动开启在这个文件夹下的终端安装项目中所有需要的依赖包 sudo npm install运行项目 sudo npm run serve到这里项目就运行起来了 4. 打开项目 点击网址打…

html实现视频网站,仿爱奇艺,搜狐,迅雷看看(附源码)

文章目录 1.功能模板1.1 仿爱奇艺1.2 仿搜狐视频1.3 仿迅雷看看1.4 视频播放1.5 影视公司官网 2.效果和源码2.1 源代码2.2 模板目录 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/131516313 html实现视频网站…

c++ 内存管理二:重载(接管内存管理工具)

文章目录 前言1 重载全局的 ::operator new 运算符2 重载类的 operator new 运算符3 重载类的带有额外参数的 operator new 运算符 前言 重载 operator new 运算符来自定义内存分配的行为。重载 operator new 运算符允许我们使用自定义的内存分配逻辑,例如使用池分…

压测工具哪个好?LoadRunner、Jmeter、Locust、Wrk 全方位对比....

当你想做性能测试的时候,你会选择什么样的测试工具呢?是会选择wrk?jmeter?locust?还是loadrunner呢?今天,笔者将根据自己使用经验,针对jmeter、locust、wrk和loadrunner常用的性能测…

【数据结构与算法】内排序算法比较(C\C++)

实践要求 1. 问题描述 各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间,试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。 2. 基本要求 对以下10种常用的内部排序算法进行比较…

MySQL更改表结构语句

一、MySQL表结构变更语句 1. 新增字段 语法&#xff1a; &#xff08;1&#xff09;在末尾添加字段 ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件]; &#xff08;2&#xff09;在开头添加字段 ALTER TABLE <表名> ADD <新字段名> <…

[C++]lambda

目录 前言&#xff1a; 1 认识lambda 2 lambda语法 3 lambda的类型 4 lambda的底层 前言&#xff1a; 本篇讲解了C11当中新添加的lambda语法&#xff0c;以及lambda的底层 1 认识lambda lambda的出现方便了很多我们写程序的地方&#xff0c;例如下面这个样例…

C++图形开发(2):最基本的图形界面

文章目录 1.构成2.内容介绍2.1 initgraph()2.2 _getch()2.3 closegraph() 3.总结 今天来简单介绍下最基本的图形界面~ 1.构成 输入以下内容并编译&#xff1a; 这就是一个最基本的图形界面了 #include<graphics.h> #include<conio.h>int main() {initgraph(600, …

rollup入门 - 学习笔记(1)

rollup打包工具 打包项目用webpack , 打包js库用rollup 下载rollup npm i rollup --save-dve 初始化项目 npm init -y 创建src/main.js文件 import welcomerollup from ../modules/mymodule welcomerollup(hello world) 创建module/mymodule.js文件 const welcomerollup (ms…

Python PDF生成和二进制流转换(FPDF)

文章目录 安装FPDF生成PDF文档生成PDF的二进制流 安装FPDF pip install fpdf22.7.4生成PDF文档 通过FPDF生成PDF文档的具体步骤&#xff1a; 初始化&#xff1a;fpdf库的操作主要由FPDF对象来处理&#xff0c;在生成PDF文档时&#xff0c;需要初始化FPDF对象。添加页面&…

引爆媒体关注的秘密武器:媒介易教你打造热门新闻故事!

在进行媒体邀约时&#xff0c;提供有吸引力的新闻价值和故事性是吸引媒体关注和获得采访机会的关键。媒体记者时常接收大量的邀约&#xff0c;因此需要与众多企业竞争&#xff0c;才能让自己的邀约脱颖而出。本文将探讨如何在媒体邀约中提供有吸引力的新闻价值和故事性&#xf…

Domain Admin域名和SSL证书过期监控到期提醒

基于Python3 Vue3.js 技术栈实现的域名和SSL证书监测平台 用于解决&#xff0c;不同业务域名SSL证书&#xff0c;申请自不同的平台&#xff0c;到期后不能及时收到通知&#xff0c;导致线上访问异常&#xff0c;被老板责骂的问题 核心功能&#xff1a;域名 和SSL证书 的过期…

【敬伟ps教程】亮度与色阶看懂直方图

文章目录 亮度/对比度色阶调整输入色阶调整输出色阶调节原色通道调整图层 亮度/对比度 控制明暗的视觉因素&#xff0c;三要素之一&#xff0c;明度 在拾色器中修改 HSB 中的 B&#xff0c;改为较低的值即可调整明度。明度较低时&#xff0c;RGB色值偏低&#xff0c;CMYK色值…

怎么看懂今日白银现货价格?这个技术信号了解一下

金叉&#xff0c;是某些技术指标的一种技术动作&#xff0c;通常预示着&#xff0c;今日白银现货价格开始上涨&#xff0c;并且出现了买入机会。但是&#xff0c;是不是金叉就一定有买入机会呢&#xff1f;在今日白银现货价格出现金叉时要如何处理呢&#xff1f;这都是我们要处…

UV统计量

UV统计 UV&#xff1a;Unique Visitor&#xff0c;即独立访客量&#xff0c;是指通过互联网访问、浏览该网页的自然人。一天内同一个用户多次访问该网站&#xff0c;只会记录一次。 PV&#xff1a;Page View&#xff0c;即页面访问量或点击量&#xff0c;用户每访问网站的一个…

d2l_第九章_RNN循环神经网络

x.1 Sequence model 经过前面的学习&#xff0c;我们已知数据大于算法。而以数据为驱动的前提下&#xff0c;我们提出了各种模型。为了适配表格数据&#xff0c;提出了MLP&#xff1b;为了适配图像数据提出了CNN&#xff1b;而对了适配序列数据&#xff0c;我们提出了RNN。 目…

C++笔记之call_once和once_flag

C笔记之call_once和once_flag code review! 文章目录 C笔记之call_once和once_flag1.call_once和once_flag2.std::call_once和单例模式 1.call_once和once_flag 2.std::call_once和单例模式

音频格式转换怎么操作?分享这几个MP3转换器给大家!

有一个名叫小灵的音乐爱好者&#xff0c;对音乐充满热情&#xff0c;每天都沉浸在动听的旋律中&#xff0c;借助耳机享受音乐的魅力。然而&#xff0c;最近她遇到了一个问题&#xff1a;她手头有一些喜欢的音乐文件&#xff0c;但却无法在自己的音乐播放器上播放&#xff0c;这…