如何解决Spring Cloud Resilience4j Circuitbreaker不调用回退
我正在尝试使用spring cloud resilience4j库实现断路器,以便在供应商api返回500错误或超时时使用AsyncHttpClient调用该api。问题似乎是当API返回500个错误时,断路器永远不会断开,并且fallback方法也永远不会执行。
可能是由于我覆盖了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,该方法还具有断路器和.run方法:
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,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。它提供注释支持,外部配置,指标,重试和更多功能。
如果您可以返回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(..)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。