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