用Java限制Rest API

hat*_*lla 4 java rest throttling dropwizard

我想添加一种方法来限制来自某个客户端的每个API上发出的请求数量.所以,我想基本上限制每个客户端每个API的请求数量.

我使用DropWizard作为框架.有人可以推荐实现这个目标的方法吗?我需要一些适用于分布式系统的东西.

npe*_*npe 5

一种简单的方法是使用Filter并将其包装在所有API调用中web.xml.假设您的客户端在HTTP标头中发送标识它们的API密钥,您可以实现如下过滤器:

public class MyThrottlingFilter extends Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpreq = (HttpServletRequest) req;
        String apiKey = httpreq.getHeader("API_KEY")

        if (invocationLimitNotReached(apiKey))
            chain.doFilter(req, res);
        else
            throw ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样注册:

<filter>
    <filter-name>MyThrottlingFilter</filter-name>
    <filter-class>com.my.throttler.MyThrottlingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyThrottlingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

当然,如果您使用其他一些身份验证方法,识别您的客户可能比这更困难,但总体思路应该是相同的.


Raf*_* G. 5

你想在你的应用程序中包含这样的逻辑吗?也许一些外部负载均衡器会是更好的选择?

您可以尝试使用 HAProxy 并在应用程序之外拥有完整的节流逻辑。

这种方法的一大优点是,只要限制需求发生变化,您就不必重建和重新部署应用程序。此外,与典型的 Java 应用程序相比,HAProxy 重新启动所需的时间要少得多。