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 ,斷路器才會打開。
每天學習一點點,每天進步一點點。