什么是Resilience4j?
Resilience4j是一个轻量级的容错库,专为Java 8和函数式编程设计。它借鉴了Netflix Hystrix的设计理念,但更加轻量且专注于Java 8的函数式编程风格。Resilience4j提供了多种容错机制,帮助开发者构建弹性强健的分布式系统。
为什么需要Resilience4j?
在现代分布式系统中,服务间调用频繁,网络不稳定、服务暂时不可用、响应延迟等问题时有发生。
这些问题可能导致:
- 级联故障(一个服务的失败引发整个系统的崩溃)
- 资源耗尽(如线程池被阻塞请求占满)
- 用户体验下降
Resilience4j通过提供多种容错模式,帮助系统优雅地处理这些问题,提高系统的弹性和可用性。
Resilience4j的核心模块
Resilience4j由以下几个主要模块组成:
- Circuit Breaker(断路器):当故障达到阈值时自动切断请求,防止级联故障
- Rate Limiter(限流器):限制某些操作的执行频率
- Bulkhead(舱壁隔离):限制并发执行的数量,防止资源耗尽
- Retry(重试):对失败操作自动重试
- Time Limiter(时间限制):设置操作执行的超时时间
- Cache(缓存):对方法调用结果进行缓存
Resilience4j与Spring Cloud Gateway
1. 添加必要依赖
<!-- Resilience4j 核心依赖 -->
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version>
</dependency>
<!-- 与Spring Cloud CircuitBreaker集成 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
<!-- 指标监控(可选) -->
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-micrometer</artifactId>
<version>1.7.1</version>
</dependency>
2. 基础配置
在application.yml中配置Resilience4j:
resilience4j:
circuitbreaker:
instances:
backendService:
registerHealthIndicator: true
failureRateThreshold: 50
minimumNumberOfCalls: 10
slidingWindowSize: 10
waitDurationInOpenState: 5s
permittedNumberOfCallsInHalfOpenState: 3
automaticTransitionFromOpenToHalfOpenEnabled: true
slidingWindowType: COUNT_BASED
recordExceptions:
- org.springframework.web.reactive.function.client.WebClientResponseException
- java.io.IOException
- java.util.concurrent.TimeoutException
- org.springframework.cloud.gateway.support.TimeoutException
3. 自定义全局过滤器
@Configuration
public class Resilience4jGatewayFilterFactory extends AbstractGatewayFilterFactory<Resilience4jGatewayFilterFactory.Config> {
private final CircuitBreakerRegistry circuitBreakerRegistry;
private final ReactiveCircuitBreakerFactory reactiveCircuitBreakerFactory;
public Resilience4jGatewayFilterFactory(CircuitBreakerRegistry circuitBreakerRegistry,
ReactiveCircuitBreakerFactory reactiveCircuitBreakerFactory) {
super(Config.class);
this.circuitBreakerRegistry = circuitBreakerRegistry;
this.reactiveCircuitBreakerFactory = reactiveCircuitBreakerFactory;
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
String circuitBreakerName = config.getName();
ReactiveCircuitBreaker circuitBreaker = reactiveCircuitBreakerFactory.create(circuitBreakerName);
return circuitBreaker.run(
chain.filter(exchange),
throwable -> {
// 自定义fallback处理
if (throwable instanceof TimeoutException) {
exchange.getResponse().setStatusCode(HttpStatus.GATEWAY_TIMEOUT);
} else {
exchange.getResponse().setStatusCode(HttpStatus.SERVICE_UNAVAILABLE);
}
return exchange.getResponse().setComplete();
}
);
};
}
public static class Config {
private String name;
// 其他配置属性
// getters and setters
}
}
4. 路由配置中使用
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- name: Resilience4j
args:
name: userServiceCircuitBreaker
- name: Retry
args:
retries: 3
series: SERVER_ERROR
methods: GET
exceptions:
- java.io.IOException
- org.springframework.cloud.gateway.support.TimeoutException