我们正在我们的组织中编写一个全新的 spring-boot-2 应用程序。我们正在探索如何在我们的 api 之上实现节流的选项?有哪些框架可用于实现 spring boot 节流?我们可以使用resilence4j或 Netflix Zuul RateLimiter 来实现这一点?
问问题
1854 次
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 操作符。
于 2020-07-10T04:49:10.403 回答