微服务设计模式 - 断路器模式 (Circuit Breaker Pattern)
微服务设计模式 - 断路器模式 (Circuit Breaker Pattern)

定义
断路器模式(Circuit Breaker Pattern)是云计算和微服务架构中的一种保护性设计模式,其目的是避免系统中的调用链出现故障时,导致系统瘫痪。通过断路器模式,可以检测到系统的故障并及时切断不稳定的调用,防止对失败的操作进行连续请求,保护服务的正常运行。
状态结构
断路器模式包含以下三个主要状态:
- 关闭状态 (Closed):初始状态,允许请求通过。如果请求失败次数超过阈值,则状态切换为“打开状态”。
- 打开状态 (Open):不允许请求通过,直接返回错误。经过一段时间后,将状态切换为“半开状态”。
- 半开状态 (Half-Open):允许部分请求通过。如果请求成功,则状态切换为关闭状态;否则,切换回打开状态。
状态转换

状态转换说明
- 初始状态:状态机从
Closed状态开始,代表断路器默认的工作状态。 - Closed 状态:
- 行为:允许所有请求通过,并监控请求的失败次数。
- 状态转换:如果请求失败次数超过设定阈值,转换到
Open状态。
- Open 状态:
- 行为:所有新请求立即失败,并设置一个超时时间。
- 状态转换:超时结束后,断路器转换到
HalfOpen状态。
- HalfOpen 状态:
- 行为:允许部分请求通过,以测试外部服务是否恢复正常。
- 状态转换:
- 如果请求成功,转换回
Closed状态。 - 如果请求失败,转换回
Open状态。
- 如果请求成功,转换回
应用场景
在微服务架构中,断路器模式广泛用于防止服务之间的级联故障。以下是应用断路器模式的一些示例:
-
订单系统:假设订单系统依赖库存服务,如果库存服务出现故障,订单系统可以使用断路器模式进行保护。
-
支付系统:支付服务可能需要调用第三方服务,断路器模式可以防止第三方服务故障影响整个支付流程。
与重试模式的区别
在分布式系统和微服务架构中,处理服务之间的通信故障是非常关键的。断路器模式和重试模式是两种常用的故障处理方案,这两种模式的目标和适用场景有所不同,理解它们的区别对于构建健壮的系统至关重要。
断路器模式和重试模式在处理操作失败方面有着不同的目的:
-
目的不同:
- 断路器模式 的目的是防止应用程序执行可能会失败的操作。它通过监控请求的失败情况,及时切断不稳定的调用,以保护系统稳定运行。
- 重试模式 使应用程序能够在操作失败后重新尝试执行该操作,期望最终能够成功。这种模式假设故障是暂时的,可以通过多次尝试来解决。
-
工作机制:
- 断路器模式:当检测到一段时间内某操作的失败次数超过预设的阈值时,断路器会打开,新的请求将被短路并直接失败。经过一段时间后,断路器进入半开状态,允许部分请求通过以测试外部服务是否恢复。如果恢复正常,则断路器关闭;否则,重新打开。
- 重试模式:在操作失败后,应用程序会自动重新尝试执行该操作,设定的重试次数和间隔时间可以通过配置来调整。重试模式试图通过多次尝试请求来克服暂时的故障。
-
故障处理策略:
-
断路器模式:通过中断请求保护系统,通常会提供降级回退服务。否则,可能返回错误来保护系统。
-
重试模式:不断尝试请求,直到成功或达到最大重试次数;通常不会提供降级服务,直接返回错误。
-
Spring Cloud Netflix Hystrix
Spring Cloud Netflix Hystrix 是 Spring Cloud 微服务生态系统中的一个子项目,用于实现分布式系统中的断路器模式(Circuit Breaker Pattern)。Hystrix 是由 Netflix 开发并开源的一个库,它能够帮助开发人员在构建分布式系统时应对服务之间调用的失败和延迟,以增强系统的容错能力和稳定性,主要特性如下:
- 断路器:Hystrix 实现了断路器模式,当一个服务发生故障时,Hystrix 通过断路器切断服务调用链,防止故障进一步传播。
- 资源隔离:Hystrix 提供了以线程池、信号量等方式实现资源隔离,防止单个服务的故障牵连到全局资源。
- 熔断(Fallback)与恢复:Hystrix 能监控服务调用,当发现调用失败率超过预设值时,断路器会打开。经过一定时间后会尝试恢复服务调用。
- 降级服务:当服务发生故障或调用超时时,Hystrix 能返回一个默认的降级处理结果,而不是让整个系统崩溃。
- 实时监控和告警:Hystrix 提供了仪表盘功能,可以对微服务进行实时监控,帮助开发人员及时发现和解决问题。
示例代码
以下是在 Spring Boot 中使用Hystrix实现断路器模式的完整示例。
项目结构
circuit-breaker-example/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── com/
│ │ │ │ ├── example/
│ │ │ │ │ ├── CircuitBreakerExampleApplication.java
│ │ │ │ │ ├── config/
│ │ │ │ │ │ └── RestTemplateConfig.java
│ │ │ │ │ ├── controller/
│ │ │ │ │ │ └── PaymentController.java
│ │ │ │ │ ├── service/
│ │ │ │ │ │ └── PaymentService.java
│ ├── resources/
│ │ ├── application.properties
├── pom.xml
引入依赖
在 pom.xml 中添加 Spring Cloud Netflix Hystrix 相关依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
配置参数
在 application.properties 配置文件中,设置 Hystrix 相关参数:
# Hystrix command 默认执行超时时间,单位毫秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000
添加 RestTemplate Bean
配置 RestTemplate Bean,以便在服务类中进行依赖注入:
package com.example.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
创建服务层并使用断路器
创建一个示例服务 PaymentService,在服务方法上添加 @HystrixCommand 注解,并指定降级方法。
package com.example.service;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;@Service
public class PaymentService {private final RestTemplate restTemplate;public PaymentService(RestTemplate restTemplate) {this.restTemplate = restTemplate;}@HystrixCommand(fallbackMethod = "defaultPayment")public String makePayment() {return this.restTemplate.getForObject("http://inventory-service/payment", String.class);}public String defaultPayment() {return "Payment service is unavailable. Please try again later.";}
}
创建控制层
创建一个简单的控制器 PaymentController,暴露支付接口:
package com.example.controller;import com.example.service.PaymentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class PaymentController {@Autowiredprivate PaymentService paymentService;@GetMapping("/payment")public String getPayment() {return paymentService.makePayment();}
}
主类启用 Hystrix
在主类上添加 @EnableCircuitBreaker 注解:
package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;@SpringBootApplication
@EnableCircuitBreaker // 启用断路器
public class CircuitBreakerExampleApplication {public static void main(String[] args) {SpringApplication.run(CircuitBreakerExampleApplication.class, args);}
}
总结

