利用断路器状态统计sentinel熔断次数

最近项目需要sentinel熔断时记录熔断的次数,在经过一阵搜索后决定利用断路器的状态变化来实现此功能
然而,遇到了这样的一个情况,断路器的状态在第一次熔断时正常从close–>open,但在后续(熔断时间内blocked或者熔断结束后重新开启断路器)断路器的状态变化均为half open–>open,导致无法区分究竟是熔断时间内还是再次被熔断了,因此使用了一个flag来做标记实现了功能。

本方法利用了断路器的状态统计熔断次数,代码修改自chatgpt

代码如下:

/*** @ClassName: SentinelBlockHandler* @Description: sentinel统一异常处理* @author: liuzijian @ haiyisoft* @Date: 2023/11/7 11:54* @version: 1.0**/
@Component
@Slf4j
public class SentinelBlockHandler implements BlockExceptionHandler {private boolean flag = false;@Resourceprivate ServerDegradeLogsRepository serverDegradeLogsRepository;@Value("${server.port}")private Integer serverPort;private SentinelBlockHandler() {// 私有构造方法,防止外部实例化}public static SentinelBlockHandler getInstance() {return SingletonHolder.INSTANCE;}private static class SingletonHolder {private static final SentinelBlockHandler INSTANCE = new SentinelBlockHandler();}static {registerStateChangeObserver();}private static void registerStateChangeObserver() {EventObserverRegistry.getInstance().addStateChangeObserver("logging",(prevState, newState, rule, snapshotValue) -> {List<CircuitBreakerStateChangeObserver> observers = EventObserverRegistry.getInstance().getStateChangeObservers();if (newState == CircuitBreaker.State.OPEN) {getInstance().flag = true;System.err.println(String.format("===> resource: %s, %s -> OPEN at %d, snapshotValue=%.2f",rule.getResource(), prevState.name(), TimeUtil.currentTimeMillis(), snapshotValue));} else {System.err.println(String.format("===> resource: %s, %s -> %s at %d",rule.getResource(), prevState.name(), newState.name(), TimeUtil.currentTimeMillis()));}});}@Overridepublic void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {/*** 请求被限流了*/if (e instanceof FlowException){httpServletResponse.setStatus(429);ResponseService.httpResponse(httpServletResponse, ResponseStatus.SENTINEL_FLOW_ERROR);log.error("请求被限流了:{}",e.getMessage());}/*** 请求被熔断降级了*/else if (e instanceof DegradeException) {System.out.println("进入熔断异常");if (getInstance().flag){InetAddress addr = InetAddress.getLocalHost();String degradeText = "请求被熔断降级了:{" + e.getMessage() + "}";ServerDegradeLogs serverDegradeLogs = new ServerDegradeLogs(addr.getHostAddress(), this.serverPort, degradeText);serverDegradeLogsRepository.save(serverDegradeLogs);getInstance().flag = false;}httpServletResponse.setStatus(429);ResponseService.httpResponse(httpServletResponse, ResponseStatus.SENTINEL_DEGRADE_ERROR);log.error("请求被熔断降级了:{}",e.getMessage());}/*** 热点被限流了*/else if (e instanceof ParamFlowException) {httpServletResponse.setStatus(429);ResponseService.httpResponse(httpServletResponse, ResponseStatus.SENTINEL_PARAM_FLOW_ERROR);log.error("热点被限流了:{}",e.getMessage());}/*** 请求没有权限*/else if (e instanceof AuthorityException) {httpServletResponse.setStatus(401);ResponseService.httpResponse(httpServletResponse, ResponseStatus.UNAUTHORIZED);log.error("请求没有权限:{}",e.getMessage());}}
}

参考链接:
断路器的使用:https://github.com/alibaba/Sentinel/issues/1939

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

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

相关文章

RocketMQ的延迟消息是如何实现的❓

RocketMQ 作为一款强大的分布式消息中间件&#xff0c;提供了丰富的功能&#xff0c;其中之一就是延迟消息。在本篇博客中&#xff0c;我们将深入探讨 RocketMQ 延迟消息的实现机制&#xff0c;了解消息的定时投递和消费流程。 1. 定时消息的发送 RocketMQ 实现延迟消息的第一…

linux应用软件下载站收集

一、这是一个别人问题帖&#xff0c;里面有很多下载站点。 谁知道可以自由下载Linux软件的论坛或者平台&#xff1f;类似52破解论坛。国内国外都可以&#xff0c;我在搜索引擎找不到&#xff1f; - 知乎

2023年度影响力出海品牌传音移动互联:开放合作 赋能更多中国企业高效出海

伴随着全球化的脚步&#xff0c;出海成为许多中国企业的“必选项”&#xff0c;与之配套的出海服务相关业务也得到了极大的发展。近日&#xff0c;第五届鲸鸣奖颁奖典礼上&#xff0c;传音移动互联凭借为企业提供高效优质的出海解决方案&#xff0c;荣获鲸鸣奖“2023年度影响力…

SpringBoot 引入nacos 【最新 | 可运行】

SpringBoot 引入nacos 首先要了解在 Springboot 中只支持那些 Springboot 的版本&#xff08;我真的被这个搞死了&#xff09;,可以如下图参考&#xff1a; 下面我们就开始吧 下载 Nacos nacos 下载地址&#xff0c;这里可以选择你要下载的版本&#xff0c;我选择下载了2.2.…

<JavaEE> 文件IO -- 数据流和文件内容操作(Reader 和 Writer 、InputStream 和 OutputStream)

目录 一、数据流概述 二、流的关闭 2.1 使用 close() 方法 2.2 使用 try-finally 2.3 使用 try-with-resources 三、字符流的读写 3.1 Reader 类 3.2 Writer 类 四、字节流的读写 4.1 InputStream 类 4.2 OutputStream 类 一、数据流概述 1&#xff09;在 Java 中&…

[c]零钱兑换

题目比较简单&#xff0c;看答案就能看懂什么意思 #include<stdio.h> int main() {int count 0;int n;scanf("%d", &n);for (int i 0; i < n; i){for (int k 0; k <n/2; k){for (int j 0; j < n/5 ; j){if (i 2 * k 5 * j n){count;}}}}p…

【Python基础】迭代器

文章目录 [toc]什么是迭代可迭代对象判断数据类型是否是可迭代类型 迭代器对可迭代对象进行迭代的本质获取可迭代对象的迭代器通过迭代器获取数据StopIteration异常 自定义迭代器__iter__()方法__next__()方法判断数据类型是否是可迭代类型自定义迭代器案例分离模式整合模式 fo…

这套软件测试技巧|软测经典面试题真的有用,今天面试大部分都遇到了!!!

祝同学们都能够顺利找到心仪的工作拿高薪&#xff0c;废话不多说&#xff0c;下面上题了~ 46、您以往是否曾经从事过性能测试工作&#xff1f;如果有&#xff0c;请尽可能的详细描述您以往的性能测试工作的完整过程。 &#xff08;以自己最熟悉的性能测试项目为例&#xff09; …

【ARM Trace32(劳特巴赫) 高级篇 20 -- SNOOPer 使用介绍】

请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 SNOOPer 介绍SNOOPer 主要功能:SNOOPer 使用场景SNOOPer.ERRORSTOPSNOOPer.ModeSNOOPer.PCSNOOPer.RateSNOOPer.SELectSNOOPer.SIZESNOOPer.TDelaySNOOPer.TOutSNOOPer.TValueSNOOPer PC 采样Trace32 SNOOPer 介绍 在 Laut…

什么是面向切片编程?

面向切片&#xff08;Aspect-oriented Programming&#xff0c;AOP&#xff09;是一种软件开发的方法论&#xff0c;它旨在通过将横切关注点从主要业务逻辑中分离出来&#xff0c;提供更高层次的模块化和可维护性。它通过将跨越多个对象、类或组件的共同功能&#xff08;称为横…

可惜+悲伤+唉=emmo...

拟合曲线&#xff1a; 参考论文&#xff1a;黄河清.NURBS曲面逆向造型关键算法的研究与应用 [D].西北工业大学,2004 三次NURBS曲线控制点的计算 首先给出拟合曲线的具体步骤&#xff1a; 1、节点矢量的求解方法为&#xff1a; 采用积累弦长参数化法&#xff0c;即&#xff1…

应用ICP-MS实验PFA烧杯耐腐蚀带刻度反应杯的特点分析

聚四氟&#xff08;PFA&#xff09;烧杯可用于痕量分析、同位素分析等实验&#xff0c;ICP-MS实验室适用。半导体、多晶硅、光伏电子 锂电池行业均适用。杯体刻度清晰&#xff0c;方便观察&#xff0c;尖嘴方便倾倒溶液。 可溶性聚四氟乙烯烧杯特性&#xff1a; 1、透明&…

如何定制专属app:定制app教程

《如何定制专属app&#xff1a;探索app定制的秘密》 什么是app定制 在当今数字化时代&#xff0c;应用程序&#xff08;app&#xff09;已经渗透到我们生活的方方面面&#xff0c;从社交娱乐到工作学习&#xff0c;app无处不在&#xff0c;尽管市场上有着众多的app供我们选择…

(企业 / 公司项目)微服务项目解决跨域问题:

前后端分离项目中前端出现了跨域的问题 在网关模块配置文件中添加 配置 application.properties # 允许请求来源&#xff08;老版本叫allowedOrigin&#xff09; spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedOriginPatterns* # 允许携带的头信息 spri…

经典基本电路

USB电路 USB差分走线的阻抗为90欧:差分对10mil宽的走线以及5mil的间距,两边包地15/20mil以上厚度(SI9000计算阻抗) USB2.0接口电路&#xff1a; USB3.0接口电路&#xff1a; USB HUB电路: HDMI电路 HDMI差分走线的阻抗为100欧:差分对6mil宽的走线以及5mil的间距,两边包地15/20…

PADS的使用

目录 一、PADS常规操作1.1 常用快捷键1.2 Logic相关设置 二、Logic库操作2.1 逻辑库2.2 封装库2.3 元件库 一、PADS常规操作 PADS安装好了之后&#xff0c;主要使用下面三个软件&#xff1a; Logic&#xff1a;画原理图文件&#xff0c;也可以使用OrCAD导入Router&#xff1a;…

解决maven报错 ‘parent.relativePath‘ of POM

错误提示 parent.relativePath of POM io.renren:renren-fast:3.0.0 (D:\wzyProjets\gulimail\renren-fast\pom.xml) points at com.wzy.gulimail:gulimail instead of org.springframework.boot:spring-boot-starter-parent, please verify your project structure错误分析 子…

windows10下jdk安装

文章目录 windows10下jdk安装说明what安装包下载执行安装包验证是否安装成功 windows10下jdk安装 说明 操作系统&#xff1a;windows10 版本&#xff1a;1.8 what JDK(Java Development Kit) 是 Java 语言的软件开发工具包 安装包下载 https://www.oracle.com/java/techn…

RabbitMQ插件详解:rabbitmq_recent_history_exchange【RabbitMQ 七】

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 rabbitmq_recent_history_exchange 前言插件介绍工作原理工作原理概述&#xff1a;底层实现&#xff1a; 配置和使用配置插件的详细步骤&#xff1a; 实例演示场景描述&#…

【JAVA】黑马MybatisPlus 学习笔记【二】【核心功能】

2.核心功能 刚才的案例中都是以id为条件的简单CRUD&#xff0c;一些复杂条件的SQL语句就要用到一些更高级的功能了。 2.1.条件构造器 除了新增以外&#xff0c;修改、删除、查询的SQL语句都需要指定where条件。因此BaseMapper中提供的相关方法除了以id作为where条件以外&…