Hystrix熔断器与异常处理的艺术

在微服务架构中,服务之间的调用关系错综复杂,任何一个服务的故障都可能引发连锁反应,导致整个系统瘫痪。Hystrix作为Netflix开源的熔断器框架,能够有效地隔离服务之间的调用,防止故障蔓延。本文将通过实例详细讲解Hystrix的异常处理机制,以及如何利用熔断器保护系统免受故障影响。
一、Hystrix异常处理机制
Hystrix提供了强大的异常处理能力,当服务调用失败时,可以通过fallback方法捕获异常。fallback方法可以接收一个额外的Throwable参数,从而获取导致服务失败的具体异常信息。这种机制使得我们能够在服务不可用时,提供备用的处理逻辑,增强系统的容错性。
二、实例分析

  1. 使用@HystrixCommand和fallback方法
    首先,我们来看一个简单的例子,展示如何在服务调用中使用Hystrix的fallback机制。
    java复制
    package com.logicbig.example;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;

@Service
public class MyService {
@HystrixCommand(fallbackMethod = “defaultDoSomething”)
public void doSomething(int input) {
System.out.println("output: " + 10 / input);
}

@HystrixCommand(fallbackMethod = "defaultDoSomething")
public void doSomething2(int input) {try {TimeUnit.MILLISECONDS.sleep(1500); // timeout scenario} catch (InterruptedException e) {return;}System.out.println("output: " + 10 / input);
}public void defaultDoSomething(int input, Throwable throwable) {System.out.printf("Default, input=%s, exception=%s%n", input, throwable);
}

}
在上述代码中,doSomething和doSomething2方法都使用了@HystrixCommand注解,并指定了fallback方法defaultDoSomething。当doSomething方法因除零异常而失败时,会调用defaultDoSomething方法,并将异常信息传递给fallback方法。
2. 测试fallback机制
接下来,我们通过一个简单的Spring Boot应用来测试fallback机制。
java复制
package com.logicbig.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
@EnableCircuitBreaker
public class CircuitBreakerMain {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(CircuitBreakerMain.class, args);
MyService myService = ctx.getBean(MyService.class);
System.out.println(“-- calling doSomething(2) --”);
myService.doSomething(2);
System.out.println(“-- calling doSomething(0) --”);
myService.doSomething(0);
System.out.println(“-- calling doSomething(5) --”);
myService.doSomething(5);
System.out.println(“-- calling doSomething2(2) --”);
myService.doSomething2(2);
}
}
运行上述代码,输出结果如下:
复制
– calling doSomething(2) –
output: 5
– calling doSomething(0) –
Default, input=0, exception=java.lang.ArithmeticException: / by zero
– calling doSomething(5) –
output: 2
– calling doSomething2(2) –
Default, input=2, exception=com.netflix.hystrix.exception.HystrixTimeoutException
从输出结果可以看出,当doSomething方法因除零异常失败时,成功调用了fallback方法defaultDoSomething,并打印了异常信息。同样,当doSomething2方法因超时异常失败时,也调用了fallback方法。
3. 熔断器触发场景
Hystrix的熔断器机制能够在一定时间内阻止对故障服务的调用,从而避免系统资源的浪费。当服务调用失败次数达到一定阈值时,熔断器会自动切换到OPEN状态,拒绝后续的调用请求。经过一段时间后,熔断器会尝试恢复到HALF_OPEN状态,允许部分调用请求通过,以检测服务是否恢复正常。
下面是一个熔断器触发的示例:
java复制
@SpringBootApplication
@EnableCircuitBreaker
public class CircuitBreakerMain2 {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext ctx = SpringApplication.run(CircuitBreakerMain2.class, args);
MyService myService = ctx.getBean(MyService.class);
System.out.println(“-- calling doSomething() 40 times --”);
int n = 40;
for (int i = 0; i < n; i++) {
myService.doSomething(i < (n * 0.6) ? 0 : 2);
TimeUnit.MILLISECONDS.sleep(100);
}
TimeUnit.SECONDS.sleep(6);
System.out.println(“-- final call --”);
myService.doSomething(2);
}
}
运行上述代码,输出结果如下:
复制
– calling doSomething() 40 times –
Default, input=0, exception=java.lang.ArithmeticException: / by zero
Default, input=0, exception=java.lang.ArithmeticException: / by zero

