doc: 阅读spring cloud circuitBreaker文档

This commit is contained in:
asahi
2025-09-04 11:10:04 +08:00
parent 491908e87a
commit 57507cc3af

View File

@@ -42,6 +42,9 @@
- [Create a TimeLimiterRegistry](#create-a-timelimiterregistry) - [Create a TimeLimiterRegistry](#create-a-timelimiterregistry)
- [Create and configure TimeLimiter](#create-and-configure-timelimiter) - [Create and configure TimeLimiter](#create-and-configure-timelimiter)
- [decorate and execute a functional interface](#decorate-and-execute-a-functional-interface-4) - [decorate and execute a functional interface](#decorate-and-execute-a-functional-interface-4)
- [Spring Cloud CircuitBreaker](#spring-cloud-circuitbreaker)
- [core concepts](#core-concepts)
- [Configuration](#configuration)
# CircuitBreaker # CircuitBreaker
@@ -928,3 +931,45 @@ String result = timeLimiter.executeFutureSupplier(
当发生等待超时时,将会根据`shouldCancelRunningFuture`参数的配置来决定`是否针对尚未执行完成的future调用cancel` 当发生等待超时时,将会根据`shouldCancelRunningFuture`参数的配置来决定`是否针对尚未执行完成的future调用cancel`
## Spring Cloud CircuitBreaker
Spring Cloud Circuit Breaker提供了circuit breaker的抽象可以让开发者自由选择circuit breaker的实现。目前spring cloud支持如下circuit breaker的实现
- Resilience4j
- Sentinel
- spring retry
### core concepts
可以通过`CircuitBreakerFactory` api来创建circuit breaker。在classpath中包含spring cloud circuit breaker starter时将会自动创建实现了`CircuitBreakerFactory`的bean。如下示例展示了如何使用该api
```java
@Service
public static class DemoControllerService {
private RestTemplate rest;
private CircuitBreakerFactory cbFactory;
public DemoControllerService(RestTemplate rest, CircuitBreakerFactory cbFactory) {
this.rest = rest;
this.cbFactory = cbFactory;
}
public String slow() {
return cbFactory.create("slow").run(() -> rest.getForObject("/slow", String.class), throwable -> "fallback");
}
}
```
`CircuitBreakerFactory.create`方法将会创建一个`CircuitBreaker`的实例run方法将会接收一个Supplier和一个Function
- supplier是实际被封装在circuitbreaker中的方法
- function是circuit breaker被触发之后的fallback
- function接收一个Throwablethrowable为导致该fallback被触发的异常
### Configuration
可以通过创建`Customizer`类型的bean来配置circuit breaker。
`Resilience4JCircuitBreaker`的实现中,每次调用`circuitbreaker#run`时,都会调用`Customizer#customize`方法,该行为可能会存在效率问题。故而,可以使用`Customizer#once`方法来创建Customizer其会保证customizer中的逻辑最多只会被调用一次。
示例如下所示:
```java
Customizer.once(circuitBreaker -> {
circuitBreaker.getEventPublisher()
.onStateTransition(event -> log.info("{}: {}", event.getCircuitBreakerName(), event.getStateTransition()));
}, CircuitBreaker::getName)
```