From 57507cc3afb701dbbb13960f61a746f8f7328273 Mon Sep 17 00:00:00 2001 From: asahi Date: Thu, 4 Sep 2025 11:10:04 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBspring=20cloud=20circu?= =?UTF-8?q?itBreaker=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CircuitBreaker/CircuitBreaker.md | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/spring/Spring Cloud/CircuitBreaker/CircuitBreaker.md b/spring/Spring Cloud/CircuitBreaker/CircuitBreaker.md index 05d4296..2f93fc5 100644 --- a/spring/Spring Cloud/CircuitBreaker/CircuitBreaker.md +++ b/spring/Spring Cloud/CircuitBreaker/CircuitBreaker.md @@ -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) +```