Java面试必备:什么是熔断器?为什么需要熔断器?
·
SpringCloud面试题 - 什么是熔断器?为什么需要熔断器?
1. 熔断器概述
熔断器(Circuit Breaker)是一种软件设计模式,用于防止分布式系统中的级联故障。它借鉴了电气工程中的熔断器概念 - 当电路中出现过载时,熔断器会自动切断电路以保护整个系统。
在软件架构中,熔断器监控服务间的调用情况。当失败率达到阈值时,熔断器会"跳闸",后续调用将直接失败而不会真正执行目标服务,从而避免系统资源被耗尽。
2. 为什么需要熔断器?
2.1 防止级联故障
在微服务架构中,服务之间相互依赖。当一个服务出现故障或高延迟时,可能导致调用它的服务也出现故障,这种故障会像多米诺骨牌一样蔓延到整个系统。
2.2 快速失败
熔断器模式允许系统快速失败而不是等待超时,这样可以减少资源浪费并提高系统响应速度。
2.3 自我修复
熔断器不是永久切断服务,而是会定期尝试恢复,检查被调用的服务是否已恢复正常。
3. 熔断器状态机
熔断器通常有三种状态:
- Closed(闭合):正常状态,请求可以自由通过
- Open(打开):熔断状态,所有请求被拒绝
- Half-Open(半开):尝试恢复状态,允许有限数量的请求通过
4. Java代码示例
以下是使用Resilience4j实现熔断器的Java示例:
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import java.time.Duration;
import java.util.function.Supplier;
public class CircuitBreakerExample {
public static void main(String[] args) {
// 1. 创建熔断器配置
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50) // 失败率阈值50%
.waitDurationInOpenState(Duration.ofMillis(1000)) // 打开状态等待1秒
.ringBufferSizeInHalfOpenState(2) // 半开状态下的缓冲区大小
.ringBufferSizeInClosedState(2) // 闭合状态下的缓冲区大小
.build();
// 2. 创建熔断器注册表
CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);
// 3. 获取或创建熔断器实例
CircuitBreaker circuitBreaker = registry.circuitBreaker("myService");
// 4. 使用熔断器保护服务调用
Supplier<String> decoratedSupplier = CircuitBreaker
.decorateSupplier(circuitBreaker, CircuitBreakerExample::unreliableService);
// 5. 模拟多次调用
for (int i = 0; i < 10; i++) {
try {
String result = decoratedSupplier.get();
System.out.println("调用成功: " + result);
} catch (Exception e) {
System.out.println("调用失败: " + e.getMessage());
}
}
}
// 模拟不可靠的服务(50%失败率)
private static String unreliableService() {
if (Math.random() > 0.5) {
return "Success";
} else {
throw new RuntimeException("服务暂时不可用");
}
}
}
5. 熔断器参数配置
常见的熔断器配置参数包括:
| 参数 | 说明 | 默认值(Resilience4j) |
|---|---|---|
| failureRateThreshold | 失败率阈值 | 50% |
| waitDurationInOpenState | 打开状态持续时间 | 60秒 |
| ringBufferSizeInHalfOpenState | 半开状态下的缓冲区大小 | 10 |
| ringBufferSizeInClosedState | 闭合状态下的缓冲区大小 | 100 |
| recordExceptions | 记录为失败的异常类型 | 所有异常 |
6. 熔断器与其他模式的结合
熔断器通常与以下模式结合使用:
- 重试机制:对于临时性故障,可以自动重试
- 限流器:控制请求速率,防止突发流量
- 超时控制:避免长时间等待无响应的服务
7. 总结
熔断器是构建弹性分布式系统的关键组件,它能够:
- 防止故障扩散
- 提供快速失败机制
- 自动检测服务恢复
- 保护系统资源不被耗尽
在现代微服务架构中,合理使用熔断器可以显著提高系统的稳定性和可用性。
更多推荐



所有评论(0)