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

112 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

- [Spring Cloud Circuit Breaker](#spring-cloud-circuit-breaker)
- [配置Resilience4J Circuit Breakers](#配置resilience4j-circuit-breakers)
- [关闭自动装配](#关闭自动装配)
- [默认配置](#默认配置)
- [自定义ExecutorService](#自定义executorservice)
- [指定Circuit Breaker 配置](#指定circuit-breaker-配置)
- [Circuit Breaker属性配置](#circuit-breaker属性配置)
- [全局默认](#全局默认)
- [Configs Properties Configuration](#configs-properties-configuration)
- [实例属性设置](#实例属性设置)
# 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<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可以按如下所示
```java
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
return factory -> {
ContextAwareScheduledThreadPoolExecutor executor = ContextAwareScheduledThreadPoolExecutor.newScheduledThreadPool().corePoolSize(5)
.build();
factory.configureExecutorService(executor);
};
}
```
### 指定Circuit Breaker 配置
类似为所有Circuit Breakers指定默认配置也能以如下方式为特定Circuit Breaker指定配置
```java
@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属性配置
可以在配置文件中指定`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
```