Spring Cloud 断路器提供了跨不同断路器实现的抽象。 它提供了一个一致的 API,可在您的应用程序中使用,让您(开发人员)选择最适合您应用程序需求的断路器实现。
核心概念
若要在代码中创建断路器,可以使用 API。当您在类路径中包含 Spring Cloud Circuit Breaker 启动器时,将自动为您创建实现此 API 的 Bean。
以下示例显示了如何使用此 API 的简单示例:CircuitBreakerFactory
@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");
}
}
API 创建名为 的类的实例。
该方法采用 a 和 a 。
这是要包装在断路器中的代码。
这是断路器跳闸时运行的回退。
该函数传递导致触发回退的函数。
如果您不想提供回退,可以选择排除回退。CircuitBreakerFactory.create
CircuitBreaker
run
Supplier
Function
Supplier
Function
Throwable
反应式代码中的断路器
如果 Project Reactor 位于类路径上,则也可以用于响应式代码。
以下示例演示如何执行此操作:ReactiveCircuitBreakerFactory
@Service
public static class DemoControllerService {
private ReactiveCircuitBreakerFactory cbFactory;
private WebClient webClient;
public DemoControllerService(WebClient webClient, ReactiveCircuitBreakerFactory cbFactory) {
this.webClient = webClient;
this.cbFactory = cbFactory;
}
public Mono<String> slow() {
return webClient.get().uri("/slow").retrieve().bodyToMono(String.class).transform(
it -> cbFactory.create("slow").run(it, throwable -> return Mono.just("fallback")));
}
}
API 创建名为 的类的实例。
该方法采用 a 或 a 并将其包装在断路器中。
您可以选择分析回退,如果断路器跳闸并传递导致故障的断路器,则将调用该回退。ReactiveCircuitBreakerFactory.create
ReactiveCircuitBreaker
run
Mono
Flux
Function
Throwable
配置
您可以通过创建 类型的 Bean 来配置断路器。
该接口有一个方法(称为 ),该方法需要自定义。Customizer
Customizer
customize
Object
有关如何自定义给定实现的详细信息,请参阅 以下文档:
一些实现,例如每次调用方法。
它可能效率低下。在这种情况下,您可以使用方法。在多次调用没有意义的情况下很有用,
例如,在消耗 Resilience4j 的事件时。CircuitBreaker
Resilience4JCircuitBreaker
customize
CircuitBreaker#run
CircuitBreaker#once
customize
以下示例显示了每个事件的使用方式。io.github.resilience4j.circuitbreaker.CircuitBreaker
Customizer.once(circuitBreaker -> {
circuitBreaker.getEventPublisher()
.onStateTransition(event -> log.info("{}: {}", event.getCircuitBreakerName(), event.getStateTransition()));
}, CircuitBreaker::getName)