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

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

Circuit Breaker Pattern

定义

断路器模式(Circuit Breaker Pattern)是云计算和微服务架构中的一种保护性设计模式,其目的是避免系统中的调用链出现故障时,导致系统瘫痪。通过断路器模式,可以检测到系统的故障并及时切断不稳定的调用,防止对失败的操作进行连续请求,保护服务的正常运行。

状态结构

断路器模式包含以下三个主要状态:

  1. 关闭状态 (Closed):初始状态,允许请求通过。如果请求失败次数超过阈值,则状态切换为“打开状态”。
  2. 打开状态 (Open):不允许请求通过,直接返回错误。经过一段时间后,将状态切换为“半开状态”。
  3. 半开状态 (Half-Open):允许部分请求通过。如果请求成功,则状态切换为关闭状态;否则,切换回打开状态。

状态转换

Circuit-Breaker-Pattern-State

状态转换说明

  • 初始状态:状态机从 Closed 状态开始,代表断路器默认的工作状态。
  • Closed 状态:
    • 行为:允许所有请求通过,并监控请求的失败次数。
    • 状态转换:如果请求失败次数超过设定阈值,转换到 Open 状态。
  • Open 状态:
    • 行为:所有新请求立即失败,并设置一个超时时间。
    • 状态转换:超时结束后,断路器转换到 HalfOpen 状态。
  • HalfOpen 状态:
    • 行为:允许部分请求通过,以测试外部服务是否恢复正常。
    • 状态转换
      • 如果请求成功,转换回 Closed 状态。
      • 如果请求失败,转换回 Open 状态。

应用场景

在微服务架构中,断路器模式广泛用于防止服务之间的级联故障。以下是应用断路器模式的一些示例:

  1. 订单系统:假设订单系统依赖库存服务,如果库存服务出现故障,订单系统可以使用断路器模式进行保护。

  2. 支付系统:支付服务可能需要调用第三方服务,断路器模式可以防止第三方服务故障影响整个支付流程。

与重试模式的区别

在分布式系统和微服务架构中,处理服务之间的通信故障是非常关键的。断路器模式和重试模式是两种常用的故障处理方案,这两种模式的目标和适用场景有所不同,理解它们的区别对于构建健壮的系统至关重要。

断路器模式重试模式在处理操作失败方面有着不同的目的:

  1. 目的不同

    • 断路器模式 的目的是防止应用程序执行可能会失败的操作。它通过监控请求的失败情况,及时切断不稳定的调用,以保护系统稳定运行。
    • 重试模式 使应用程序能够在操作失败后重新尝试执行该操作,期望最终能够成功。这种模式假设故障是暂时的,可以通过多次尝试来解决。
  2. 工作机制

    • 断路器模式:当检测到一段时间内某操作的失败次数超过预设的阈值时,断路器会打开,新的请求将被短路并直接失败。经过一段时间后,断路器进入半开状态,允许部分请求通过以测试外部服务是否恢复。如果恢复正常,则断路器关闭;否则,重新打开。
    • 重试模式:在操作失败后,应用程序会自动重新尝试执行该操作,设定的重试次数和间隔时间可以通过配置来调整。重试模式试图通过多次尝试请求来克服暂时的故障。
  3. 故障处理策略

    • 断路器模式:通过中断请求保护系统,通常会提供降级回退服务。否则,可能返回错误来保护系统。

    • 重试模式:不断尝试请求,直到成功或达到最大重试次数;通常不会提供降级服务,直接返回错误。

Spring Cloud Netflix Hystrix

Spring Cloud Netflix Hystrix 是 Spring Cloud 微服务生态系统中的一个子项目,用于实现分布式系统中的断路器模式(Circuit Breaker Pattern)。Hystrix 是由 Netflix 开发并开源的一个库,它能够帮助开发人员在构建分布式系统时应对服务之间调用的失败和延迟,以增强系统的容错能力和稳定性,主要特性如下:

  1. 断路器:Hystrix 实现了断路器模式,当一个服务发生故障时,Hystrix 通过断路器切断服务调用链,防止故障进一步传播。
  2. 资源隔离:Hystrix 提供了以线程池、信号量等方式实现资源隔离,防止单个服务的故障牵连到全局资源。
  3. 熔断(Fallback)与恢复:Hystrix 能监控服务调用,当发现调用失败率超过预设值时,断路器会打开。经过一定时间后会尝试恢复服务调用。
  4. 降级服务:当服务发生故障或调用超时时,Hystrix 能返回一个默认的降级处理结果,而不是让整个系统崩溃。
  5. 实时监控和告警: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);}
}

