Spring Cloud 框架 -- Resilience4j

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 ,断路器才会打开。

每天学习一点点,每天进步一点点。

posted @ 2020-08-09 10:12  爱吃西瓜的番茄酱  阅读(1570)  评论(0编辑  收藏  举报