doc: 阅读spring cloud circuitBreaker文档
This commit is contained in:
@@ -42,6 +42,9 @@
|
||||
- [Create a TimeLimiterRegistry](#create-a-timelimiterregistry)
|
||||
- [Create and configure TimeLimiter](#create-and-configure-timelimiter)
|
||||
- [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
|
||||
@@ -928,3 +931,45 @@ String result = timeLimiter.executeFutureSupplier(
|
||||
|
||||
当发生等待超时时,将会根据`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接收一个Throwable,throwable为导致该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)
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user