Springboot:实现节流

时间:2020-07-10 00:18:38

标签: java spring spring-boot netflix-zuul resilience4j

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

2 个答案:

答案 0 :(得分: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;    
}

答案 1 :(得分:2)

resilience4j :RateLimiter是一个不错的选择,因为resilience4j是一种轻量级的模块化库。有一个最小的配置。而且,它还将发布指标以计量表。

resilience4j也很容易与Spring Webflux集成。它为此提供了Reactor运算符。

文档:resilience4j RateLimiter