为加快推进数字化转型与智能化发展,近日,威海市水务集团通过“强基础、学经验、促提升”三步走,积极探索水务业务与前沿技术融合路径,持续深化“人工智能...
2025-10-30 0
在分布式系统中,我们经常听到服务熔断这个词,那么,什么是服务熔断?为什么需要服务熔断?如何实现服务熔断?这篇文章,我们来聊一聊。
简单来说,服务熔断(Circuit Breaker)是一种用于提高分布式系统健壮性的设计模式。它的灵感来源于电路中的熔断器,当电路中出现问题时,熔断器会自动断开,防止故障扩大,保护整个系统。应用在微服务架构中,服务熔断机制可以在某个服务出现故障或响应缓慢时,快速失败或采取备用方案,从而避免级联失败,提升系统的整体稳定性。
接下来,我们讲解服务熔断的原理,整体总结成下面 5个步骤。
在正常情况下,服务之间的调用是通畅的,熔断器处于关闭状态。所有请求都会正常发送到目标服务,没有任何干预。
熔断器会监控目标服务的调用情况,包括请求成功率、失败率、响应时间等。当某个阈值被超过(比如连续失败次数超过预设值),熔断器会认为目标服务可能出现了问题。
一旦检测到目标服务可能故障,熔断器会打开(Open),此时所有对该服务的请求都会被立即失败,不再发送实际请求。这就像是电路中的熔断器断开一样,防止故障蔓延。
过一段时间后,熔断器会进入半开启状态(Half-Open),允许少量请求尝试调用目标服务。如果这些请求成功,熔断器会重新关闭,恢复正常状态;如果失败,熔断器继续保持打开状态。
当熔断器打开时,可以采取备用方案,比如返回默认值、跳过某些操作,甚至切换到其他服务实例,以保证系统的部分功能仍然可用。
通过这样的机制,服务熔断能够有效地防止单个服务故障导致的系统级别的连锁反应。
为了更好地理解服务熔断,接下来,我们将使用 Resilience4j 这个轻量级的容错库来实现服务熔断机制。Resilience4j是一个专为 Java 8及以上版本设计的库,具有易用性和高性能的特点。
首先,确保你的项目中已经引入了Resilience4j的依赖。以Maven项目为例,添加以下依赖到pom.xml中:
<dependencies> <!-- Resilience4j核心依赖 --> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-all</artifactId> <version>2.0.2</version> </dependency> <!-- 其他依赖项 --></dependencies>下面是一个简单的示例,展示如何使用Resilience4j实现服务熔断。当目标服务响应慢或失败时,熔断器会起作用,快速返回备用结果。
import io.github.resilience4j.circuitbreaker.*;import io.github.resilience4j.decorators.Decorators;import java.time.Duration;import java.util.concurrent.*;import java.util.function.Supplier;publicclass CircuitBreakerDemo { public static void main(String[] args) { // 创建CircuitBreaker配置 CircuitBreakerConfig config = CircuitBreakerConfig.custom() .failureRateThreshold(50) // 失败率阈值 .waitDurationInOpenState(Duration.ofSeconds(5)) // 打开状态持续时间 .slidingWindowSize(4) // 滑动窗口大小 .build(); // 创建CircuitBreaker实例 CircuitBreaker circuitBreaker = CircuitBreaker.of("myCircuitBreaker", config); // 模拟目标服务调用 Supplier<String> decoratedSupplier = Decorators.ofSupplier(() -> callExternalService()) .withCircuitBreaker(circuitBreaker) .withFallback(Collections.singletonList(CircuitBreaker.class), throwable -> "默认响应") .decorate(); // 模拟多次调用 for (int i = 0; i < 10; i++) { try { String response = decoratedSupplier.get(); System.out.println("响应: " + response); } catch (Exception e) { System.out.println("调用失败: " + e.getMessage()); } // 等待1秒 try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } } } // 模拟外部服务调用,随机失败或延时 private static String callExternalService() { double random = Math.random(); if (random < 0.5) { // 模拟失败 thrownew RuntimeException("服务调用失败"); } else { // 模拟延时 try { Thread.sleep(2000); // 2秒延时 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } return"成功响应"; } }}运行这段代码,当失败率超过 50%时,熔断器会打开,后续的请求会立即返回“默认响应”。经过 5秒后,熔断器会进入半开启状态,尝试恢复调用。如果目标服务恢复正常,熔断器会重新关闭,系统恢复正常运行。
回到文章的标题:为什么有了服务降级还需要服务熔断?
这里我们总结了4个核心理由:
相关文章
为加快推进数字化转型与智能化发展,近日,威海市水务集团通过“强基础、学经验、促提升”三步走,积极探索水务业务与前沿技术融合路径,持续深化“人工智能...
2025-10-30 0
近期,多起充电宝因未通过3C认证引发安全事故,再次将公众视线聚焦于消费电子产品的安全问题。无独有偶,集成大量电气元器件、且面临复杂使用环境的LED显示...
2025-10-30 0
在分布式系统中,我们经常听到服务熔断这个词,那么,什么是服务熔断?为什么需要服务熔断?如何实现服务熔断?这篇文章,我们来聊一聊。1. 什么是服务熔断?...
2025-10-30 0
据 Thermaltake 泄露的产品安装指南证实,英特尔即将发布的 Core Ultra 400 系列“Nova Lake-S”处理器所用桌面插槽...
2025-10-30 0
今天来盘点下那些“买完就后悔”的东西,大数据和网友的血泪教训都在这了,帮你直接避坑!先说数码娱乐类:CD相机/拍立得:相纸一张五六块,比奶茶还贵!出门...
2025-10-30 0
近日,OPPO 发布了 Find X9系列新机,以“画质革命”为核心,全面升级了移动影像能力,致力于打造手机摄影的旗舰新标杆。OPPO Find X9...
2025-10-30 1
就在数个小时前,人类史上第一家市值破5万亿美元的公司正式诞生,而在半天前,其CEO黄仁勋才在GTC大会上向全世界做出该公司的业绩展望——它就是英伟达。...
2025-10-30 0
提起老年人消费,不少人脑子里会立刻蹦出“精打细算”“只买必需品”的印象,仿佛他们的钱包永远为柴米油盐紧锁,与“氪金”“颜值消费”这类词绝缘。但现实早就...
2025-10-30 0
发表评论