RateLimiter 仅适用于某些方法
RateLimiter only works attached to certain methods
我的方法需要两次 API 调用,并装饰有 Spring Boot 的 @Cacheable
以及 Resilience4j 的 @RateLimiter
(link to doc):
@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
对第一个函数有效,但对第二个或第三个函数无效?以及如何在缓存函数中获取速率限制器?
因为 Spring 当您从同一个 class (bean) 本地调用一个被注释的方法时,AOP 注释不起作用,因为这样代理就被绕过了。
@Cacheable
和 @RateLimiter
在同一方法上可能不起作用,因为 Spring AOP Aspect 顺序。参见:https://docs.spring.io/spring-framework/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html#aop-ataspectj-advice-ordering
您可以全局配置 RateLimiter 的顺序,但最好将方法 getFileName
移动到另一个 Bean 并且只使用 @RateLimiter
.
我的方法需要两次 API 调用,并装饰有 Spring Boot 的 @Cacheable
以及 Resilience4j 的 @RateLimiter
(link to doc):
@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
对第一个函数有效,但对第二个或第三个函数无效?以及如何在缓存函数中获取速率限制器?
因为 Spring 当您从同一个 class (bean) 本地调用一个被注释的方法时,AOP 注释不起作用,因为这样代理就被绕过了。
@Cacheable
和 @RateLimiter
在同一方法上可能不起作用,因为 Spring AOP Aspect 顺序。参见:https://docs.spring.io/spring-framework/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html#aop-ataspectj-advice-ordering
您可以全局配置 RateLimiter 的顺序,但最好将方法 getFileName
移动到另一个 Bean 并且只使用 @RateLimiter
.