我已经用一个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
从2000ms降低到1ms,甚至尝试向该方法引入Thread.sleep
调用,以验证它所花费的时间长于持续时间阈值。该方法运行大约100次(编辑:当slidingWindowSize
和minimumNumberOfCalls
设置远低于这个数字时,问题仍然发生)。
但是我的断路器没有打开,大约100次调用这个方法后。正如我所看到的,如果超过50%的调用花费超过1ms,它应该打开。我错过什么了吗?
这是因为该方法是私有的。方法必须是公共的,这样才能被代理。