如何在Spring中基于客户端令牌实现速率限制?

aj.*_*ler 16 java spring spring-security rate-limiting oauth-2.0

我正在使用Spring 3 + Spring MVC开发一个简单的REST API.使用Spring Security通过OAuth 2.0或基本身份验证与客户端令牌进行身份验证.这仍然存在争议.将强制所有连接通过SSL连接.

我一直在寻找有关如何实现速率限制的信息,但似乎并没有很多信息.实现需要分发,因为它适用于多个Web服务器.

例如,如果有三个api服务器A,B,C和客户端每秒限制为5个请求,则发出6个请求的客户端会发现对C的请求被拒绝并出现错误.

A recieves 3 requests   \
B receives 2 requests    | Executed in order, all requests from one client.
C receives 1 request    /
Run Code Online (Sandbox Code Playgroud)

它需要基于请求中包含的令牌工作,因为一个客户端可能代表许多用户发出请求,并且每个用户应该是速率限制而不是服务器IP地址.

设置将是HAProxy负载均衡器后面的多个(2-5)Web服务器.有一个Cassandra支持,并使用memcached.Web服务器将在Jetty上运行.

一个可能的解决方案可能是编写一个自定义Spring Security过滤器,该过滤器提取令牌并检查在过去的X秒内使用它进行了多少次请求.这将允许我们为不同的客户做一些不同的速率限制.

有关如何做到的任何建议?有现成的解决方案还是我必须编写自己的解决方案?我以前没有做过很多网站基础设施.

Rob*_*lty 0

如果可能的话,我会避免修改应用程序级代码来满足此要求。

我浏览了HAProxy LB 文档,那里没有什么太明显的内容,但该要求可能需要对 ACL 进行全面调查。

将 HAProxy 放在一边,一种可能的架构是将 Apache WebServer 放在前面并使用 Apache 插件来进行速率限制。超出限制的请求会被拒绝,然后 Apache 后面层中的应用程序服务器将与速率限制问题分开,从而使它们变得更简单。您还可以考虑从 Web 服务器提供静态内容。

请参阅此问题的答案如何使用 Apache 实现速率限制?(每秒请求数)

我希望这有帮助。抢