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

news2024/12/23 6:16:48

微服务设计模式 - 断路器模式 (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 {

    @Bean
    public 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 {

    @Autowired
    private 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.coloradmin.cn/o/2231655.html

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

相关文章

PG数据库 jsonb字段 模糊查询

背景&#xff1a; 项目由于多语言的设计&#xff0c;将字段设置成json字段类型&#xff0c;同时存储中文和英文 页面上通过输入框实现模糊的查询 一、表结构&#xff1a;name字段设置jsonb类型 二、表数据 3、Mybatis编写sql select pp.name ->>zh-CN as pmsProductNam…

OpenCV—calcHist()函数

void calcHist( const Mat* images, int nimages,const int* channels, InputArray mask,SparseMat& hist, int dims,const int* histSize, const float** ranges,bool uniform true, bool accumulate false ); images 输入的数据指针&#xff0c;要具备相同的尺寸和数…

《Python网络安全项目实战》项目2 Python基础练习

《Python网络安全项目实战》项目2 Python基础练习 项目2 Python基础练习任务2.1 使用数据类型2.1.1 输出2.1.2 输入2.1.3 数字2.1.4 字符串 相关知识 任务评价 任务拓展 任务2.2 使用组合数据类型2.2.1 列表2.2.2 元组2.2.3 集合2.2.4 字典 相关知识 任务评价 任务…

less解决function中return写法在浏览器被识别成Object导致样式失败的问题

问题描述&#xff1a; 一开始写的是: baseFontSize: 37.5px;//基于屏幕尺寸/10得出的基准font-size// return失败,浏览器显示为[object Object],[object Object] .pxToRem(px){value: px / baseFontSize * 1rem;return value; } 使用height: .pxToRem(40px);之后浏览器却是这…

安装中文版 Matlab R2022a

下载安装包 压缩包有点大&#xff0c;大概20G 百度网盘&#xff1a;下载链接 提取码&#xff1a;rmja 安装 解压后打开目录&#xff0c;右键以管理员身份运行 setup.exe 选择输入安装秘钥 输入秘钥&#xff1a; 50874-33247-14209-37962-45495-25133-28159-33348-18070-6088…

Linux云计算 |【第五阶段】CLOUD-DAY9

主要内容&#xff1a; Metrics资源利用率监控、存储卷管理&#xff08;临时卷ConfitMap、EmptyDir、持久卷HostPath、NFS(PV/PVC)&#xff09; 一、Metrics介绍 metrics是一个监控系统资源使用的插件&#xff0c;可以监控Node节点上的CPU、内存的使用率&#xff0c;或Pod对资…

sql数据库数据修改与删除-DML

目录 修改数据 同时修改两个数据 修改表中所有数据 删除数据 删除指定字段的值&#xff08;用UPDATE&#xff09; 删除整张表的数据 举例表如下FIRST表 修改数据 UPDATE 表名 SET 字段名1值1,字段名2值2,...[WHERE 条件]; 将first表name字段张三修改为张三丰。 UPDA…

Oracle视频基础1.3.5练习

Oracle视频基础1.3.4练习 1.3.5 检查数据库启动状态 ps -ef | grep oracle ipcs clear演示alter向前向后改database阶段 sqlplus /nolog conn / as sysdba startup mount alter database nomount # 报错 alter database open启动restricted mode&#xff0c;创建一个connect&…

MySQL数据库迁移到DM8数据库

1. 达梦新建zsaqks库 2. 打开DM数据迁移工具 3. 新建工程 4. 迁移 - 右击 - 新建迁移 下一步 5. 选择迁移方式 6. MySQL数据源 请输入MySQL数据库信息 7. DM数据库目的 请输入达梦数据库信息 8. 迁移选项 保持对象名大小写(勾选) 9. 指定模式 指定是从数据源复制对象。 10.…

如何在Linux系统中使用Ansible进行自动化部署

如何在Linux系统中使用Ansible进行自动化部署 Ansible简介 安装Ansible 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 启动Ansible服务 Ansible基本概念 Inventory Playbook Module 配置Ansible 测试Ansible配置 执行Ansible Playbook Ansible模块 文件模块 包管理模块…

爬虫学习2

数据解析 正则表达式 量词&#xff1a; import re#searcch只会匹配到第一次匹配的内容#result re.search(r"\d","今年32")#print(result.group()) #result re.findall(r"\d","我是一个abcdeafg") #print(result)#search只会匹配到第…

初步认识Java,及使用

JAVA 特点 简单性 面向对象 分布式 健壮性 安全性 体系结构中立&#xff08;平台无关&#xff09; 可移植性 解释执行 高性能 多线程 动态 发展史 JDK&#xff0c;Eclipse下载&#xff0c;…

牛客sql题目总结(1)

1.第N高的薪水 AC: create function getnthhighestsalary(n int) returns int begindeclare m int; set m n - 1; return (select distinct salaryfrom employeeorder by salary desclimit m, 1); end 2. 3. 4. 5. 6.

Pr 视频效果:ASC CDL

视频效果/颜色校正/ASC CDL Color Correction/ASC CDL ASC CDL ASC CDL效果通过对红、绿、蓝三个原色通道的独立调整&#xff0c;实现对图像色彩的精确控制。在此基础上&#xff0c;还可用于调整处理后图像的整体饱和度。 ◆ ◆ ◆ 效果选项说明 斜率 Slope、偏移 Offset和功…

开源OCR免费助力法律文档数字化,提升文档管理效率

一、在法律行业&#xff0c;每天需要处理大量纸质文件&#xff0c;从合同到判决书&#xff0c;手动录入不仅费时&#xff0c;还容易出错。为解决这一问题推出了一款免费开源的OCR智能识别平台&#xff0c;通过先进的光学字符识别&#xff08;OCR&#xff09;技术&#xff0c;将…

RAG流程

目录 1. 前言2. 流程详解2.1 知识管理2.1.1 知识存储【未展开】2.1.2 知识加载(1) docx(2) pdf 2.2 切分2.2.1 固定长度分割2.2.2 自己写的固定分块方法 2.3 创建知识库的向量库2.4 检索2.5 模型部署和加载&#xff08;1&#xff09;api生成&#xff08;2&#xff09;Transform…

JeecgBoot入门

最近在了解低代码平台&#xff0c;其中关注到gitee上开源项目JeecgBoot&#xff0c;JeecgBoot官方也有比较完整的入门教学文档&#xff0c;这里我们将耕者官方教程学习&#xff0c;并将其记录下来。 一、项目简介 JeecgBoot 是一款基于代码生成器的低代码开发平台拥有零代码能力…

threejs开源实例-粒子地球

源码 three.js webgl - geometry - cube <script type"module">import * as THREE from "three";import { OrbitControls } from "three/addons/controls/OrbitControls.js";import { GUI } from "three/addons/libs/lil-gui.modul…

11.1 daimayuan 模拟赛总结

逆天 复盘 7:40 开题 扫了一眼四个题&#xff0c;T1 神秘构造&#xff0c;感觉和以前做过的某道题有点像啊&#xff0c;应该能做&#xff1b;T2 题意很简洁&#xff0c;感觉可做&#xff1b;T3&#xff0c;一眼感觉是什么优化 dp&#xff1b;T4&#xff0c;看上去像是拆期望…

2024年,Rust开发语言,现在怎么样了?

Rust开发语言有着一些其他语言明显的优势&#xff0c;但也充满着争议&#xff0c;难上手、学习陡峭等。 Rust 是由 Mozilla 主导开发的通用、编译型编程语言&#xff0c;2010年首次公开。 在 Stack Overflow 的年度开发者调查报告中&#xff0c;Rust 连续多年被评为“最受喜爱…