要在代码中创建断路器,您可以使用 API。当您在 Classpath 中包含 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 和 .这是您将要包装在断路器中的代码。这是在断路器跳闸时将执行的回退。该函数将被传递导致触发回退的函数。如果您不想提供回退,则可以选择排除回退。CircuitBreakerFactory.createCircuitBreakerrunSupplierFunctionSupplierFunctionThrowable
Reactive Code 中的断路器
如果 Project Reactor 位于 class 路径上,则您还可以用于反应式代码。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 将创建一个名为 .该方法采用 or 并将其包装在断路器中。您可以选择分析一个回退,如果断路器跳闸,将调用该回退,并将传递给导致故障的 回退。ReactiveCircuitBreakerFactory.createReactiveCircuitBreakerrunMonoFluxFunctionThrowable