四川网站建设公司 登录,手机上哪个网站,aspcms网站地图模板,做相亲网站犯法吗微服务设计模式 - 断路器模式 (Circuit Breaker Pattern) 定义
断路器模式#xff08;Circuit Breaker Pattern#xff09;是云计算和微服务架构中的一种保护性设计模式#xff0c;其目的是避免系统中的调用链出现故障时#xff0c;导致系统瘫痪。通过断路器模式#xff…微服务设计模式 - 断路器模式 (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 相关依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-hystrix/artifactId
/dependency配置参数
在 application.properties 配置文件中设置 Hystrix 相关参数
# Hystrix command 默认执行超时时间单位毫秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds2000添加 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 )使得断路器模式的实现更加简单和高效。希望本文能帮助您更好地理解断路器模式及其在实际中的应用为系统设计和实现提供参考。