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 注释移动到 getFileNamegetProjectFileFromFileName 或两者 - 但它突然停止工作(代码编译,但请求太频繁了)。

为什么 @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.