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(..)
}