最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)以及 合集全部源码
环境:SpringBoot3.3.5 + Spring Cloud2023.0.3
1. 简介
断路器是微服务架构中的一种关键组件,它主要用于处理服务之间的依赖关系和故障处理,提高系统的弹性和可用性。断路器模式源于电力系统中用于保护线路过载的装置,当某个服务单元发生故障时,通过断路器的故障监控,向调用方返回一个错误响应,而不是长时间的等待,从而防止故障在分布式系统中的蔓延。
在Spring Cloud中,断路器通常使用Hystrix或Resilience4j等库来实现。这些库能够监控服务调用的情况,当调用失败的次数达到一定阈值时,断路器会自动打开,拒绝所有对该服务的请求,避免进一步的失败。同时,它们还提供了降级服务,如返回预设的默认值或错误信息,确保系统的基本功能可用。
本篇文章将详细介绍Resilience4j断路器的应用及工作原理。在之前的文章关于Resilience4j的使用已经做过详细的介绍,如果你还没有用过或者没有全面的了解使用方式,那么你可以查看下面这篇文章
这篇文章详细介绍了Resilience4j 4大核心功能(熔断,限时,隔离,限流)的应用。接下来的内容,我们将介绍这4大核心功能的实现原理。
2. 工作原理
2.1 熔断
通常我们都会通过注解的方式实现熔断功能,如下示例:
首先,我们会在配置文件中配置熔断策略,如下:
resilience4j:
circuitbreaker:
# 该节点用来进行通过的配置,之后我们可以在instances中引用
configs:
cnf:
failure-rate-threshold: 60
...
instances:
# 所有熔断器的默认配置
cnf:
# 这里我们直接引用上面的配置
base-config: cnf
akf:
#以百分比配置失败率阈值。当失败率等于或大于阈值时,断路器状态并关闭变为开启,并进行服务降级。
failure-rate-threshold: 60
#配置滑动窗口的类型,当断路器关闭时,将调用的结果记录在滑动窗口中。滑动窗口的类型可以是count-based或time-based。如果滑动窗口类型是COUNT_BASED,将会统计记录最近slidingWindowSize次调用的结果。如果是TIME_BASED,将会统计记录最近slidingWindowSize秒的调用结果。
sliding-window-type: count-based
#配置滑动窗口的大小。
sliding-window-size: 3
#如果minimumNumberOfCalls为10,则必须至少记录10个调用,然后才能计算失败率。如果只记录了9次调用,即使所有9次调用都失败,断路器也不会开启。
minimum-number-of-calls: 3
#断路器从开启过渡到半开应等待的时间。
wait-duration-in-open-state: 10000
接着是在代码中在需要熔断的方法上添加注解,如下:
public Object query(Long id) {
if (id == 6) {
throw new RuntimeException("非法数字") ;
}
return "查询 - " + id ;
}
如上配置,运行结果如下:
[ ] java.lang.RuntimeException: 非法数字
[ ] java.lang.RuntimeException: 非法数字
[ ] java.lang.RuntimeException: 非法数字
// 在接下来的10s都会是下面的异常
['akf' is OPEN and does not permit further calls ] CallNotPermittedException: CircuitBreaker