1

我们正在我们的组织中编写一个全新的 spring-boot-2 应用程序。我们正在探索如何在我们的 api 之上实现节流的选项?有哪些框架可用于实现 spring boot 节流?我们可以使用resilence4j或 Netflix Zuul RateLimiter 来实现这一点?

4

2 回答 2

2

在不使用外部依赖项的情况下,您可以将其实现为过滤器:

public class RpsFilter extends GenericFilterBean {
//...
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        if (rpsGreaterThanMax()) {
            responseSystemBusy((HttpServletResponse) response);
        }
        else {
            chain.doFilter(request, response);
        }
    }
//...
}

然后将其添加到过滤器链中:

@Bean
public FilterRegistrationBean<RpsFilter> rpsFilter(){
    FilterRegistrationBean<RpsFilter> registrationBean = new FilterRegistrationBean<>();
    int maxRps = getMaxRequestsPerSecond(); // from properties file
    registrationBean.setFilter(new RpsFilter(maxRps));
    registrationBean.addUrlPatterns("/api/v1/*"); // url to apply the throttling
    return registrationBean;    
}
于 2020-07-10T02:34:26.683 回答
2

弹性4j RateLimiter 是一个不错的选择,因为弹性4j 是一个轻量级的模块化库。有一个最小的配置。并且,它还会将指标发布到计量注册表。

弹性 4j 也很容易与 Spring Webflux 集成。它为它提供了 Reactor 操作符。

文档:resilience4j RateLimiter

于 2020-07-10T04:49:10.403 回答