1. 前言
当微服务数量越来越多之后,保证微服务自身的高可用性就变得异常重要了,高可用也是服务治理中的重要一环,在保障高可用解决方案中,服务的熔断、限流与降级可以说是其中非常重要的一种手段。在 Java 的微服务生态中,对于服务保护组件,像 Spring Cloud 的 Hystrix,Spring Cloud Alibaba 的 Sentinel,以及当 Hystrix 停更之后官方推荐使用的 Resilience4j。
熔断器(Circuit Breaker)也称为断路器,它是 Resilience4j 中非常重要的一个模块,用于保护我们的应用程序免受故障和异常的影响。
Spring Cloud 断路器是在分布式系统中实现容错的一种方式。它的原理是通过在调用链路上添加断路器,当某个服务的调用出现故障或超时时,断路器会自动迅速地切换到快速失败模式,防止故障扩散,从而保护整个系统的稳定性。
2. 断路器的三大状态
熔断器的三大状态及工作模式如下:
(1)关闭状态(CLOSED):熔断器初始状态为关闭状态。在这个状态下,所有的请求都会被直接通过,不会产生任何熔断操作。当请求失败率低于定义的阈值时,熔断器会保持在关闭状态。
(2)开放状态(OPEN):当请求失败率超过定义的阈值时,熔断器会进入开放状态。在这个状态下,熔断器会立即拒绝所有请求,并抛出一个预定义的异常(比如 CircuitBreakerOpenException)。在一定的时间窗口期内,所有的请求都会被拒绝。
(3)半开状态(HALF_OPEN):当熔断器进入开放状态后一段时间,它会进入半开状态。在这个状态下,熔断器会允许一个请求通过以检测外部服务是否恢复正常。如果这个请求成功,则熔断器会进入关闭状态;如果失败,则会重新进入开放状态。
通过这种模式,熔断器能够在外部服务的故障或异常问题出现时,快速地拒绝请求,保护我们的应用程序免受不可用的外部服务的影响。熔断器还提供了一些其他功能,比如定义熔断条件、熔断事件的监控和处理等,使我们能够更好地管理和保护我们的系统。
3. 熔断器的状态转换机制
熔断器是一种用于防止故障扩散的机制,可以保护应用程序免受故障的影响。Resilience4j 的熔断器采用了状态转换机制来实现。
熔断器有三个状态:关闭(CLOSED)、开启(OPEN)和半开(HALF_OPEN)。
(1)关闭状态(CLOSED):在关闭状态下,所有的请求都会被正常处理。如果失败的请求数量超过了预设的阈值(比如在一段时间内失败率超过了一定百分比),熔断器将会进入下一个状态。
(2)开启状态(OPEN):在开启状态下,所有的请求都会被熔断器直接拒绝,而不会发送到目标服务。这样可以快速响应并降低资源消耗。在一段时间后,熔断器会自动进入下一个状态。
(3)半开状态(HALF_OPEN):半开状态是熔断器的恢复阶段。在此状态下,熔断器会允许一部分请求通过到目标服务进行测试。如果这些请求成功,则熔断器将会进入关闭状态,否则将会回到开启状态。
状态转换的触发条件是可配置的,比如可以设置失败的请求数量、失败率等。在状态转换过程中,Resilience4j 还支持熔断事件的处理,可以通过回调函数来处理熔断事件。
通过这种状态转换机制,熔断器可以根据实际情况来自动调整自身的状态,以保护应用程序免受故障的影响。
4. 熔断器的所有配置参数
Resilience4j 是一个用于构建弹性和容错性应用程序的轻量级库。它提供了许多弹性模式,包括熔断器(Circuit Breaker)模式。
熔断器是一种用于保护应用程序免受故障和慢响应的机制。它基于一组配置参数和调整策略来定义何时打开和关闭熔断器。
熔断器的配置参数包括:
(1)熔断器状态切换的阈值:熔断器会根据请求的失败率来判断是否打开或关闭。阈值参数包括故障率阈值、故障统计窗口大小和最小请求数量。
(2)重试和超时设置:当熔断器打开时,可以配置重试的次数和间隔时间,以及请求的超时时间。
(3)时间窗口设置:可以配置一个时间窗口以了解请求的成功率和失败率,以便确定熔断器的状态。
调整策略是根据应用程序的需求来定义熔断器的行为。可以根据以下一些策略来调整熔断器的状态:
(1)错误百分比:当请求的失败率超过阈值时,熔断器会打开。可以配置一个百分比来定义失败率的阈值。
(2)错误数:当失败的请求数量超过阈值时,熔断器会打开。可以配置一个固定的数量来定义失败的请求数量的阈值。
(3)平均响应时间:当请求的平均响应时间超过阈值时,熔断器会打开。可以配置一个时间来定义平均响应时间的阈值。
(4)自定义策略:可以根据具体应用场景,自定义一个策略来判断熔断器的状态。
通过对这些配置参数和调整策略的调整,可以实现对熔断器的动态控制,以适应不同的应用场景和需求。
以下给出一些比较常用的配置参数。
5. 熔断 + 降级案例需求说明
(1)6次访问中,当执行方法的失败率达到 50% 时 Circuit Breaker 将进入开启 0PEN 状态,拒绝所有请求。
(2)等待 5 秒后,Circuit Breaker 将自动从开启 OPEN 状态过渡到半开 HALF_OPEN 状态,允许一些请求通过以测试服务是否恢复正常。
(3)如还是异常,Circuit Breaker 将重新进入开启 OPEN 状态;如正常,将进入关闭 CLOSE 状态,恢复正常处理请求。