📘 背景介绍
在微服务架构下,系统的稳定性面临诸多挑战,比如:调用链太长、接口雪崩、上游挂掉影响全局、瞬时流量打满线程池等。
为解决这些问题,Resilience4j 提供了轻量、响应式、无侵入的容错框架,适用于 Spring Boot 2/3,替代 Hystrix 的绝佳选项。
🔌 快速集成
xml
xml
复制编辑
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot3</artifactId>
</dependency>
yaml
yaml
复制编辑
spring:
application:
name: demo-app
resilience4j:
circuitbreaker:
instances:
backendA:
slidingWindowSize: 10
failureRateThreshold: 50
ratelimiter:
instances:
backendA:
limitForPeriod: 10
limitRefreshPeriod: 1s
🔁 1. 熔断器(CircuitBreaker)
📌 核心作用
在接口连续失败达到阈值后,短路请求,避免无效资源消耗。适用于:
- 上游不稳定或不可用
- 防止雪崩、连锁失败
⚙️ 状态机图
objectivec
text
复制编辑
CLOSED → OPEN → HALF-OPEN → CLOSED
🧪 使用示例
typescript
java
复制编辑
@CircuitBreaker(name = "backendA", fallbackMethod = "fallback")
public String callService() {
return restTemplate.getForObject("http://service/api", String.class);
}
public String fallback(Throwable t) {
return "服务暂不可用,请稍后再试";
}
🛠 配置参数说明
参数名 | 含义 |
---|---|
failureRateThreshold |
失败率阈值 |
slidingWindowSize |
统计窗口大小 |
waitDurationInOpenState |
打开状态等待时间 |
🚥 2. 限流器(RateLimiter)
📌 场景说明
避免某个服务/接口被频繁访问,导致资源耗尽。适用于:
- 公共接口
- 高并发接口防刷
⚙️ 示例配置
yaml
yaml
复制编辑
resilience4j:
ratelimiter:
instances:
backendA:
limitForPeriod: 5
limitRefreshPeriod: 1s
🧪 使用示例
typescript
java
复制编辑
@RateLimiter(name = "backendA", fallbackMethod = "rateLimitFallback")
public String query() {
return restTemplate.getForObject("http://service/api", String.class);
}
public String rateLimitFallback(RequestNotPermitted ex) {
return "被限流了,请稍后重试";
}
🧵 3. 隔离策略(ThreadPoolBulkhead)
📌 场景说明
防止阻塞型接口拖垮整个应用。通过线程池隔离,不同服务隔离资源。
🧪 示例代码
typescript
java
复制编辑
@Bulkhead(name = "backendA", type = Bulkhead.Type.THREADPOOL, fallbackMethod = "fallback")
public CompletableFuture<String> isolatedCall() {
return CompletableFuture.supplyAsync(() ->
restTemplate.getForObject("http://service/api", String.class));
}
🛠 配置参数
yaml
yaml
复制编辑
resilience4j:
thread-pool-bulkhead:
instances:
backendA:
maxThreadPoolSize: 4
coreThreadPoolSize: 2
queueCapacity: 10
⛱ 4. 降级方案(Fallback)
📌 实用技巧
结合熔断/限流/隔离统一 fallback 处理
typescript
java
复制编辑
public String fallback(Throwable ex) {
if (ex instanceof CallNotPermittedException) {
return "熔断触发,暂不可用";
} else if (ex instanceof RequestNotPermitted) {
return "限流中,请稍后";
} else {
return "系统繁忙,请稍后再试";
}
}
📊 监控整合(Actuator + Prometheus)
yaml
yaml
复制编辑
management:
endpoints:
web:
exposure:
include: resilience4j.*
访问:
bash
bash
复制编辑
http://localhost:8080/actuator/resilience4j.circuitbreakers
http://localhost:8080/actuator/metrics
配合 Micrometer 可接入 Prometheus / Grafana 实时看熔断状态。
✅ 总结对比
模块 | 作用 | 典型场景 |
---|---|---|
熔断器 | 快速失败,避免雪崩 | 上游服务不稳定 |
限流器 | 限制访问频率 | 防刷、保护资源 |
隔离策略 | 线程池隔离,避免拖垮线程 | 调用慢接口、阻塞接口 |
降级 | 用户友好提示 | 灾难恢复场景 |