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