【Java设计模式】断路器模式:增强系统弹性

2024-08-30 12:28

本文主要是介绍【Java设计模式】断路器模式:增强系统弹性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 【Java设计模式】断路器模式:增强系统弹性
    • 一、概述
    • 二、断路器设计模式的别名
    • 三、断路器设计模式的意图
    • 四、断路器模式的详细解释及实际示例
    • 五、Java中断路器模式的编程示例
    • 六、何时在Java中使用断路器模式
    • 七、断路器模式在Java中的实际应用
    • 八、断路器模式的优点和权衡
    • 九、源码下载

【Java设计模式】断路器模式:增强系统弹性

一、概述

在Java设计中,断路器模式是一种确保微服务和分布式系统容错性和弹性的关键模式。本文将详细介绍断路器模式的意图、解释、编程示例、适用场景、实际应用、优点和权衡。同时,还将提供示例代码的下载链接,方便读者进行学习和实践。

二、断路器设计模式的别名

  • Fault Tolerance Switch(容错开关)

三、断路器设计模式的意图

断路器模式是一种重要的Java设计模式,有助于确保微服务和分布式系统的容错性和弹性。通过使用断路器,能够防止系统反复尝试执行可能失败的操作,使其从故障中恢复,并防止级联故障。

四、断路器模式的详细解释及实际示例

  1. 实际示例
    • 考虑一个电子商务网站的实际例子,该网站依赖多个外部支付网关来处理交易。如果其中一个支付网关变得无响应或缓慢,断路器模式可以用于检测故障并防止系统反复尝试使用有问题的网关。相反,它可以快速切换到替代支付网关或向用户显示错误消息,确保网站的其余部分保持功能正常和响应迅速。这样可以避免资源耗尽,并通过允许通过其他可用服务处理交易来提供更好的用户体验。通过这种方式,断路器模式处理外部API故障,确保系统保持功能正常。
  2. 通俗解释
    • 断路器允许优雅地处理失败的远程服务。当我们应用程序的所有部分高度解耦,并且一个组件的故障并不意味着其他部分将停止工作时,它特别有用。
  3. 维基百科解释
    • 断路器是现代软件开发中使用的一种设计模式。它用于检测故障并封装防止故障不断重复发生的逻辑,在维护、临时外部系统故障或意外系统困难期间。

五、Java中断路器模式的编程示例

这个Java示例展示了断路器模式如何管理远程服务故障并维护系统稳定性。
想象一个网络应用程序,它使用本地文件/图像和远程服务来获取数据。远程服务可能会变得缓慢或无响应,这可能会导致应用程序由于线程饥饿而挂起。断路器模式可以帮助检测到此类故障,并允许应用程序优雅地降级。

  1. 模拟延迟的远程服务
// DelayedRemoteService模拟一个在一定延迟后响应的远程服务。
var delayedService = new DelayedRemoteService(serverStartTime, 5);
  1. 设置断路器
// DefaultCircuitBreaker包装远程服务并监视故障。
var delayedServiceCircuitBreaker = new DefaultCircuitBreaker(delayedService, 3000, 2, 2000 * 1000 * 1000);
  1. 监控服务来处理请求
// MonitoringService负责调用远程服务。
var monitoringService = new MonitoringService(delayedServiceCircuitBreaker, quickServiceCircuitBreaker);
// 从本地资源获取响应
LOGGER.info(monitoringService.localResourceResponse());
// 从延迟服务获取响应2次,以达到故障阈值
LOGGER.info(monitoringService.delayedServiceResponse());
LOGGER.info(monitoringService.delayedServiceResponse());
  1. 处理断路器状态
// 在超过故障阈值限制后,获取延迟服务断路器的当前状态(此时应为OPEN)
LOGGER.info(delayedServiceCircuitBreaker.getState());
// 同时,延迟服务不可用,从健康的快速服务获取响应
LOGGER.info(monitoringService.quickServiceResponse());
LOGGER.info(quickServiceCircuitBreaker.getState());
  1. 从故障中恢复
// 等待延迟服务恢复响应
try {LOGGER.info("等待延迟服务恢复响应");Thread.sleep(5000);
} catch (InterruptedException e) {LOGGER.error("发生错误:", e);
}
// 检查延迟断路器的状态,应为HALF_OPEN
LOGGER.info(delayedServiceCircuitBreaker.getState());
// 从延迟服务获取响应,此时应已恢复健康
LOGGER.info(monitoringService.delayedServiceResponse());
// 由于获取到成功的响应,它应再次变为CLOSED。
LOGGER.info(delayedServiceCircuitBreaker.getState());
  1. 完整示例
