针对该项目
下面有博客详细的说明
场景
为了防止我们的接口被人恶意访问,比如有人通过JMeter工具频繁访问我们的接口,导致接口响应变慢甚至崩溃,所以我们需要对一些特定的接口进行IP限流,即一定时间内同一IP访问的次数是有限的。
实现原理
用Redis作为限流组件的核心的原理,将用户的IP地址当Key,一段时间内访问次数为value,同时设置该Key过期时间。
比如某接口设置相同IP10秒
内请求5次
,超过5次不让访问该接口。
1. 第一次该IP地址存入redis的时候,key值为IP地址,value值为1,设置key值过期时间为10秒。
2. 第二次该IP地址存入redis时,如果key没有过期,那么更新value为2。
3. 以此类推当value已经为5时,如果下次该IP地址在存入redis同时key还没有过期,那么该Ip就不能访问了。
4. 当10秒后,该key值过期,那么该IP地址再进来,value又从1开始,过期时间还是10秒,这样反反复复。
说明
从上面的逻辑可以看出,是一时间段内访问次数受限,不是完全不让该IP永久访问接口。
项目总体技术选型
SpringBoot2.1.3 + Maven3.5.4 + Redis + lombok(插件)
同时这边是通过自定义注解
实现 IP访问限流。所有采用 自定义注解+AOP方式实现。
测试
上面这个测试非常符合我们的预期,前五次访问接口是成功的,后面就失败了,直到10秒后才可以重新访问,这样反反复复。