RateLimitor只适用于某些方法

ocebsuys  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(254)

我的方法需要两个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 处理第一个函数,而不是第二个或第三个?如何在缓存函数中获得速率限制器?

bksxznpy

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 .

相关问题