public static void main(String[] args) {var serverStartTime = System.nanoTime();var delayedService = new DelayedRemoteService(serverStartTime, 5);var delayedServiceCircuitBreaker = new DefaultCircuitBreaker(delayedService, 3000, 2,2000 * 1000 * 1000);var quickService = new QuickRemoteService();var quickServiceCircuitBreaker = new DefaultCircuitBreaker(quickService, 3000, 2,2000 * 1000 * 1000);// 创建监控服务对象,该对象进行本地和远程调用var monitoringService = new MonitoringService(delayedServiceCircuitBreaker,quickServiceCircuitBreaker);// 从本地资源获取响应LOGGER.info(monitoringService.localResourceResponse());// 从延迟服务获取响应2次,以达到故障阈值LOGGER.info(monitoringService.delayedServiceResponse());LOGGER.info(monitoringService.delayedServiceResponse());// 在超过故障阈值限制后,获取延迟服务断路器的当前状态(此时应为OPEN)LOGGER.info(delayedServiceCircuitBreaker.getState());// 同时,延迟服务不可用,从健康的快速服务获取响应LOGGER.info(monitoringService.quickServiceResponse());LOGGER.info(quickServiceCircuitBreaker.getState());// 等待延迟服务恢复响应try {LOGGER.info("等待延迟服务恢复响应");Thread.sleep(5000);} catch (InterruptedException e) {LOGGER.error("发生错误:", e);}// 检查延迟断路器的状态,应为HALF_OPENLOGGER.info(delayedServiceCircuitBreaker.getState());// 从延迟服务获取响应,此时应已恢复健康LOGGER.info(monitoringService.delayedServiceResponse());// 由于获取到成功的响应,它应再次变为CLOSED。LOGGER.info(delayedServiceCircuitBreaker.getState());
}

示例总结:

  • 用参数timeoutfailureThresholdretryTimePeriod初始化断路器。
  • 开始处于closed状态。
  • 成功调用时,重置状态。
  • 失败超过阈值时,转换为open状态以防止进一步调用。
  • 在重试超时后,转换为half - open状态以测试服务。
  • half - open状态下成功时,转换回closed。失败时,返回open
    程序输出:
16:59:19.767 [main] INFO com.iluwatar.circuitbreaker.App -- 本地服务正在工作
16:59:19.769 [main] INFO com.iluwatar.circuitbreaker.App -- 延迟服务已关闭
16:59:19.769 [main] INFO com.iluwatar.circuitbreaker.App -- 延迟服务已关闭
16:59:19.769 [main] INFO com.iluwatar.circuitbreaker.App -- OPEN
16:59:19.769 [main] INFO com.iluwatar.circuitbreaker.App -- 快速服务正在工作
16:59:19.769 [main] INFO com.iluwatar.circuitbreaker.App -- CLOSED
16:59:19.769 [main] INFO com.iluwatar.circuitbreaker.App -- 等待延迟服务恢复响应
16:59:24.779 [main] INFO com.iluwatar.circuitbreaker.App -- HALF_OPEN
16:59:24.780 [main] INFO com.iluwatar.circuitbreaker.App -- 延迟服务正在工作
16:59:24.780 [main] INFO com.iluwatar.circuitbreaker.App -- CLOSED

这个示例展示了断路器模式如何通过管理远程服务故障来帮助维护应用程序的稳定性和弹性。

六、何时在Java中使用断路器模式

断路器模式适用于以下情况:

  1. 在分布式系统中,单个服务故障可能导致级联的系统范围故障。
  2. 对于与可能变得无响应或缓慢的第三方服务或数据库交互的应用程序。
  3. 在微服务架构中,一个服务的故障可能影响其他服务的可用性。

七、断路器模式在Java中的实际应用

  1. 云服务,用于优雅地处理外部服务的故障。
  2. 电子商务平台,用于管理高交易量和对外部API的依赖。
  3. 微服务架构,用于维护系统稳定性和响应能力。
  4. Spring Circuit Breaker模块
  5. Netflix Hystrix API

八、断路器模式的优点和权衡

优点:

  1. 防止系统执行可能失败的徒劳操作,从而节省资源。
  2. 有助于在部分系统故障期间维护应用程序的系统稳定性和性能。
  3. 通过避免用重复请求淹没故障服务,促进更快的系统恢复。

权衡:

  1. 系统的复杂性增加,因为该模式需要额外的逻辑来检测故障和管理断路器的状态。
  2. 如果配置不当,可能导致系统降级,因为合法请求可能会在电路打开时被阻止。
  3. 需要仔细调整阈值和超时周期,以在响应能力和保护之间取得平衡。

九、源码下载

断路器模式示例代码下载

通过本文的介绍,相信大家对Java中的断路器模式有了更深入的了解。在实际开发中,合理运用断路器模式可以提高系统的容错性和弹性,确保系统在面对故障时能够保持稳定运行。

这篇关于【Java设计模式】断路器模式:增强系统弹性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120816

相关文章

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

springboot报错Invalid bound statement (not found)的解决

《springboot报错Invalidboundstatement(notfound)的解决》本文主要介绍了springboot报错Invalidboundstatement(not... 目录一. 问题描述二.解决问题三. 添加配置项 四.其他的解决方案4.1 Mapper 接口与 XML 文件不匹配

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

JavaScript错误处理避坑指南

《JavaScript错误处理避坑指南》JavaScript错误处理是编程过程中不可避免的部分,它涉及到识别、捕获和响应代码运行时可能出现的问题,本文将详细给大家介绍一下JavaScript错误处理的... 目录一、错误类型:三大“杀手”与应对策略1. 语法错误(SyntaxError)2. 运行时错误(R

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二