我正在使用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秒内使用它进行了多少次请求.这将允许我们为不同的客户做一些不同的速率限制.
有关如何做到的任何建议?有现成的解决方案还是我必须编写自己的解决方案?我以前没有做过很多网站基础设施.
我现在读了很多帖子,仍然无法充分解决我的问题:
如果运行带有 Spring Rest 后端的 Tomcat Web 服务器,则有应该必须是一种限制每秒/分钟/...可能的请求的方法,例如基于请求者的 IP。到目前为止,我的调查得出了以下可能性:
现在我不喜欢第一个解决方案,因为请求已经到达应用程序本身,而第二个解决方案构建了一个附加层,我真的不相信这对于这样一个基本问题是必要的。
所以我的问题是,我在这里缺少哪些方法和解决方案?我读过一些有关 tomcat Valve semaphore 的内容,但它似乎只是限制了请求的总体速率。在 8443 端口上使用一些基本功能(如 iptables 或fail2ban)进行过滤并在给定时间范围内简单地删除同一 ip 的请求是否是最有效/可能的?
我一直在研究升级到 Apache 2.4.1 的可能性,并发现这些 mod 与其不兼容
有谁知道是否有适用于 2.4.1 的替代 mod 和/或这些 mod 的功能是否包含在 Apache 中?