SpringCloud面试题 - 什么是熔断器?为什么需要熔断器?


1. 熔断器概述

熔断器(Circuit Breaker)是一种软件设计模式,用于防止分布式系统中的级联故障。它借鉴了电气工程中的熔断器概念 - 当电路中出现过载时,熔断器会自动切断电路以保护整个系统。

在软件架构中,熔断器监控服务间的调用情况。当失败率达到阈值时,熔断器会"跳闸",后续调用将直接失败而不会真正执行目标服务,从而避免系统资源被耗尽。

正常请求
响应成功
失败率过高
快速失败
客户端
服务端
熔断器打开

2. 为什么需要熔断器?

2.1 防止级联故障

在微服务架构中,服务之间相互依赖。当一个服务出现故障或高延迟时,可能导致调用它的服务也出现故障,这种故障会像多米诺骨牌一样蔓延到整个系统。

2.2 快速失败

熔断器模式允许系统快速失败而不是等待超时,这样可以减少资源浪费并提高系统响应速度。

2.3 自我修复

熔断器不是永久切断服务,而是会定期尝试恢复,检查被调用的服务是否已恢复正常。

失败次数达到阈值
经过恢复时间
请求成功
请求失败
Closed
Open
HalfOpen

3. 熔断器状态机

熔断器通常有三种状态:

  1. Closed(闭合):正常状态,请求可以自由通过
  2. Open(打开):熔断状态,所有请求被拒绝
  3. 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. 熔断器与其他模式的结合

熔断器通常与以下模式结合使用:

客户端
熔断器
重试机制
限流器
服务端
  1. 重试机制:对于临时性故障,可以自动重试
  2. 限流器:控制请求速率,防止突发流量
  3. 超时控制:避免长时间等待无响应的服务

7. 总结

熔断器是构建弹性分布式系统的关键组件,它能够:

  • 防止故障扩散
  • 提供快速失败机制
  • 自动检测服务恢复
  • 保护系统资源不被耗尽

在现代微服务架构中,合理使用熔断器可以显著提高系统的稳定性和可用性。

更多推荐