一、接口限流顾名思义就是接口限流
二、实现方法
1、计数器算法
2、漏桶算法
3、令牌桶算法
4、集群算法
5、拉黑
三、详细说明
1、技术算法
说到计算器算法,实现方式很简单,我可能可以在接口内部增加一个计数器,设定一个封顶阈值,在设置一个秒数,每次请求都给这个阈值增量,当阈值达到时,拒绝所有请求,我们可以用AtomicLong.incrementAndGet(),设定一个原子值,或者使用redis,来达到计数的方式,缺点非常明显,就是,在这个时间内,假设设置的一秒一百次,那么在垃圾请求过多的情况下,10ms就达到了100次,那么会拒绝掉后续的990ms的请求。如果这个阈值设置的过大的话,那么并发还是很高,就没有起到限流的目的,所以这个方案是有一定缺陷的
2、漏桶算法
漏桶算法的实现方式:先讲原理,相当于我们水(请求)先放到一个大水桶里,再做个漏斗,让它慢慢的流出来,从而达到限流的方式,再讲实现方式,我们可以让所有请求都先放到一个队列里面,然后用个线程池,多线程的获取队列里的请求进行执行,也可以结合计算器算法一起使用,为了防止队列消息过多,可以将计算器算法放在漏桶算法前面,先进行第一次过滤,缺点是无法应对短时间的突发流量
3、令牌桶算法
令牌桶实现方式:在原有漏桶算法的基础上,增加一个生产令牌的队列,每次往这个桶前面扔令牌,当请求拿到令牌的时候才可以访问接口,生产令牌的速度,个数,可自行设定,多余的令牌丢弃
4、集群算法
上面三种限流方式都是单机限流,现在的业务大多比较复杂,限流还要根据具体的业务场景去设定,比如,微服务中的某个接口,只允许一个用户一天访问一次或者请求一次的时候,可以用redis计数器算法,自增,达阈值就直接拒绝,也可以增加一个分布式锁,分布式锁可以记录key,并且可以设置过期时间,已经请求过的key直接抛异常即可
5、拉黑算法
一秒钟请求多次以上的,都不是用户手动操作,我们可以检测到一样的ip或者mac地址,直接拉进黑名单,肯定不是正常用户,直接拉黑就好了
四、说明
以上全部为个人理解,实际运用场景可能会复杂的多,但是一般情况下是不会限流的,除非是有恶意用户针对性的访问接口,一秒内多个请求,发生这种情况将请求信息作为key存起来就好了,设置个过期时间,每次都从缓存中拿出来,给定固定的返回值就好了,或者直接拉黑,让这个请求信息永远无法访问。