Resilience4j简介 #

一、Resilience4j概述 #

1.1 什么是Resilience4j #

Resilience4j是一个轻量级的容错库,专为函数式编程设计,是Hystrix的替代方案。

text
┌─────────────────────────────────────────────────────────────┐
│                    Resilience4j核心模块                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────┐  ┌─────────────┐  ┌─────────────┐        │
│   │ Circuit     │  │ Rate        │  │ Retry       │        │
│   │ Breaker     │  │ Limiter     │  │             │        │
│   │ 熔断器       │  │ 限流器       │  │ 重试        │        │
│   └─────────────┘  └─────────────┘  └─────────────┘        │
│                                                             │
│   ┌─────────────┐  ┌─────────────┐  ┌─────────────┐        │
│   │ Bulkhead    │  │ Cache       │  │ Timelimiter │        │
│   │ 舱壁隔离     │  │ 缓存        │  │ 超时限制     │        │
│   └─────────────┘  └─────────────┘  └─────────────┘        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 Resilience4j vs Hystrix #

特性 Resilience4j Hystrix
维护状态 活跃 停止维护
编程模型 函数式 命令模式
依赖 轻量 重量
响应式 支持 不支持
配置方式 代码+配置 配置

1.3 核心模块 #

模块 说明
CircuitBreaker 熔断器,防止级联故障
RateLimiter 限流器,限制请求速率
Retry 重试,自动重试失败请求
Bulkhead 舱壁隔离,限制并发
Cache 缓存,缓存请求结果
Timelimiter 超时限制,限制请求时间

二、快速开始 #

2.1 添加依赖 #

xml
<dependencies>
    <!-- Resilience4j Core -->
    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-circuitbreaker</artifactId>
    </dependency>
    
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-spring-boot3</artifactId>
    </dependency>
    
    <!-- AOP Support -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

2.2 配置文件 #

yaml
resilience4j:
  circuitbreaker:
    configs:
      default:
        slidingWindowSize: 10
        failureRateThreshold: 50
        waitDurationInOpenState: 10s
        permittedNumberOfCallsInHalfOpenState: 3
    instances:
      userService:
        baseConfig: default

2.3 使用注解 #

java
@Service
public class UserService {

    @CircuitBreaker(name = "userService", fallbackMethod = "getUserFallback")
    public User getUser(Long id) {
        return userClient.getUserById(id);
    }

    public User getUserFallback(Long id, Exception e) {
        User user = new User();
        user.setId(id);
        user.setName("默认用户");
        return user;
    }
}

三、核心概念 #

3.1 熔断器状态 #

text
        ┌─────────────────────────────────────────┐
        │            熔断器状态机                  │
        └─────────────────────────────────────────┘
        
        ┌─────────┐    失败率<阈值    ┌─────────┐
        │  关闭   │ ◄────────────────│  半开   │
        │ CLOSED  │                  │HALF_OPEN│
        └────┬────┘                  └────┬────┘
             │                            │
             │ 失败率>阈值                 │ 成功
             │                            │
             ▼                            │
        ┌─────────┐    超时后尝试    ──────┘
        │  打开   │ ─────────────────►
        │  OPEN   │
        └─────────┘

3.2 滑动窗口 #

类型 说明
基于计数 固定数量的请求窗口
基于时间 固定时间段的窗口

3.3 核心指标 #

指标 说明
failureRateThreshold 失败率阈值
slowCallRateThreshold 慢调用率阈值
slowCallDurationThreshold 慢调用时间阈值
slidingWindowSize 滑动窗口大小
minimumNumberOfCalls 最小调用次数

四、配置详解 #

4.1 熔断器配置 #

yaml
resilience4j:
  circuitbreaker:
    configs:
      default:
        slidingWindowType: COUNT_BASED
        slidingWindowSize: 10
        failureRateThreshold: 50
        slowCallDurationThreshold: 2s
        slowCallRateThreshold: 50
        permittedNumberOfCallsInHalfOpenState: 3
        waitDurationInOpenState: 10s
        minimumNumberOfCalls: 5
        automaticTransitionFromOpenToHalfOpenEnabled: true
    instances:
      userService:
        baseConfig: default
        failureRateThreshold: 60

4.2 配置项说明 #

配置项 默认值 说明
slidingWindowType COUNT_BASED 滑动窗口类型
slidingWindowSize 100 滑动窗口大小
failureRateThreshold 50 失败率阈值(%)
slowCallDurationThreshold 60s 慢调用时间阈值
slowCallRateThreshold 100 慢调用率阈值(%)
waitDurationInOpenState 60s 打开状态等待时间
permittedNumberOfCallsInHalfOpenState 10 半开状态允许调用数
minimumNumberOfCalls 100 最小调用次数

五、编程式使用 #

5.1 创建熔断器 #

java
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
    .failureRateThreshold(50)
    .waitDurationInOpenState(Duration.ofSeconds(10))
    .slidingWindowSize(10)
    .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
    .minimumNumberOfCalls(5)
    .build();

CircuitBreaker circuitBreaker = CircuitBreaker.of("userService", config);

5.2 使用熔断器 #

java
Supplier<User> supplier = CircuitBreaker.decorateSupplier(
    circuitBreaker, 
    () -> userClient.getUserById(id)
);

Try<User> result = Try.ofSupplier(supplier);

5.3 获取状态 #

java
CircuitBreaker.Metrics metrics = circuitBreaker.getMetrics();

float failureRate = metrics.getFailureRate();
int numberOfCalls = metrics.getNumberOfCalls();
int numberOfFailedCalls = metrics.getNumberOfFailedCalls();
int numberOfSuccessfulCalls = metrics.getNumberOfSuccessfulCalls();

六、事件监听 #

6.1 注册事件监听器 #

java
circuitBreaker.getEventPublisher()
    .onSuccess(event -> log.info("Success: {}", event))
    .onError(event -> log.error("Error: {}", event))
    .onStateTransition(event -> log.info("State: {}", event))
    .onCallNotPermitted(event -> log.warn("Call not permitted: {}", event));

6.2 事件类型 #

事件 说明
onSuccessEvent 成功事件
onErrorEvent 失败事件
onStateTransitionEvent 状态转换事件
onCallNotPermittedEvent 调用被拒绝事件
onIgnoredErrorEvent 忽略错误事件

七、最佳实践 #

7.1 合理配置阈值 #

yaml
resilience4j:
  circuitbreaker:
    configs:
      default:
        failureRateThreshold: 50
        slowCallRateThreshold: 50
        minimumNumberOfCalls: 10
        waitDurationInOpenState: 30s

7.2 注意事项 #

注意点 说明
阈值设置 根据服务特点设置
降级方法 提供合理的降级响应
监控告警 配置熔断事件告警
日志记录 记录熔断事件日志

八、总结 #

8.1 核心要点 #

要点 说明
轻量级 依赖少,性能好
函数式 支持函数式编程
模块化 各模块独立使用
注解支持 简化使用方式

8.2 下一步 #

现在你已经了解了Resilience4j的基本概念,接下来让我们学习 熔断器,深入了解熔断器的使用!

最后更新:2026-03-28