Spring Cloud Resilience4j Circuitbreaker 未调用回退
Spring Cloud Resilience4j Circuitbreaker not calling fallback
我正在尝试使用 spring 云 resilience4j 库为供应商 api returns 500 错误或超时时实施断路器, api 使用 AsyncHttpClient 调用。问题似乎是当 API 返回 500 个错误时断路器永远不会打开并且回退方法永远不会执行。
可能是因为我覆盖了 onFailure(这样做是为了捕获指标)
工厂声明如下:
@Autowired
private CircuitBreakerFactory circuitBreakerFactory;
出厂配置定义如下:
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> specificCustomConfiguration1() {
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
.timeoutDuration(Duration.ofSeconds(2))
.build();
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.waitDurationInOpenState(Duration.ofMillis(1000))
.slidingWindowSize(2)
.build();
return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig)
.timeLimiterConfig(timeLimiterConfig).build(), "circuitBreaker");
}
API调用方法如下,也有断路器和.运行方法:
private void getRecommendationsAsync(final GatewayRecommendationsRequest request,
final String variantName,
final ThinkCallbackHandler callbackHandler)
throws URISyntaxException, JsonProcessingException {
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitBreaker");
final AsyncHttpClient.BoundRequestBuilder builder = requestBuilder
.prepareRequest(asyncHttpClient, request, variantName);
circuitBreaker.run(() -> builder.execute(new AsyncCompletionHandler<Response>() {
@Override
public Response onCompleted(final Response response)
throws Exception {
processResponseStatus(response, variantName);
GatewayRecommendations gatewayRecommendations = ((ThinkResponseMapper) responseMapper).map(request,
response,
useCaseId,
variantName);
validator.validateResponse("/v1/recommendations", Request.Method.GET, response, gatewayRecommendations);
callbackHandler.onSuccess(gatewayRecommendations);
return response;
}
@Override
public void onThrowable(final Throwable t) {
callbackHandler.onFailure(t, recommendationsUri + " " + parameters.toString(), variantName);
}
}), throwable -> fallback());
}
最后这是我想调用的后备方法:
public String fallback() {
LOGGER.warn("The fallback method is being used");
System.out.println("Fallback Method is being executed");
return "The circuit breaker is open";
}
您在使用 AsyncHttpClient 吗?
您可以试试我们的 Resilience4j Spring Boot 2 Starter。它提供注释支持、外部配置、指标、重试和更多功能。
如果你可以 return 一个 CompletableFuture
,它可能如下所示:
@CircuitBreaker(name = "circuitBreaker", fallbackMethod="fallback")
public CompletableFuture<GatewayRecommendations> getRecommendationsAsync(final GatewayRecommendationsRequest request,
final String variantName,
final ThinkCallbackHandler callbackHandler)
throws URISyntaxException, JsonProcessingException {
final AsyncHttpClient.BoundRequestBuilder builder = requestBuilder
.prepareRequest(asyncHttpClient, request, variantName);
return builder.execute().toCompletableFuture()
.exceptionally(t -> { /* Something wrong happened... */ } )
.thenApply(response -> { /* Validate response and extract GatewayRecommendations */
});
}
public CompletableFuture<GatewayRecommendations> fallback(RequestNotPermitted ex) {
// The circuit breaker is open
// Return a static list of recommendations
return CompletableFuture.completedFuture(..)
}
我正在尝试使用 spring 云 resilience4j 库为供应商 api returns 500 错误或超时时实施断路器, api 使用 AsyncHttpClient 调用。问题似乎是当 API 返回 500 个错误时断路器永远不会打开并且回退方法永远不会执行。
可能是因为我覆盖了 onFailure(这样做是为了捕获指标)
工厂声明如下:
@Autowired
private CircuitBreakerFactory circuitBreakerFactory;
出厂配置定义如下:
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> specificCustomConfiguration1() {
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
.timeoutDuration(Duration.ofSeconds(2))
.build();
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.waitDurationInOpenState(Duration.ofMillis(1000))
.slidingWindowSize(2)
.build();
return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig)
.timeLimiterConfig(timeLimiterConfig).build(), "circuitBreaker");
}
API调用方法如下,也有断路器和.运行方法:
private void getRecommendationsAsync(final GatewayRecommendationsRequest request,
final String variantName,
final ThinkCallbackHandler callbackHandler)
throws URISyntaxException, JsonProcessingException {
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitBreaker");
final AsyncHttpClient.BoundRequestBuilder builder = requestBuilder
.prepareRequest(asyncHttpClient, request, variantName);
circuitBreaker.run(() -> builder.execute(new AsyncCompletionHandler<Response>() {
@Override
public Response onCompleted(final Response response)
throws Exception {
processResponseStatus(response, variantName);
GatewayRecommendations gatewayRecommendations = ((ThinkResponseMapper) responseMapper).map(request,
response,
useCaseId,
variantName);
validator.validateResponse("/v1/recommendations", Request.Method.GET, response, gatewayRecommendations);
callbackHandler.onSuccess(gatewayRecommendations);
return response;
}
@Override
public void onThrowable(final Throwable t) {
callbackHandler.onFailure(t, recommendationsUri + " " + parameters.toString(), variantName);
}
}), throwable -> fallback());
}
最后这是我想调用的后备方法:
public String fallback() {
LOGGER.warn("The fallback method is being used");
System.out.println("Fallback Method is being executed");
return "The circuit breaker is open";
}
您在使用 AsyncHttpClient 吗?
您可以试试我们的 Resilience4j Spring Boot 2 Starter。它提供注释支持、外部配置、指标、重试和更多功能。
如果你可以 return 一个 CompletableFuture
,它可能如下所示:
@CircuitBreaker(name = "circuitBreaker", fallbackMethod="fallback")
public CompletableFuture<GatewayRecommendations> getRecommendationsAsync(final GatewayRecommendationsRequest request,
final String variantName,
final ThinkCallbackHandler callbackHandler)
throws URISyntaxException, JsonProcessingException {
final AsyncHttpClient.BoundRequestBuilder builder = requestBuilder
.prepareRequest(asyncHttpClient, request, variantName);
return builder.execute().toCompletableFuture()
.exceptionally(t -> { /* Something wrong happened... */ } )
.thenApply(response -> { /* Validate response and extract GatewayRecommendations */
});
}
public CompletableFuture<GatewayRecommendations> fallback(RequestNotPermitted ex) {
// The circuit breaker is open
// Return a static list of recommendations
return CompletableFuture.completedFuture(..)
}