总结

cloud-native-definition-1

断路器模式通过在服务间调用失败时切断请求,从而有效地防止级联故障,提升系统的稳定性和容错能力。在微服务架构中,断路器模式是保护服务正常运行的关键设计模式。Spring Boot 提供了丰富的工具和库(Spring Cloud Netflix Hystrix ),使得断路器模式的实现更加简单和高效。希望本文能帮助您更好地理解断路器模式及其在实际中的应用,为系统设计和实现提供参考。

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

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

相关文章

roberta融合模型创新中文新闻文本标题分类

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

win11安装安卓apk原生应用,并设置网络代理

一、win11安装安卓apk原生应用&#xff0c;查看https://blog.csdn.net/qq_33704787/article/details/123658419https://blog.csdn.net/qq_33704787/article/details/123658419 主要是安装&#xff1a;Windows Subsystem for Android™ with Amazon Appstore 二、使用ABD工具设…

计算机网络(Ⅵ)应用层原理

一些网络应用的例子: E-mail Internaet电话 Web 电子支付 文本信息 搜索 P2P文件共享 流媒体 即时通讯 实时电视会议 .... .... 创建一个网络应用&#xff1a; 1.编程 2.在不同的端系统上运行。 网络应用的体系架构 可能的应用架构 1.客户-服…

【调优方法】——warmup预热

文章目录 什么是warmup?为什么引入warmup&#xff1f;warmup策略1. 线性warmup&#xff08;虚线&#xff09;2. 指数warmup&#xff08;点划线&#xff09; warmup改进参考文献 什么是warmup? warmup是一种学习率预热的方法&#xff0c;是指在训练开始时使用较小的学习率&am…

【Java笔记】1-JDK/JRE/JVM是个啥?

JDK、JRE、JVM可以说是入门必须了解的三个词汇 先说全称 JDK&#xff1a;Java Development Kit&#xff0c;Java开发工具包 JRE&#xff1a;Java Runtime Environment&#xff0c;Java运行环境 JVM&#xff1a;Java Virtual Machine&#xff0c;Java虚拟机 再说关系 JVM⊆J…

阿里云docker安装禅道记录

docker network ls docker network create -d bridge cl_network sudo docker run --name zentao --restart always -p 9982:80 --networkcl_network -v /data/zentao:/data -e MYSQL_INTERNALtrue -d hub.zentao.net/app/zentao:18.5 参考&#xff1a;用docker安装禅道…

uniapp iOS打包证书过期——重新下载证书及更新文件

证书过期&#xff0c;重新生成步骤 关于所需的证书、标识符、描述文件等请查看iOS打包证书申请流程证书有效期为1年 过期提示 生成证书 点击 钥匙串访问 → 证书助理 → 从证书颁发机构请求证书 &#xff1b; 我这里选择 存储到磁盘 &#xff0c;邮件、名称 可自定义&#…

Pandas 数据清洗

1.数据清洗定义 数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况&#xff0c;如果要使数据分析更加准确&#xff0c;就需要对这些没有用的数据进行处理。 2.清洗空值 DataFrame.dropna(axis0, howany, threshN…

数据结构与算法(1)

一&#xff1a;文章总体结构内容解读 二&#xff1a;绪论 1.1研究&#xff1a; 1.范围 数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科&#xff1b; 2.计算机解决问题步骤&#xff1a; 1.2基本概念和术语&#xff1a; 1.数据、…

RNN与Self-Attention

