minimumNumberOfCalls 在resilience4j 中不起作用

问题描述

使用 springboot 2.4 和弹性 4j 1.5,

我已经配置了我的 yaml 文件

resilience4j:
  circuitbreaker:
    configs:
      default:
        registerHealthindicator: true
        slidingWindowSize: 10
        minimumNumberOfCalls: 5
        permittednumberOfCallsInHalfOpenState: 3
        automaticTransitionFromOpenToHalfOpenEnabled: true
        waitDurationInopenState: 50s
        failureRateThreshold: 50
        eventConsumerBufferSize: 10
    instances:
      movieCatalog:
                  baseConfig: default

在 movieCatalog 实例中,

@RequestMapping("/{userId}")
@CircuitBreaker(name = CATALOG_SERVICE,fallbackMethod="fallBackCatalog")
public List<CatalogItem> getCatalog(@PathVariable("userId") String userId) {
    Userrating ratings = restTemplate.getForObject("http://ratings-data-service/ratingsdata/users/"+userId,Userrating.class);
    return ratings.getUserratings().stream()
            .map(rating -> {
                Movie movie = restTemplate.getForObject("http://movie-info-sevice/movies/" + rating.getMovieId(),Movie.class);
                return new CatalogItem(movie.getName(),movie.getDescription(),rating.getrating());
            })
            .collect(Collectors.toList());
}

private List<CatalogItem> fallBackCatalog(Exception e) {
    List<CatalogItem> fallBack = new ArrayList<>();
    fallBack.add(new CatalogItem("movie1","movie desc",3));
    return fallBack;
}

我看到当我在上面的 getCatalog 方法中遇到异常时,我会在第一次调用时立即得到回退结果。我的理解是对于前 5 个调用,我应该看到一个异常,从第 6 个调用开始,因为超过 50% 的调用是异常(100% 错误),我应该在第 6 个调用中看到回退结果。在配置回退方法之前,我有几个错误,是否有记录以前调用的缓存,我想如果有缓存,应该在重新启动 Spring Boot 应用程序时清除它吗?如果我遗漏了什么,请解释一下。任何指针都非常感谢。

解决方法

回退机制就像一个 try/catch。它独立于您的断路器配置。 如果您只想在断路器打开时执行回退方法,则将范围从 Exception 缩小到 CallNotPermittedException