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 ,斷路器才會打開。

每天學習一點點,每天進步一點點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM