woshikid / blog

Apache License 2.0
8 stars 1 forks source link

Spring Cloud Circuit Breaker学习笔记 #175

Open woshikid opened 2 years ago

woshikid commented 2 years ago

通用API

使用CircuitBreakerFactory

@Autowired
private CircuitBreakerFactory circuitBreakerFactory;

// 相当于new RetryTemplate().setRetryPolicy(new CircuitBreakerRetryPolicy())
// 相当于circuitBreakerRegistry.circuitBreaker("id")
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("id");

// 相当于retryTemplate.execute()
// 相当于circuitBreaker.executeSupplier()
String result = circuitBreaker.run(() -> "trying", throwable -> "fallback");

Spring Retry

Spring Retry,详见 #169

POM

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-circuitbreaker-spring-retry</artifactId>
</dependency>

全局设置

@Bean
public Customizer<SpringRetryCircuitBreakerFactory> defaultCustomizer() {
    // 设置全局默认代理策略,默认为SimpleRetryPolicy
    return factory -> factory.configureDefault(id -> new SpringRetryConfigBuilder(id).retryPolicy(new SimpleRetryPolicy()).build());
}

特定设置

@Bean
public Customizer<SpringRetryCircuitBreakerFactory> slowCustomizer() {
    // 设置特定id的代理策略
    return factory -> factory.configure(builder -> builder.retryPolicy(new SimpleRetryPolicy(1)).build(), "slow");
    // 注意:factory.addRetryTemplateCustomizers()的内容在每次circuitBreaker.run()时都会执行
}

Resilience4j

Resilience4j,详见 #176

POM

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>

AOP优先级

CircuitBreaker(TimeLimiter())

全局设置

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
    // 设置全局默认熔断/限时策略(或全部使用yml配置)
    return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
            .circuitBreakerConfig(CircuitBreakerConfig.custom().minimumNumberOfCalls(10).build())
            .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(10)).build())
            .build());
}

特定设置

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() {
    // 设置特定name的熔断/限时策略(或全部使用yml配置)
    return factory -> factory.configure(builder -> builder
            .circuitBreakerConfig(CircuitBreakerConfig.custom().minimumNumberOfCalls(10).build())
            .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(10)).build())
            .build(), "slow");
    // 注意:factory.addCircuitBreakerCustomizer()的内容在每次circuitBreaker.run()时都会执行
}

Bulkhead

POM

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-bulkhead</artifactId>
</dependency>

AOP优先级

CircuitBreaker(TimeLimiter(Bulkhead()))

全局设置

@Bean
public Customizer<Resilience4jBulkheadProvider> defaultBulkheadCustomizer() {
    // 设置全局默认隔离策略(或全部使用yml配置)
    // 默认优先使用ThreadPoolBulkhead
    return provider -> provider.configureDefault(id -> new Resilience4jBulkheadConfigurationBuilder()
            .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(1).build())
            .threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.custom().coreThreadPoolSize(1).build())
            .build());
}

特定设置

@Bean
public Customizer<Resilience4jBulkheadProvider> slowBulkheadCustomizer() {
    // 设置特定name的隔离策略(或全部使用yml配置)
    // 默认优先使用ThreadPoolBulkhead,可通过只设置yml的bulkhead.instances或只设置provider.addBulkheadCustomizer()来使用Bulkhead
    return provider -> provider.configure(builder -> builder
            .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(1).build())
            .threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.custom().coreThreadPoolSize(1).build())
            .build(), "slow");
    // 注意:provider.addBulkheadCustomizer()的内容只会执行一次
    // 注意:provider.addThreadPoolBulkheadCustomizer()的内容只会执行一次
}