Files
rikako-note/spring/Spring Cloud/Spring Cloud Circuit Breaker.md
2023-04-24 09:37:24 +08:00

4.5 KiB
Raw Permalink Blame History

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方法可以用于提供默认的配置

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> 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可以按如下所示

@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
    return factory -> {
        ContextAwareScheduledThreadPoolExecutor executor = ContextAwareScheduledThreadPoolExecutor.newScheduledThreadPool().corePoolSize(5)
            .build();
        factory.configureExecutorService(executor);
    };
}

指定Circuit Breaker 配置

类似为所有Circuit Breakers指定默认配置也能以如下方式为特定Circuit Breaker指定配置

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.configure(builder -> builder.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
            .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(2)).build()), "slow");
}

Circuit Breaker属性配置

可以在配置文件中指定CircuitBreakerTimeLimiter配置配置文件中指定的配置比Customizer中指定的配置优先级更高。
优先级从上到下递减:

  • 方法级别(id)配置 - 针对指定的方法或操作
  • service级别group配置 - 针对指定应用的service或操作
  • 全局默认配置

全局默认

resilience4j.circuitbreaker:
    configs:
        default:
            registerHealthIndicator: true
            slidingWindowSize: 50

resilience4j.timelimiter:
    configs:
        default:
            timeoutDuration: 5s
            cancelRunningFuture: true

Configs Properties Configuration

resilience4j.circuitbreaker:
    configs:
        groupA:
            registerHealthIndicator: true
            slidingWindowSize: 200

resilience4j.timelimiter:
    configs:
        groupC:
            timeoutDuration: 3s
            cancelRunningFuture: true

实例属性设置

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