请求限流的前提以及如何限流:

当我们接口被恶意调用的时候通常情况下需要进行限流设置,有两种限流操作情况,一种是我们对这个接口做全局限制,就是默认所有人在单位时间内只能调用多少次,第二种是对调用者的IP地址做限制。

何时限流:

当我们在执行这个方法之前就应该先判断是否限流,所以我们可以采用AOP+注解模式
所以我们现在就是要用注解+AOP对接口做两种模式限流:全局和IP地址。

限流策略:
Redis是一款高性能的key-value数据存储系统,其一大特色为支持丰富的数据结构,如字符串、哈希、列表、集合和有序集合等。由于其高效的读写性能和多种数据类型的支持,越来越多的应用需要利用Redis实现限流功能,以避免应用遭受突发高流量而导致服务不可用等问题。
1、计数器算法

计数器算法是Redis实现限流的常见手段,其核心思想为统计单位时间内的请求数量并与阈值进行比较,当达到阈值时就拒绝后续访问,从而起到限制流量的目的。具体实现方法如下:

1.1 使用Redis的原子操作incr操作,实现计数器的自增。

1.2 通过Redis对key设置过期时间,例如设置一分钟后过期。

1.3 当计算器的值超过限制阈值时,拒绝访问,否则可以继续访问并重置计数器值。

需要注意的是,由于计数器算法只记录请求数量,无法区分不同类型的请求,可能会存在被恶意用户绕过的可能性。因此,这种方法适用于单一请求的场景,如接口限流。

2、漏桶算法

漏桶算法也是一种流量控制算法,和计数器算法相比,漏桶算法会对请求进行一个统一的速率限制,而非单纯地限制访问量。其主要思想为模拟水桶中的水流量,加入一个固定的速率加入水,如果水桶满了,就拒绝后续的请求,否则按照固定的速率处理请求。具体实现方法如下:

2.1 将漏桶看作一个固定大小的容器,以固定的速率漏出水。

2.2 使用Redis的List数据类型,将每个请求按照时间顺序加入List中,即水流进入水桶的过程。

2.3 使用Redis的过期机制,将List中已经达到一定时间的请求移出,即水从桶中漏出的过程。

2.4 当请求加入List时,判断List的长度是否达到桶的最大限制,如果超过限制,就拒绝请求,否则可以正常处理。

漏桶算法可用于应对各种请求,由于限制速率而非请求数量,不容易被恶意用户绕过,常用于对整个应用的限流控制。

3、令牌桶算法

令牌桶算法也属于流量控制算法,其主要思想为固定速率向令牌桶中添加令牌,一个请求需要获取令牌才能执行,当令牌桶中没有令牌时,请求将被拒绝。具体实现方法如下:

3.1 使用Redis的List数据类型,将一定数量的令牌添加到List中,表示令牌桶的容量。

3.2 使用Redis过期机制,每当有请求到来时,如果List中还有令牌,则可以正常处理请求,并从List中移除一个令牌,否则拒绝请求。

3.3 当令牌生成速度过快或者请求到来速度过慢时,可能会出现令牌桶溢出的情况。因此,可使用Redis的有序集合数据类型,记录每次执行的时间和执行次数,用于在下一次添加令牌时,调整添加令牌的数量,以适应实际情况。

令牌桶算法不仅能够限制并发数,而且可以控制请求速率,比较适合对底层资源进行保护,比如数据库连接池、磁盘IO等。

总结

这三种算法适用于不同的应用场景,可以根据具体的需求选取合适的方案实现限流功能。同时,需要注意的是,每种算法的具体实现方法会影响到性能和精度,因此需要根据实际情况进行选择和调整。