首页 > 解决方案 > 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对第一个功能起作用,而对第二个或第三个不起作用?以及如何在缓存函数中获取速率限制器?

标签: javaspringspring-bootcachingresilience4j

解决方案


因为当你从同一个类(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


推荐阅读