Spring Boot 中的 Resilience4j 与 Circuit Breaker 最简指南

发布: (2025年12月31日 GMT+8 02:25)
3 min read
原文: Dev.to

Source: Dev.to

Spring Boot 中 Resilience4j 与断路器的简明指南

什么是断路器?

断路器模式的工作方式类似于住宅中的电路断路器。如果检测到故障,它会 打开 电路以防止进一步损害,并在问题解决后 关闭 电路。

断路器有三种主要状态:

  • Closed(闭合):一切正常,请求正常流转。
  • Open(打开):失败次数已超过阈值,阻止请求并执行回退。
  • Half‑Open(半开):一个试运行阶段,允许有限数量的请求以检查服务是否已恢复。

Resilience4j 配置

首先,创建一个 Spring Boot 项目并添加以下依赖:

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
</dependency>

application.yml 中,定义控制断路器行为的参数:

resilience4j:
  circuitbreaker:
    instances:
      mainService:
        registerHealthIndicator: true
        slidingWindowSize: 10
        permittedNumberOfCallsInHalfOpenState: 3
        slidingWindowType: COUNT_BASED
        minimumNumberOfCalls: 5
        waitDurationInOpenState: 10s
        failureRateThreshold: 50
        eventConsumerBufferSize: 10

参数说明

  • slidingWindowSize:断路器闭合时记录的调用次数。
  • failureRateThreshold:当失败率达到该百分比(例如 50%)时,断路器应打开。
  • waitDurationInOpenState:断路器保持 打开 状态的时长,之后尝试恢复。
  • permittedNumberOfCallsInHalfOpenState:在 半开 状态下成功调用的次数,足以再次关闭断路器。

使用注解实现

使用 Resilience4j 最简便的方式是添加 @CircuitBreaker 注解。指定在 YAML 中配置的实例名称以及回退方法。

注意: 回退方法必须与原方法具有相同的签名,并接受一个 Throwable(或 Exception)作为参数。

@Service
public class ProductService {

    @CircuitBreaker(name = "mainService", fallbackMethod = "fallbackGetProducts")
    public List<Product> getProducts() {
        // 可能会失败的逻辑(例如调用外部 API)
        return externalApi.fetchProducts();
    }

    // 回退方法
    public List<Product> fallbackGetProducts(Throwable e) {
        return List.of(new Product("Default Product", 0.0));
    }
}

其他 Resilience4j 模块

除了最为人熟知的断路器,Resilience4j 还提供了其他工具来提升系统的稳定性:

  • TimeLimiter – 为请求设置最大执行时间,超时即视为失败。
  • Retry – 在放弃之前,自动重试失败的操作,可配置重试次数。
  • Bulkhead – 限制对服务的并发调用数量,防止资源(如线程池)被耗尽。

结论

Resilience4j 是构建健壮微服务的强大工具。通过实现断路器模式,你可以确保应用在高压下能够优雅地失败,而不是彻底崩溃。

Back to Blog

相关文章

阅读更多 »

Spring Cloud Gateway:基础示例

Spring Cloud Gateway:基础示例的封面图片 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fd...