Resilience4j 介绍
Resilience4j 是 Spring Cloud Greenwich 版推荐的容错解决方案,相比 Hystrix , Resilience4j 专为 java8 以及函数式编程而设计。
Resilience4j 主要提供了如下功能:
- 断路器
- 限流
- 基于信号量的隔离
- 缓存
- 限时
- 请求重试
Resilience4j 的基本用法
首先,新建一个普通的 maven 工程:
添加单元测试的依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
断路器
Resilience4j 提供了很多功能,不同的功能对应不同的依赖,可以按需添加。
使用断路器,首先添加断路器的依赖:
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-circuitbreaker</artifactId>
<version>0.13.2</version>
</dependency>
一个正常执行的例子:
public class Resilience4jTest {
@Test
public void test1(){
// 获取一个 CircuitBreakerRegistry 实例
// 可以调用 ofDefaults 获取一个 CircuitBreakerRegistry 实例
// 也可以自定义属性
CircuitBreakerRegistry registry = CircuitBreakerRegistry.ofDefaults();
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
// 故障率阈值百分比,超过这个阈值,断路器就会打开
.failureRateThreshold(50)
// 断路器保持打开的时间,在到达设置的时间之后,断路器会进入到 half open 状态
.waitDurationInOpenState(Duration.ofMillis(1000))
// 当断路器处于 half open 状态时,环形缓冲区的大小
.ringBufferSizeInHalfOpenState(2)
.ringBufferSizeInClosedState(2)
.build();
CircuitBreakerRegistry registry1 = CircuitBreakerRegistry.of(config);
CircuitBreaker circuitBreaker1 = registry1.circuitBreaker("you");
CircuitBreaker circuitBreaker2 = registry1.circuitBreaker("you2", config);
CheckedFunction0<String> supplier = CircuitBreaker.decorateCheckedSupplier(circuitBreaker1, () -> "Hello resilience4j");
Try<String> result = Try.of(supplier)
.map(v -> v + " hello world");
System.out.println(result.isSuccess());
System.out.println(result.get());
}
}
运行结果如下:
true
Hello resilience4j hello world
Process finished with exit code 0
一个出异常的断路器:
@Test
public void test2(){
// 获取一个 CircuitBreakerRegistry 实例
// 可以调用 ofDefaults 获取一个 CircuitBreakerRegistry 实例
// 也可以自定义属性
CircuitBreakerRegistry registry = CircuitBreakerRegistry.ofDefaults();
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
// 故障率阈值百分比,超过这个阈值,断路器就会打开
.failureRateThreshold(50)
// 断路器保持打开的时间,在到达设置的时间之后,断路器会进入到 half open 状态
.waitDurationInOpenState(Duration.ofMillis(1000))
// 当断路器处于 half open 状态时,环形缓冲区的大小
.ringBufferSizeInClosedState(2)
.build();
CircuitBreakerRegistry registry1 = CircuitBreakerRegistry.of(config);
CircuitBreaker circuitBreaker1 = registry1.circuitBreaker("you");
// 获取断路器的状态
System.out.println(circuitBreaker1.getState());
circuitBreaker1.onError(0, new RuntimeException());
// 获取断路器的状态
System.out.println(circuitBreaker1.getState());
circuitBreaker1.onError(0, new RuntimeException());
// 获取断路器的状态
System.out.println(circuitBreaker1.getState());
}
运行结果:
CLOSED
CLOSED
OPEN
Process finished with exit code 0
注意,由于 ringBufferSizeInClosedState 的值为2 ,表示当有两条数据时才会去统计故障率,所以,上面的手动故障测试,至少调用两次 onError ,断路器才会打开。
每天学习一点点,每天进步一点点。