春季云断路器

Spring Cloud 断路器提供了跨不同断路器实现的抽象。 它提供了一个统一的API,供你的应用使用,让你作为开发者选择最适合你应用需求的断路器实现。spring-doc.cadn.net.cn

核心概念

要在代码中创建断路器,你可以使用断路器工厂应用程序接口。 当你在类路径中包含 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 创建一个名为断路器. 这执行方法取提供商以及一个功能. 这提供商是你要用断路器包裹的代码。 这功能是断路器跳闸时运行的后备。 该函数传递给可投掷这导致了备用系统被触发。 如果你不想提供备份,也可以选择排除。spring-doc.cadn.net.cn

响应式代码中的断路器

如果Project Reactor在类路径上,你也可以使用响应式断路器工厂针对你的响应式代码。 以下示例展示了如何实现: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")));
	}
}

响应式断路器工厂.createAPI 创建一个名为响应式断路器. 这执行方法取或者通量然后用断路器包裹起来。 你可以选择性地设置一个备选方案功能当断路器跳闸并被可投掷这导致了失败。spring-doc.cadn.net.cn

配置

你可以通过创建 Beans 来配置断路器定制器. 这定制器接口只有一种方法(称为自定义) 后取对象可以定制。spring-doc.cadn.net.cn

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

一些断路器实现方式包括韧性4JCircuitBreaker自定义每次都用方法断路器#运行被叫去。 这可能效率低下。 那你可以使用断路器#一次方法。 它在呼叫时非常有用自定义很多时候这样做并不合理,比如在消费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)

Spring HTTP 服务客户端支持

Spring Cloud 通过以下配置器支持 Spring HTTP 服务客户端的集成:spring-doc.cadn.net.cn

这些配置器启用了对 Spring HTTP 服务客户端组的断路器支持。spring-doc.cadn.net.cn

当备援类配置时@HttpServiceFallbackAnnotation, 新增了CircuitBreaker适配器装饰器: -断路器适配器装饰器用于Rest客户端 - 反应断路器适配器装饰器用于Web客户端spring-doc.cadn.net.cn

你可以通过设置相应属性来禁用HTTP服务客户端的CircuitBreaker集成:spring-doc.cadn.net.cn

  • 对于阻挡(Rest客户端)客户:spring.cloud.circuitbreaker.http-services.enabled=falsespring-doc.cadn.net.cn

  • 对于响应式(Web客户端)客户:spring.cloud.circuitbreaker.reactive-http-services.enabled=falsespring-doc.cadn.net.cn

这防止了 CircuitBreaker 装饰器被应用于基于接口的 HTTP 客户端组。spring-doc.cadn.net.cn

带注释的后备声明

备援配置方式是@HttpServiceFallback配置类注释。 该注释允许您声明:spring-doc.cadn.net.cn

倍数@HttpServiceFallback注释可以用 Java 在同一类上声明@Repeatable注释机制。 如果没有指定组,则该回退适用于所有没有为给定服务接口明确的每组退回的组。spring-doc.cadn.net.cn

退回类通过以下先例解析:spring-doc.cadn.net.cn

  1. 一个两者匹配的备选职业为服务forGroupspring-doc.cadn.net.cn

  2. 一个带有匹配的备选类为服务forGroup(全球服务的备选)spring-doc.cadn.net.cn

  3. 一个没有为服务forGroup(默认适用于组内或全局的所有服务)spring-doc.cadn.net.cn

示例

@HttpServiceFallback(value = DefaultFallbacks.class)
@HttpServiceFallback(value = GroupAndServiceSpecificFallbacks.class, service = {BillingService.class, ShippingService.class}, group = "billing")
public class MyFallbackConfig {
    ...
}

这种配置导致:spring-doc.cadn.net.cn

断路器适配器的工作原理

适配器会被包裹@HttpExchange方法调用,带有CircuitBreaker逻辑。 当触发回退时,会使用用户自定义的退回类创建代理。 通过匹配选择合适的后备方法:spring-doc.cadn.net.cn

给定以下接口:spring-doc.cadn.net.cn

@HttpExchange("/test")
public interface TestService {

    @GetExchange("/{id}")
    Person test(@PathVariable UUID id);

    @GetExchange
    String test();
}

匹配的备用类可以是:spring-doc.cadn.net.cn

public class TestServiceFallback {

    public Person test(UUID id);

    public String test(Throwable cause);
}