Resilience4j:熔断/限流/重试/隔离的配置与使用
服务间调用一旦遇到下游变慢或故障,就可能拖垮上游。Resilience4j 是轻量级容错库,提供熔断、限流、重试、舱壁(隔离)与限时能力,是 Spring Cloud CircuitBreaker 抽象层的推荐实现之一(原 Hystrix 已停止演进)。本系列版本锚点同第 01 章:Spring Boot 3.5.x + Spring Cloud 2025.0.x + spring-cloud-alibaba 2025.0.0.x,具体以官方文档为准。
引入依赖
Spring Boot 3 用 resilience4j-spring-boot3 模块(Boot 2.x 对应 resilience4j-spring-boot2);若走 Spring Cloud CircuitBreaker 统一封装,则引入 spring-cloud-starter-circuitbreaker-resilience4j。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
熔断:CircuitBreaker
熔断器状态机为 关闭(CLOSED) -> 打开(OPEN) -> 半开(HALF_OPEN)。滑动窗口分为 COUNT_BASED(按最近 N 次调用)与 TIME_BASED(按最近时间段)。
resilience4j:
circuitbreaker:
instances:
stockService: # 实例名与注解 name 对应
sliding-window-type: COUNT_BASED
sliding-window-size: 10
minimum-number-of-calls: 5 # 最少统计次数,避免冷启动误判
failure-rate-threshold: 50 # 失败率超过 50% 打开熔断
wait-duration-in-open-state: 10s
permitted-number-of-calls-in-half-open-state: 3
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
@CircuitBreaker(name = "stockService", fallbackMethod = "stockFallback")
public StockDTO deduct(StockReqDTO req) {
return stockFeignClient.deduct(req);
}
// 降级方法:参数与原方法一致,可追加 Throwable 接收异常
private StockDTO stockFallback(StockReqDTO req, Throwable t) {
log.warn("扣减库存失败,进入降级", t);
return StockDTO.fail("库存服务暂不可用");
}
限流:RateLimiter
令牌桶思路:每个刷新周期放行固定数量的请求,超出后等待或直接拒绝。
resilience4j:
ratelimiter:
instances:
payService:
limit-refresh-period: 1s # 令牌刷新周期
limit-for-period: 20 # 每周期放行 20 个
timeout-duration: 500ms # 等待令牌超时
@RateLimiter(name = "payService", fallbackMethod = "payFallback")
public void pay(PayReqDTO req) { /* 支付逻辑 */ }
重试与舱壁:Retry / Bulkhead
resilience4j:
retry:
instances:
stockService:
max-attempts: 3 # 总尝试 3 次
wait-duration: 500ms
bulkhead:
instances:
stockService:
max-concurrent-calls: 20 # 信号量舱壁:最多 20 并发
max-wait-duration: 10ms # 排队等待上限
@Retry(name = "stockService", fallbackMethod = "stockFallback")
public StockDTO queryStock(String skuId) { /* 查询逻辑 */ }
要点:重试只适合“临时性失败”(超时、5xx),对业务性异常(参数错误、幂等冲突)不要重试,可用 ignoreExceptions 排除。Bulkhead 提供信号量(默认)与线程池两种舱壁,防止慢调用占满线程;@TimeLimiter 用于异步调用超时控制。
组合使用顺序
熔断、限流、重试可叠加在同一方法上,顺序可由各模块配置调整。常见组合是“重试套在熔断外”或“熔断包住重试”,需结合业务判断;组合顺序的具体配置方式以官方文档为准。
小结
Resilience4j 以“实例配置 + 注解/函数式 API”两种方式工作,默认值(如 failureRateThreshold=50、waitDurationInOpenState=60s)可全部覆盖。实践中先明确每个下游依赖的故障形态,再决定用熔断、重试还是限流,避免“全部注解一把梭”。