问题描述
我用 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 次(编辑:当 slidingWindowSize
和 minimumNumberOfCalls
的设置远低于此数字时,问题仍然存在)。
但是我的断路器在调用了大约 100 次这个方法后没有打开。在我看来,如果超过 50% 的调用时间超过 1 毫秒,它应该会打开。我错过了什么吗?
解决方法
这是因为该方法是私有的。该方法必须是公共的,以便它可以被代理。