Default, input=0, exception=java.lang.RuntimeException: Hystrix circuit short-circuited and is OPEN
Default, input=2, exception=java.lang.RuntimeException: Hystrix circuit short-circuited and is OPEN

– final call –
output: 5
从输出结果可以看出,当服务调用失败次数达到一定阈值后,熔断器切换到OPEN状态,拒绝了后续的调用请求。经过一段时间后,熔断器尝试恢复到HALF_OPEN状态,允许部分调用请求通过。最终,服务恢复正常,调用请求成功。
三、总结
通过上述实例,我们详细介绍了Hystrix的异常处理机制和熔断器触发场景。Hystrix的fallback机制能够在服务调用失败时提供备用的处理逻辑,增强系统的容错性。同时,熔断器机制能够在一定时间内阻止对故障服务的调用,避免系统资源的浪费。在微服务架构中,合理使用Hystrix能够有效提高系统的稳定性和可靠性。
希望本文对你有所帮助,如果你对Hystrix的其他功能感兴趣,欢迎继续关注我的博客。

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

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

相关文章

Linux(NTP配置)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; NTP环境搭建 服务端客户端192.168.111.10192.168.111.11Linux MySQL5.7 3.10.0-1160.el7.x86_…

神经网络|(四)概率论基础知识-古典概型

【1】引言 前序学习了线性回归的基础知识&#xff0c;了解到最小二乘法可以做线性回归分析&#xff0c;但为何最小二乘法如此准确&#xff0c;这需要从概率论的角度给出依据。 因此从本文起&#xff0c;需要花一段时间来回顾概率论的基础知识。 【2】古典概型 古典概型是我…

21款炫酷烟花合集

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码&#xff1a;Python动漫烟花&#xff08;完整代码&#xff09; ​ Python烟花② 完整…

新项目上传gitlab

Git global setup git config --global user.name “FUFANGYU” git config --global user.email “fyfucnic.cn” Create a new repository git clone gitgit.dev.arp.cn:casDs/sawrd.git cd sawrd touch README.md git add README.md git commit -m “add README” git push…

Brightness Controller-源码记录

Brightness Controller 亮度控制 一、概述二、ddcutil 与 xrandr1. ddcutil2. xrandr 三、部分代码解析1. icons2. ui3. utilinit.py 一、概述 项目&#xff1a;https://github.com/SunStorm2018/Brightness.git 原理&#xff1a;Brightness Controlle 是我在 Ubuntu 发现上调…

机器学习-K近邻算法

文章目录 一. 数据集介绍Iris plants dataset 二. 代码三. k值的选择 一. 数据集介绍 鸢尾花数据集 鸢尾花Iris Dataset数据集是机器学习领域经典数据集&#xff0c;鸢尾花数据集包含了150条鸢尾花信息&#xff0c;每50条取自三个鸢尾花中之一&#xff1a;Versicolour、Setosa…

Day27-【13003】短文,线性表两种基本实现方式空间效率、时间效率比较?兼顾优点的静态链表是什么?如何融入空闲单元链表来解决问题?

文章目录 本次内容总览第四节&#xff0c;两种基本实现方式概览两种基本实现方式的比较元素个数n大于多少时&#xff0c;使用顺序表存储的空间效率才会更高&#xff1f;时间效率比较&#xff1f;*、访问操作&#xff0c;也就是读运算&#xff0c;读操作1、插入&#xff0c;2、删…

JavaSE第十一天——集合框架Collection

一、List接口 List接口是一个有序的集合&#xff0c;允许元素有重复&#xff0c;它继承了Collection接口&#xff0c;提供了许多额外的功能&#xff0c;比如基于索引的插入、删除和访问元素等。 常见的List接口的实现类有ArrayList、LinkedList和Vector。 List接口的实现类 …

数据结构与算法学习笔记----求组合数

