微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决达到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 毫秒,它应该会打开。我错过了什么吗?

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。