112 lines
4.5 KiB
Markdown
112 lines
4.5 KiB
Markdown
- [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
|
||
``` |