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 ,断路器才会打开。
每天学习一点点,每天进步一点点。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· Ai满嘴顺口溜,想考研?浪费我几个小时
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密