数据结构与算法学习笔记----求组合数 author: 明月清了个风 first publish time: 2025.1.27 ps⭐️一组求组合数的模版题&#xff0c;因为数据范围的不同要用不同的方法进行求解&#xff0c;涉及了很多之前的东西快速幂&#xff0c;逆元&#xff0c;质数&#xff0c;高精度等…

kaggle社区LLM Classification Finetuning

之前有个一样的比赛&#xff0c;没去参加&#xff0c;现在弄了一个无限期的比赛出来 训练代码链接&#xff1a;fine_tune | Kaggle 推理代码链接&#xff1a;https://www.kaggle.com/code/linheshen/inference-llama-3-8b?scriptVersionId219332972 包链接&#xff1a;pack…

【Python实现机器遗忘算法】复现2021年顶会 AAAI算法Amnesiac Unlearning

【Python实现机器遗忘算法】复现2021年顶会 AAAI算法Amnesiac Unlearning 1 算法原理 论文&#xff1a;Graves, L., Nagisetty, V., & Ganesh, V. (2021). Amnesiac machine learning. In Proceedings of the AAAI Conference on Artificial Intelligence, volume 35, 115…

51单片机开发:点阵屏显示数字

实验目标&#xff1a;在8x8的点阵屏上显示数字0。 点阵屏的原理图如下图所示&#xff0c;点阵屏的列接在P0端口&#xff0c;行接在74HC595扩展的DP端口上。 扩展口的使用详见&#xff1a;51单片机开发&#xff1a;IO扩展(串转并)实验-CSDN博客 要让点阵屏显示数字&#xff0…

买卖股票的最佳时机 II

hello 大家好&#xff01;今天开写一个新章节&#xff0c;每一天一道算法题。让我们一起来学习算法思维吧&#xff01; 问题分析 本题要求计算在可以多次买卖股票&#xff08;但任何时候最多只能持有一股股票&#xff0c;也可以在同一天买卖&#xff09;的情况下能获得的最大…

2024年度总结——理想的风,吹进现实

2024年悄然过去&#xff0c;留下了太多美好的回忆&#xff0c;不得不感慨一声时间过得真快啊&#xff01;旧年风雪尽&#xff0c;新岁星河明。写下这篇博客&#xff0c;记录我独一无二的2024年。这一年&#xff0c;理想的风终于吹进现实&#xff01; 如果用一句话总结这一年&am…

LosslessScaling-学习版[steam价值30元的游戏无损放大/补帧工具]

LosslessScaling 链接&#xff1a;https://pan.xunlei.com/s/VOHc-yZBgwBOoqtdZAv114ZTA1?pwdxiih# 解压后运行"A-绿化-解压后运行我.cmd"

CVE-2020-0796永恒之蓝2.0(漏洞复现)

目录 前言 产生原因 影响范围 漏洞复现 复现环境 复现步骤 防御措施 总结 前言 在网络安全的战场上&#xff0c;漏洞一直是攻防双方关注的焦点。CVE-2020-0796&#xff0c;这个被称为 “永恒之蓝 2.0” 的漏洞&#xff0c;一度引起了广泛的关注与担忧。它究竟是怎样的…

计算机网络 (61)移动IP

前言 移动IP&#xff08;Mobile IP&#xff09;是由Internet工程任务小组&#xff08;Internet Engineering Task Force&#xff0c;IETF&#xff09;提出的一个协议&#xff0c;旨在解决移动设备在不同网络间切换时的通信问题&#xff0c;确保移动设备可以在离开原有网络或子网…

node 爬虫开发内存处理 zp_stoken 作为案例分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言 主要说3种我们补环境过后如果用…

基于Python的哔哩哔哩综合热门数据分析系统的设计与实现

【Django】基于大数据的哔哩哔哩综合热门数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统涵盖登录、热门数据展示、数据分析及数据管理等功能。通过大数据处理与…

Object类(2)

大家好&#xff0c;今天我们继续来看看Object类中一些成员方法&#xff0c;这些方法在实际中有很大的用处&#xff0c;话不多说&#xff0c;来看。 注&#xff1a;所有类都默认继承Object类的&#xff0c;所以可调用Object类中的方法&#xff0c;如equals&#xff0c;也可以发生…