java - RateLimiter 仅适用于某些方法
问题描述
我的方法需要两个 API 调用,并用 Spring Boot@Cacheable
和 Resilience4j装饰@RateLimiter
(链接到 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
对第一个功能起作用,而对第二个或第三个不起作用?以及如何在缓存函数中获取速率限制器?
解决方案
因为当你从同一个类(bean)本地调用一个带注释的方法时,Spring AOP 注释不起作用,因为这样会绕过代理。
@Cacheable
由于 Spring AOP 方面的顺序, @RateLimiter
相同的方法可能不起作用。请参阅: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
。
推荐阅读
- c# - 如何在运行时在 ASP.NET Core Web 应用程序项目中创建位图
- django - 在没有模型的情况下使用权限
- python - 如何使用 f(var, param1, param2, ...) 正确使用多处理
- matlab - 如何在 MATLAB 中使用 cumsum 获得累积和?
- python - 使用 Python 3 通过 way2sms 发送短信
- algorithm - 如何使用最近邻随机点细分空间?
- c# - 列表声明中带/不带括号的区别
- python - apscheduler python脚本每隔几个小时就会停止一次
- android - 验证错误:拒绝类序列化程序
- node.js - nodejs - 从另一个主机下载文件并将该文件同时流式传输到另一个客户端