达到slowCallRateThreshold 时,Resilience4j 断路器没有打开?

问题描述

我用 Resilience4j CircuitBreaker 修饰了以下方法

 @CircuitBreaker(name = "getSwaggerFileName")
 private Optional<String> getSwaggerFileName(String url) {
            return Optional.ofNullable(restTemplate.getForObject(url,SwaggerQueryResponse.class))
                    .flatMap(SwaggerQueryResponse::getFileName); 
 }

我的断路器配置存储在 application.yaml 中:

resilience4j:
  circuitbreaker:
    configs:
      default:
        slowCallRateThreshold: 50
        slowCallDurationThreshold: 1
        slidingWindowSize: 20
        waitDurationInopenState: 60000
    instances:
      getSwaggerFileName:
        baseConfig: default

肯定会找到此文件,并且类似的设置可以与 @RateLimiter 注释配合使用。我已将 slowCallDurationThreshold 从 2000 毫秒降低到 1 毫秒,甚至尝试向该方法引入 Thread.sleep 调用以验证它花费的时间超过持续时间阈值。该方法运行了大约 100 次(编辑:当 slidingWindowSizeminimumNumberOfCalls 的设置远低于此数字时,问题仍然存在)。

但是我的断路器在调用了大约 100 次这个方法后没有打开。在我看来,如果超过 50% 的调用时间超过 1 毫秒,它应该会打开。我错过了什么吗?

解决方法

这是因为该方法是私有的。该方法必须是公共的,以便它可以被代理。