我正在使用 Spring 3 + Spring MVC 开发一个简单的 REST API。身份验证将通过 OAuth 2.0 或使用 Spring Security 的带有客户端令牌的基本身份验证来完成。这仍在辩论中。所有连接都将强制通过 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 /
它需要基于请求中包含的令牌工作,因为一个客户端可能代表许多用户发出请求,并且每个用户应该受到速率限制而不是服务器 IP 地址。
该设置将是 HAProxy 负载平衡器后面的多个 (2-5) Web 服务器。有一个 Cassandra 支持,并且使用了 memcached。Web 服务器将在 Jetty 上运行。
一个潜在的解决方案可能是编写一个自定义 Spring Security 过滤器,该过滤器提取令牌并检查在最后 X 秒内使用它发出了多少请求。这将允许我们为不同的客户做一些事情,比如不同的速率限制。
关于如何完成的任何建议?是否有现有的解决方案,还是我必须编写自己的解决方案?我以前没有做过很多网站基础设施。