spring-cloud-circuitbreaker with reactive resilience4j
spring-cloud-circuitbreaker with reactive resilience4j
我对使用 WebClient
的 CircuitBreaker
感到困惑。当依赖服务关闭时,不执行回退。
我需要额外的配置吗?
对于使用 RestTemplate
的 CircuitBreaker
,无需任何进一步配置即可正常工作。请在此处查看我的示例代码:https://github.com/altfatterz/resilience4j-demo
这是我的例子
@GetMapping("/")
public Mono<String> hello() {
return webClient.build()
.get().uri(uriBuilder -> uriBuilder
.scheme("http")
.host("slow-service").path("/slow")
.build())
.retrieve().bodyToMono(String.class).transform(it -> {
CircuitBreaker cb = circuitBreakerFactory.create("slow");
return cb.run(() -> it, throwable -> Mono.just("fallback"));
});
}
使用以下配置:
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(ofDefaults())
.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(3)).build()).build());
}
@Bean
@LoadBalanced
public WebClient.Builder webClient() {
return WebClient.builder();
}
由于您使用的是 WebClient
,因此您需要使用 ReactiveCircuitBreakerFactory
和 ReactiveCircuitBreaker
。
我对使用 WebClient
的 CircuitBreaker
感到困惑。当依赖服务关闭时,不执行回退。
我需要额外的配置吗?
对于使用 RestTemplate
的 CircuitBreaker
,无需任何进一步配置即可正常工作。请在此处查看我的示例代码:https://github.com/altfatterz/resilience4j-demo
这是我的例子
@GetMapping("/")
public Mono<String> hello() {
return webClient.build()
.get().uri(uriBuilder -> uriBuilder
.scheme("http")
.host("slow-service").path("/slow")
.build())
.retrieve().bodyToMono(String.class).transform(it -> {
CircuitBreaker cb = circuitBreakerFactory.create("slow");
return cb.run(() -> it, throwable -> Mono.just("fallback"));
});
}
使用以下配置:
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(ofDefaults())
.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(3)).build()).build());
}
@Bean
@LoadBalanced
public WebClient.Builder webClient() {
return WebClient.builder();
}
由于您使用的是 WebClient
,因此您需要使用 ReactiveCircuitBreakerFactory
和 ReactiveCircuitBreaker
。