# Spring Cloud Circuit Breaker Spring Cloud Circuit Breaker项目包含Resilience4J实现和Spring Retry实现。 ## 配置Resilience4J Circuit Breakers 关于resilience4J Circuit Breakers实现,拥有如下两个启动器,一个用于响应式项目,另一个用于非响应式项目: - `org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j` - `org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j` ### 关闭自动装配 可以通过设置`spring.cloud.circuitbreaker.resilience4j.enabled`为false来关闭Resilience4J的自动装配 ### 默认配置 如果想要为所有的circuit breaker提供默认配置,可以创建一个`Customizer` bean对象,该bean对象接收一个`Resilience4JCircuitBreakerFactory`类型参数。configureDefault方法可以用于提供默认的配置: ```java @Bean public Customizer defaultCustomizer() { return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id) .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build()) .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()) .build()); } ``` ### 自定义ExecutorService 如果想要自定义执行circuit breaker的`ExecutorService`,可以通过Resilience4JCircuitBreakerFactor来指定。 例如,想要指定一个context aware ExecutorService,可以按如下所示: ```java @Bean public Customizer defaultCustomizer() { return factory -> { ContextAwareScheduledThreadPoolExecutor executor = ContextAwareScheduledThreadPoolExecutor.newScheduledThreadPool().corePoolSize(5) .build(); factory.configureExecutorService(executor); }; } ``` ### 指定Circuit Breaker 配置 类似为所有Circuit Breakers指定默认配置,也能以如下方式为特定Circuit Breaker指定配置: ```java @Bean public Customizer slowCustomizer() { return factory -> factory.configure(builder -> builder.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()) .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(2)).build()), "slow"); } ``` ### Circuit Breaker属性配置 可以在配置文件中指定`CircuitBreaker`和`TimeLimiter`配置,配置文件中指定的配置比Customizer中指定的配置优先级更高。 优先级从上到下递减: - 方法级别(id)配置 - 针对指定的方法或操作 - service级别(group)配置 - 针对指定应用的service或操作 - 全局默认配置 #### 全局默认 ```yml resilience4j.circuitbreaker: configs: default: registerHealthIndicator: true slidingWindowSize: 50 resilience4j.timelimiter: configs: default: timeoutDuration: 5s cancelRunningFuture: true ``` #### Configs Properties Configuration ```yml resilience4j.circuitbreaker: configs: groupA: registerHealthIndicator: true slidingWindowSize: 200 resilience4j.timelimiter: configs: groupC: timeoutDuration: 3s cancelRunningFuture: true ``` #### 实例属性设置 ```yml resilience4j.circuitbreaker: instances: backendA: registerHealthIndicator: true slidingWindowSize: 100 backendB: registerHealthIndicator: true slidingWindowSize: 10 permittedNumberOfCallsInHalfOpenState: 3 slidingWindowType: TIME_BASED recordFailurePredicate: io.github.robwin.exception.RecordFailurePredicate resilience4j.timelimiter: instances: backendA: timeoutDuration: 2s cancelRunningFuture: true backendB: timeoutDuration: 1s cancelRunningFuture: false ```