9.2.2 使用 Resilience4J 配置断路器

定义要应用 CircuitBreaker 过滤器的路由后,你需要配置断路器本身。在 Spring Boot 中通常有两种主要选择。你可以通过 Resilience4J 提供的属性配置断路器,或通过 Customizer bean 配置。由于我们使用的是 Resilience4J 的响应式版本,特定的配置 bean 类型将是 Customizer<ReactiveResilience4JCircuitBreakerFactory>

无论哪种方式,你可以选择为 application.yml 文件中使用的每个断路器(catalogCircuitBreaker 和 orderCircuitBreaker)定义特定配置,或声明一些将应用于所有断路器的默认配置。

对于当前示例,我们可以定义断路器考虑 20 次调用的窗口(slidingWindowSize)。每次新调用都会使窗口移动,丢弃最早注册的调用。当窗口中至少 50% 的调用产生错误(failureRateThreshold)时,断路器会跳闸,电路将进入打开状态。15 秒后(waitDurationInOpenState),将允许电路转换到半开状态,其中允许 5 次调用(permittedNumberOfCallsInHalfOpenState)。如果其中至少 50% 导致错误,电路将回到打开状态。否则,断路器将跳闸到闭合状态。

继续看代码。在 Edge Service 项目(edge-service)中,在 application.yml 文件末尾,为所有 Resilience4J 断路器定义默认配置。

代码清单 9.8 配置断路器和时间限制器

resilience4j:
 circuitbreaker:
 configs:
 default:
 # 所有断路器的默认配置 bean
 slidingWindowSize: 20 # 电路闭合时用于记录调用结果的滑动窗口大小
 permittedNumberOfCallsInHalfOpenState: 5 # 电路半开时允许的调用次数
 failureRateThreshold: 50 # 当失败率高于阈值时,电路变为打开状态
 waitDurationInOpenState: 15000 # 从打开到半开的等待时间(毫秒)
 timelimiter:
 configs:
 default:
 timeoutDuration: 5s # 所有时间限制器的默认配置 bean,配置超时(秒)

我们同时配置断路器和时间限制器,这是使用 Resilience4J 实现 Spring Cloud Circuit Breaker 时必需的组件。通过 Resilience4J 配置的超时将优先于我们在前一节中为 Netty HTTP 客户端定义的响应超时(spring.cloud.gateway.httpclient.response-timeout)。

当断路器切换到打开状态时,我们至少要优雅地降级服务级别,使用户体验尽可能愉快。我将在下一节向你展示如何做到这一点。

results matching ""

    No results matching ""