我的方法需要两个api调用,并用springboot的 @Cacheable
以及弹性4J @RateLimiter
(链接到文档):
@Cacheable(value = "getProjectFile")
@RateLimiter(name = "getProjectFile")
public Optional<String> getProjectFile(String projectName) {
return getFileName(projectName).flatMap(this::getProjectFileFromFileName);
}
private Optional<String> getFileName(String projectName) {
String url = getUrlFromProjectName(projectName);
return Optional.ofNullable(restTemplate.getForObject(url, String.class));
}
private Optional<String> getProjectFileFromFileName(String fileName) {
String url = getUrlFromFileName(fileName);
return Optional.ofNullable(restTemplate.getForObject(url, String.class));
}
这两种注解都能很好地工作——但是即使在访问缓存值时,速率限制器也会打开,从而不必要地降低了程序的速度。
为了解决这个问题,我试着移动 @RateLimiter
注解到 getFileName
, getProjectFileFromFileName
,或两者兼而有之-但它突然停止工作(代码编译,但请求太频繁)。
为什么会这样 @RateLimiter
处理第一个函数,而不是第二个或第三个?如何在缓存函数中获得速率限制器?
1条答案
按热度按时间bksxznpy1#
由于spring的原因,当您从同一类(bean)本地调用带注解的方法时,aop注解不起作用,因为这样就绕过了代理。
@Cacheable
以及@RateLimiter
由于spring aop方面顺序的原因,在相同的方法上可能不起作用。请参见:https://docs.spring.io/spring-framework/docs/4.3.15.release/spring-framework-reference/html/aop.html#aop-ataspectj建议订购您可以全局配置RateLimitor的顺序,但最好移动该方法
getFileName
变成另一个豆子,只能用@RateLimiter
.