文章目录 1. SimpleRNN1.1 h t h_t ht​计算1.2 激活函数 2. SimpleRNNSelf-Attention2.1 状态更新2.2 权重 α α α 1. SimpleRNN 学习视频&#xff1a;https://www.youtube.com/watch?vCc4ENs6BHQw&t0s 对于时序数据&#xff0c;输入输出都不固定&#xff0c;需要ma…

Vue指令:v-show、v-if

目录 1.v-show:频繁控制显示隐藏 v-if:要么显示&#xff0c;要么隐藏 2.网页渲染效果 3.flag:true 4.若flag:false&#xff0c;则 5.底层原理&#xff1a; 1.v-show:频繁控制显示隐藏 v-if:要么显示&#xff0c;要么隐藏 <!DOCTYPE html> <html lang"en&…

在Springboot中更好的打印日志

说明 我的系统缺乏一些日志打印,但我并不想显式的在我的业务代码中使用Slf4j注解,因为这会造成我无法关注我的业务代码逻辑,因为通常来说,10行业务代码 你可以就需要3-4行log.info来打印日志 是的,这样代码很难看,所以我使用了Aop 拦截器 面向对象 threadLoacl等技术来设计我…

进程间通信小练习

[!info] 编写程序 创建两个进程&#xff1a; 父进程执行文件拷贝操作。如果接收到SIGUSR1信号&#xff0c;将打印出当前拷贝进度。 子进程每隔一个固定时间向父进程发生SIGUSR1信号。 vi src.txt然后输几十个字 然后新建源程序 #include <stdio.h> #include <stdli…

NVR小程序接入平台/设备EasyNVR多个NVR同时管理多平台级联与上下级对接的高效应用

政务数据共享平台的建设正致力于消除“信息孤岛”现象&#xff0c;打破“数据烟囱”&#xff0c;实现国家、省、市及区县数据的全面对接与共享。省市平台的“级联对接”工作由多级平台共同构成&#xff0c;旨在满足跨部门、跨层级及跨省数据共享的需求&#xff0c;推动数据流通…

wait()方法和notify()方法

由于操作系统对线程的调度是随机执行的&#xff0c;且线程之间是抢占式执行的&#xff0c;因此线程之间执行的先后顺序难以预知。但是&#xff0c;有时候在实际开发中&#xff0c;我们希望合理的协调多个线程之间的先后执行顺序。在Java中&#xff0c;wait()方法和notify()方法…

搭建 EwoMail 邮件服务器

EwoMail简介 EwoMail是基于Linux的开源邮件服务器&#xff0c;支持一键搭建&#xff0c;集成了众多优秀稳定的组件&#xff0c;是一个快速部署、简单高效、安全稳定的邮件解决方案&#xff0c;支持电脑和手机的客户端&#xff0c;适合个人或邮箱功能需求少的企业。 非常稳定&…

ST算法解RMQ问题

题目 代码 #include <bits/stdc.h> using namespace std; const int N 2e510, M 20; int st[N][M]; int n, m; int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n;for(int i 1; i < n; i)cin >> st[i][0];for(int i 1; (1 << i) < …

STM32启动文件分析

1. 启动文件简介 启动文件由汇编编写&#xff0c;是系统上电复位后第一个执行的程序。主要做了以下工作&#xff1a; 初始化堆栈指针SP_initial_sp;初始化程序计数器指针PCReset_Handler;设置堆、栈的大小;初始化中断向量表;配置外部SRAM作为数据存储器&#xff08;这个由用户…

Netty 组件介绍 - Future Promise

在异步处理时&#xff0c;经常用到这两个接口 netty 中的 Future 继承 jdk 中的 FutuFuture&#xff0c;而Promise 又对 netty Future 进行了扩展。 idk Future 只能同步等待任务结束&#xff08;或成功或失败)才能得到结果netty Future 可以同步等待任务结束得到结也可以异…

破局智能制造:难点分析与对策

一、 智能制造过程中可能遇到难点: 1. --概念和技术繁多--: - 智能制造领域涉及众多概念和技术,如工业4.0、CPS、工业互联网等,让企业难以选择和应用。 2. --缺乏经验和成功案例--: - 企业在推进智能制造时缺乏经验,存在信息孤岛、自动化孤岛等问题,缺乏统一规划和系统推…