Resilience4j是Spring Cloud Greewich版推荐的容错方案。由于Netflix对Hystrix停止了更新,所以Resilience4j可能会成为今后流行的容错解决方案。Resilience4j专为Java8以及函数式编程而设计。
Resilience4j主要提供了如下功能:
- 断路器
- 限流
- 基于信号量的隔离
- 缓存
- 限时
- 请求重试
基本用法
断路器
首先添加Junit依赖,搭建一个简单的测试环境
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
Resilience4j提供了很多功能,不同功能对应不同依赖,可以按需添加,使用断路器则首先要添加断路器的依赖
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-circuitbreaker</artifactId>
<version>1.3.1</version>
</dependency>
一个正常执行的例子:
//获取一个CircuitBreakerRegistry实例,可调用ofDefaults使用默认配置,也可自定义
public void test1(){
CircuitBreakerRegistry registry = CircuitBreakerRegistry.ofDefaults();
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
//故障阈值百分比,超过这个阈值就会打开断路器
.failureRateThreshold(50)
//断路器打开的持续时间,到达这个时间后,断路器进入half open状态
.waitDurationInOpenState(Duration.ofMillis(1000))
//断路器处于half open状态时,环形缓冲区大小
.ringBufferSizeInHalfOpenState(2)
//断路器关闭时,环形缓冲区大小
.ringBufferSizeInClosedState(2)
.build();
CircuitBreakerRegistry r1 = CircuitBreakerRegistry.of(config);
CircuitBreaker cb1 = r1.circuitBreaker("zby");
CircuitBreaker cb2 = r1.circuitBreaker("zby2", config);
}
RateLimiter限流
RateLimiter类似于断路器,首先添加依赖
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-ratelimiter</artifactId>
<version>0.13.2</version>
</dependency>
限流测试
@Test
public void test3(){
RateLimiterConfig config= RateLimiterConfig.custom()
.limitRefreshPeriod(Duration.ofMillis(1000))
.limitForPeriod(2)
.timeoutDuration(Duration.ofMillis(1000))
.build();
RateLimiter rateLimiter = RateLimiter.of("zby", config);
CheckedRunnable checkedRunnable = RateLimiter.decorateCheckedRunnable(rateLimiter, () -> {
System.out.println(new Date());
});
Try.run(checkedRunnable)
.andThenTry(checkedRunnable)
.andThenTry(checkedRunnable)
.andThenTry(checkedRunnable)
.onFailure(t->System.out.println(t.getMessage()));
}
这里将限流器设置为每秒可处理两个请求,所以执行后可以看到4个请求共分两次处理,两次之间的时间间隔为1秒
网友评论