zoukankan      html  css  js  c++  java
  • 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 ,断路器才会打开。

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

  • 相关阅读:
    React 进修之路(1)
    requireJS的配置心得
    DOM的内部插入和外部插入
    h5移动端设备像素比dpr介绍
    原生js--事件类型
    React 进修之路(3)
    javaScript
    html&css
    MyBatis
    Maven基础
  • 原文地址:https://www.cnblogs.com/youcoding/p/13461797.html
Copyright © 2011-2022 走看看