此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Cloud Commons 4.1.5spring-doc.cadn.net.cn

Spring Cloud 断路器

Spring Cloud Circuit Breaker 提供了跨不同断路器实现的抽象。 它提供了一个一致的 API 以在您的应用程序中使用,让您(开发人员)选择最适合您的应用程序需求的断路器实现。spring-doc.cadn.net.cn

核心概念

要在代码中创建断路器,您可以使用CircuitBreakerFactory应用程序接口。当您在 Classpath 中包含 Spring Cloud Circuit Breaker Starters时,将自动为您创建实现此 API 的 Bean。 以下示例显示了如何使用此 API 的简单示例:spring-doc.cadn.net.cn

@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.createAPI 会创建一个名为CircuitBreaker. 这runmethod 采用Supplier以及Function. 这Supplier是要包装在断路器中的代码。 这Function是在断路器跳闸时运行的回退。 该函数将Throwable这会导致触发回退。 如果您不想提供回退,则可以选择排除回退。spring-doc.cadn.net.cn

Reactive Code 中的断路器

如果 Project Reactor 位于类路径上,您还可以使用ReactiveCircuitBreakerFactory用于您的反应式代码。 以下示例显示了如何执行此作:spring-doc.cadn.net.cn

@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")));
	}
}

ReactiveCircuitBreakerFactory.createAPI 会创建一个名为ReactiveCircuitBreaker. 这runmethod 采用MonoFlux并将其包裹在断路器中。 您可以选择分析回退Function,如果断路器跳闸并传递Throwable这导致了失败。spring-doc.cadn.net.cn

配置

您可以通过创建以下类型的 bean 来配置断路器Customizer. 这Customizerinterface 有一个方法(称为customize),该Object进行自定义。spring-doc.cadn.net.cn

有关如何自定义给定实现的详细信息,请参阅 以下文档:spring-doc.cadn.net.cn

一些CircuitBreaker实现,例如Resilience4JCircuitBreakercustomizemethod 每次CircuitBreaker#run被调用。 它可能效率低下。在这种情况下,您可以使用CircuitBreaker#once方法。它在调用customize很多时候都没有意义, 例如,在使用 Resilience4j 的事件的情况下。spring-doc.cadn.net.cn

以下示例显示了每个io.github.resilience4j.circuitbreaker.CircuitBreaker以使用事件。spring-doc.cadn.net.cn

Customizer.once(circuitBreaker -> {
  circuitBreaker.getEventPublisher()
    .onStateTransition(event -> log.info("{}: {}", event.getCircuitBreakerName(), event.getStateTransition()));
}, CircuitBreaker::getName)