美文网首页
Resilience4j

Resilience4j

作者: 一腔诗意换酒钱 | 来源:发表于2020-03-07 19:05 被阅读0次

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秒

image

相关文章

网友评论

      本文标题:Resilience4j

      本文链接:https://www.haomeiwen.com/subject/knyhdhtx.html