问题描述
使用 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
。