断路器模式通过在服务间调用失败时切断请求,从而有效地防止级联故障,提升系统的稳定性和容错能力。在微服务架构中,断路器模式是保护服务正常运行的关键设计模式。Spring Boot 提供了丰富的工具和库(Spring Cloud Netflix Hystrix ),使得断路器模式的实现更加简单和高效。希望本文能帮助您更好地理解断路器模式及其在实际中的应用,为系统设计和实现提供参考。
相关文章:
微服务设计模式 - 断路器模式 (Circuit Breaker Pattern)
微服务设计模式 - 断路器模式 (Circuit Breaker Pattern) 定义 断路器模式(Circuit Breaker Pattern)是云计算和微服务架构中的一种保护性设计模式,其目的是避免系统中的调用链出现故障时,导致系统瘫痪。通过断路器模式ÿ…...
HarmonyOS NEXT 应用开发实战(九、知乎日报项目详情页实现详细介绍)
在本篇博文中,我们将探讨如何使用 HarmonyOS Next 框架开发一个知乎日报的详情页,逐步介绍所用到的组件及代码实现。知乎日报是个小巧完整的小项目,这是一个循序渐进的过程,适合初学者和有一定开发经验的工程师参考。 1. 项目背景…...
lvgl 模拟器移植(V9)
1.模拟器代码下载 1.1:通过git 下载 github链接:GitHub - lvgl/lv_port_pc_visual_studio: Visual Studio projects for LVGL embedded graphics library. Recommended on Windows. Linux support with Wayland is work in progress.https://github.com…...
基于vue+neo4j 的中药方剂知识图谱可视化系统
前言 历时一周时间,中药大数据R02系统中药开发完毕,该系统通过scrapy工程获取中药数据,使用python pandas预处理数据生成知识图谱和其他相关数据,利用vuespringbootneo4jmysql 开发系统,具体功能请看本文介绍。 简要…...
(自用)机器学习python代码相关笔记
一些自存的机器学习函数和详细方法记录,欢迎指错。 前言:读取数据方法 import pandas as pd import pandas as pddf pd.read_csv(数据集.csv, header0) # header是从哪一行开始读起,一般是0,也可以取infer 一、数据处理&#…...
docker复现pytorch_cyclegan
1、安装docker 配置docker镜像 添加镜像源至docker engine 2、wsl2安装nvidia-docker 要在Ubuntu中安装NVIDIA Docker,需要满足以下条件: 确保主机已安装NVIDIA的CUDA驱动程序,并使用适用于您操作系统的正确版本。 wsl --update在Ubuntu…...
IDEA2024下安装kubernetes插件并配置进行使用
【1】安装插件 其实2024.2.3下默认已经安装了kubernetes插件,如果你发现自己IDEA中没有,在市场里面检索并下载即可。 【2】kubernetes配置 ① 前置工作 首先你要准备一个config文件和一个kubectl.exe 。 config文件类似如下: apiVersi…...
理解原子变量之二:从volatile到内存序-进一步的认识
目录 实例1 实例2 实例3 内存序中两个最重要的概念 补记 结论 实例1 看下面的例子:在vs2013中建立如下工程: #include <thread> #include <iostream> #include <chrono>bool done false;void worker(){std::this_thread::sle…...
DICOM标准:MR图像模块属性详解——磁共振成像(MR)在DICOM中的应用
目录 引言 磁共振成像(MR) 一、MR图像模块 二、MR图像属性描述 1、图像类型 (Image Type) 2、抽样每个象素 (Sampling per Pixel) 3、光度插值 (Photometric Interpretation) 4、位分配 (Bits Allocated) 结论 引言 数字成像和通信在医学(…...
Linux内核与用户空间
Linux内核与用户空间是Linux操作系统中的两个重要概念,它们各自承担着不同的功能和职责,并通过特定的机制进行交互。以下是对Linux内核与用户空间的详细解释: 一、Linux内核 定义:Linux内核是Linux操作系统的核心组件,…...
计算机网络-以太网小结
前导码与帧开始分界符有什么区别? 前导码--解决帧同步/时钟同步问题 帧开始分界符-解决帧对界问题 集线器 集线器通过双绞线连接终端, 学校机房的里面就有集线器 这种方式仍然属于共享式以太网, 传播方式依然是广播 网桥: 工作特点: 1.如果转发表中存在数据接收方的端口信息…...
找树根和孩子c++
题目描述 给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子 输入 第一行:n(0<结点数<100),m(0<边数<200)。 以下m行;每行两个结点x和y…...
植物源UDP-糖基转移酶及其分子改造-文献精读75
植物源UDP-糖基转移酶及其分子改造 摘要 糖基化能够增加化合物的结构多样性,有效改善水溶性、药理活性和生物利用度,对植物天然产物的药物开发至关重要。UDP-糖基转移酶(UGTs)能够催化糖基从活化的核苷酸糖供体转移到受体形成糖苷键,植物中天然产物的糖基化修饰主要通过UGTs实…...
Redis中String 的底层实现是什么?
Redis中String 的底层实现是什么? Redis 是基于 C 语言编写的,但 Redis 的 String 类型的底层实现并不是 C 语言中的字符串(即以空字符 \0 结尾的字符数组),而是自己编写了 SDS(Simple Dynamic String&…...
像mysql一样查询es
先简单介绍一下这个sql查询,因为社区一直反馈这个Query DSL 实在是太难用了。大家可以感受一下下面这个es的查询。 GET /my_index/_search { “query”: { “bool”: { “must”: [ { “match”: { “title”: “search” } }, { “bool”: { “should”: [ { “te…...
SpringBoot中@Validated或@Valid注解校验的使用
文章目录 SpringBoot中Validated或Valid注解校验的使用1. 添加依赖2. 使用示例准备2-1 测试示例用到的类2-2 实体Dto,加入校验注解2-2 Controller 3. 示例测试4. Valid 和 Validated注解详解4-1 常用规则注解4-2 分组验证4-2-1 示例准备4-2-2 Controller接口4-2-3 P…...
HashMap为什么线程不安全?
一、Put操作(数据覆盖) HashMap底层是基于数组 链表(在 Java 8 以后,当链表长度超过一定阈值时会转换为红黑树)的数据结构。在多线程环境下,当多个线程同时对HashMap进行put操作时,可下面这种…...
类加载器及反射
目录 1.类加载器 1.1类加载【理解】 1.2类加载器【理解】 1.2.1类加载器的作用 1.2.2JVM的类加载机制 1.2.3Java中的内置类加载器 1.2.4ClassLoader 中的两个方法 2.反射 2.1反射的概述【理解】 2.2获取Class类对象的三种方式【应用】 2.2.1三种方式分类 2.2.2示例…...
aws boto3 下载文件
起因:有下载 aws s3 需求,但只有web 登录账号,有 id 用户名 密码,没有 boto3 的 key ID 经过分析,发现网页版有个地址会返回临时 keyID,playwright 模拟登录,用 page.on 监测返回数据ÿ…...
3DDFA-V3——基于人脸分割几何信息指导下的三维人脸重建
1. 研究背景 从二维图像中重建三维人脸是计算机视觉研究的一项关键任务。在虚拟现实、医疗美容、计算机生成图像等领域中,研究人员通常依赖三维可变形模型(3DMM)进行人脸重建,以定位面部特征和捕捉表情。然而,现有的方…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
