1. 概述

本文将带你快速掌握 Spring Cloud Circuit Breaker 的核心用法,帮助你在微服务架构中实现更稳定的容错机制。

我们会先了解 Spring Cloud Circuit Breaker 提供了哪些优势,再通过 Spring Boot 的自动配置机制,轻松集成主流的熔断器实现。

✅ 提示:如果你还不熟悉“熔断器”(Circuit Breaker)的基本概念,建议先阅读《Hystrix 入门》或《Resilience4j 使用指南》打个基础。

2. Spring Cloud Circuit Breaker 简介

在早期 Spring Cloud 生态中,熔断功能主要依赖 Netflix Hystrix,通过 @EnableCircuitBreaker@HystrixCommand 注解实现。但这种方式存在一个致命问题:与 Hystrix 强耦合

这意味着一旦你想换成 Resilience4j 或 Sentinel,就得重写大量业务代码,非常不灵活。

Spring Cloud Circuit Breaker 就是为解决这个问题而生的:

✅ 它提供了一套统一的抽象层,屏蔽了底层不同熔断框架的差异
✅ 支持插件化扩展,可自由切换实现(Resilience4j、Hystrix、Sentinel 等)
✅ 编码面向接口,无需关心具体实现

⚠️ 本文以 Resilience4j 为例,但所讲方法同样适用于其他实现。

3. 自动配置机制

要使用某个熔断器实现,只需引入对应的 Spring Boot Starter 即可。Spring 会自动完成 Bean 注册和配置。

引入 Resilience4j Starter

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
    <version>1.0.2.RELEASE</version>
</dependency>

只要这个依赖在 classpath 中,Spring Boot 就会自动配置好 CircuitBreakerFactory 等必要组件。

关闭自动配置(可选)

如果你只想手动控制,可以通过配置禁用:

spring.cloud.circuitbreaker.resilience4j.enabled=false

4. 简单熔断示例

我们来构建一个简单的 Spring Boot Web 应用,调用外部 API 获取专辑列表,并为其加上熔断保护。

目标接口:
https://jsonplaceholder.typicode.com/albums

4.1 创建熔断器实例

首先注入 CircuitBreakerFactory,它是创建熔断器的核心工厂:

@Service
public class AlbumService {
    
    @Autowired
    private CircuitBreakerFactory circuitBreakerFactory;

    // ...
}

通过 create() 方法即可创建一个指定 ID 的熔断器:

CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");

✅ ID 建议按业务命名,便于监控和排查问题,比如 order-service-cb

4.2 使用熔断器包装任务

使用 run() 方法包裹可能失败的操作,传入 Supplier 函数式接口:

public String getAlbumList() {
    CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
    String url = "https://jsonplaceholder.typicode.com/albums";

    return circuitBreaker.run(() -> restTemplate.getForObject(url, String.class));
}

这样,当请求超时或异常时,熔断器会自动处理,避免雪崩。

添加降级逻辑(Fallback)

更常见的是提供一个降级方案,当调用失败时返回兜底数据:

public String getAlbumList() {
    CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
    String url = "http://localhost:1234/not-real"; // 模拟不可用服务
    
    return circuitBreaker.run(
        () -> restTemplate.getForObject(url, String.class),
        throwable -> getDefaultAlbumList() // 降级方法
    );
}

⚠️ 注意:

  • 降级方法接收 Throwable 参数,可根据异常类型返回不同结果
  • 如果不提供 fallback 且调用失败,会抛出 NoFallbackAvailableException

4.3 编写控制器接口

最后暴露一个 REST 接口供测试:

@RestController
public class AlbumController {

    @Autowired
    private AlbumService albumService;

    @GetMapping("/albums")
    public String albums() {
        return albumService.getAlbumList();
    }
}

启动应用后访问:
[GET] http://localhost:8080/albums

5. 全局自定义配置

默认配置往往不够用。我们可以通过定义 Customizer<CircuitBreakerFactory> Bean 来统一设置所有熔断器的行为。

定义通用配置

@Configuration
public class Resilience4JConfiguration {

    @Bean
    public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {
        CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
            .failureRateThreshold(50)  // 失败率阈值 50%
            .waitDurationInOpenState(Duration.ofMillis(1000)) // 熔断后等待 1 秒
            .slidingWindowSize(2)      // 滑动窗口大小为 2
            .build();

        TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
            .timeoutDuration(Duration.ofSeconds(4)) // 超时 4 秒
            .build();

        return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
            .timeLimiterConfig(timeLimiterConfig)
            .circuitBreakerConfig(circuitBreakerConfig)
            .build());
    }
}

configureDefault() 会作用于所有未单独配置的熔断器,适合统一规范。

6. 针对性自定义配置

有时不同接口对稳定性要求不同,需要差异化配置。

为特定熔断器设置配置

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> specificCustomConfiguration1() {
    CircuitBreakerConfig config = CircuitBreakerConfig.custom()
        .failureRateThreshold(20)  // 更敏感
        .waitDurationInOpenState(Duration.ofMillis(500))
        .slidingWindowSize(5)
        .build();

    TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
        .timeoutDuration(Duration.ofSeconds(2))
        .build();

    return factory -> factory.configure(builder -> builder
        .circuitBreakerConfig(config)
        .timeLimiterConfig(timeLimiterConfig)
        .build(), 
        "critical-service-cb" // 只对这个 ID 生效
    );
}

批量配置多个熔断器

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> specificCustomConfiguration2() {
    // ... 同上 config 定义

    return factory -> factory.configure(builder -> builder
        .circuitBreakerConfig(config)
        .timeLimiterConfig(timeLimiterConfig)
        .build(), 
        "order-cb", "payment-cb", "inventory-cb" // 多个 ID
    );
}

✅ 这种方式适合将一组相关服务配置成相同策略,避免重复定义。

7. 其他可选实现

Spring Cloud Circuit Breaker 支持多种后端实现,你可以根据团队技术栈选择:

  • Hystrix:老牌方案,Netflix 已停止维护,但仍有不少存量系统在用
  • Sentinel:阿里开源,强项在于流量控制和系统自适应保护
  • Spring Retry:轻量级重试机制,严格来说不算完整熔断器

✅ 最关键的一点:你可以在同一个项目中混合使用多种实现
比如订单服务用 Resilience4j,支付服务用 Sentinel,完全没问题。

📌 补充:Resilience4j 本身还提供了 RateLimiter(限流)、Bulkhead(舱壁隔离)、Retry(重试)等模块,功能比 Spring Cloud Circuit Breaker 暴露的更丰富。如需高级功能,可直接使用原生 API。

8. 总结

Spring Cloud Circuit Breaker 是微服务容错设计的标准解法,它通过抽象层解耦了业务代码与具体实现,极大提升了系统的可维护性和灵活性。

核心要点回顾:

  • ✅ 使用 Starter 自动装配,开箱即用
  • ✅ 通过 CircuitBreakerFactory 创建熔断器实例
  • run() 方法支持主逻辑 + fallback 降级
  • ✅ 支持全局和局部两种自定义配置方式
  • ✅ 可自由切换或共存多种底层实现

💡 源码已托管至 GitHub:https://github.com/baeldung/spring-cloud-tutorials
分支路径:spring-cloud-modules/spring-cloud-circuit-breaker


原始标题:Quick Guide to Spring Cloud Circuit Breaker | Baeldung