相关疑难解决方法(0)

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

我正在使用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秒内使用它进行了多少次请求.这将允许我们为不同的客户做一些不同的速率限制.

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

java spring spring-security rate-limiting oauth-2.0

16
推荐指数
1
解决办法
8465
查看次数

Tomcat(和 Spring REST)的速率限制/节流

我现在读了很多帖子,仍然无法充分解决我的问题:

如果运行带有 Spring Rest 后端的 Tomcat Web 服务器,则有应该必须是一种限制每秒/分钟/...可能的请求的方法,例如基于请求者的 IP。到目前为止,我的调查得出了以下可能性:

  1. 使用 Guava RateLimiter 或https://github.com/weddini/spring-boot-throttle并检查 preHandle 中的所有请求。但由于这没有考虑在什么时间请求哪些 IP,因此像 REDIS 存储之类的东西进行检查(IP/上次访问时间戳)会更有意义
  2. 在提供此功能的 tomcat 前面放置一个更高级的 Web 服务器(例如 apache2 或 nginx)

现在我不喜欢第一个解决方案,因为请求已经到达应用程序本身,而第二个解决方案构建了一个附加层,我真的不相信这对于这样一个基本问题是必要的。

所以我的问题是,我在这里缺少哪些方法和解决方案?我读过一些有关 tomcat Valve semaphore 的内容,但它似乎只是限制了请求的总体速率。在 8443 端口上使用一些基本功能(如 iptables 或fail2ban)进行过滤并在给定时间范围内简单地删除同一 ip 的请求是否是最有效/可能的?

spring tomcat throttling server

5
推荐指数
0
解决办法
3429
查看次数

Apache 2.4.1 和旧版本

我一直在研究升级到 Apache 2.4.1 的可能性,并发现这些 mod 与其不兼容

  • mod_limitipconn
  • mod_evasive
  • mod_rpaf

有谁知道是否有适用于 2.4.1 的替代 mod 和/或这些 mod 的功能是否包含在 Apache 中?

apache

1
推荐指数
1
解决办法
2745
查看次数