JAVA 接口限流

文章介绍了接口限流的五种主要实现方法:计数器算法简单但可能存在缺陷,漏桶算法能匀速处理请求但无法应对突发流量,令牌桶算法更灵活,集群算法适用于分布式场景,而拉黑算法则用于处理恶意请求。每种算法都有其适用场景和局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、接口限流顾名思义就是接口限流

二、实现方法

1、计数器算法

2、漏桶算法

3、令牌桶算法

4、集群算法

5、拉黑

三、详细说明

1、技术算法

说到计算器算法,实现方式很简单,我可能可以在接口内部增加一个计数器,设定一个封顶阈值,在设置一个秒数,每次请求都给这个阈值增量,当阈值达到时,拒绝所有请求,我们可以用AtomicLong.incrementAndGet(),设定一个原子值,或者使用redis,来达到计数的方式,缺点非常明显,就是,在这个时间内,假设设置的一秒一百次,那么在垃圾请求过多的情况下,10ms就达到了100次,那么会拒绝掉后续的990ms的请求。如果这个阈值设置的过大的话,那么并发还是很高,就没有起到限流的目的,所以这个方案是有一定缺陷的

2、漏桶算法

漏桶算法的实现方式:先讲原理,相当于我们水(请求)先放到一个大水桶里,再做个漏斗,让它慢慢的流出来,从而达到限流的方式,再讲实现方式,我们可以让所有请求都先放到一个队列里面,然后用个线程池,多线程的获取队列里的请求进行执行,也可以结合计算器算法一起使用,为了防止队列消息过多,可以将计算器算法放在漏桶算法前面,先进行第一次过滤,缺点是无法应对短时间的突发流量

3、令牌桶算法

令牌桶实现方式:在原有漏桶算法的基础上,增加一个生产令牌的队列,每次往这个桶前面扔令牌,当请求拿到令牌的时候才可以访问接口,生产令牌的速度,个数,可自行设定,多余的令牌丢弃

4、集群算法

上面三种限流方式都是单机限流,现在的业务大多比较复杂,限流还要根据具体的业务场景去设定,比如,微服务中的某个接口,只允许一个用户一天访问一次或者请求一次的时候,可以用redis计数器算法,自增,达阈值就直接拒绝,也可以增加一个分布式锁,分布式锁可以记录key,并且可以设置过期时间,已经请求过的key直接抛异常即可

5、拉黑算法

一秒钟请求多次以上的,都不是用户手动操作,我们可以检测到一样的ip或者mac地址,直接拉进黑名单,肯定不是正常用户,直接拉黑就好了

四、说明

以上全部为个人理解,实际运用场景可能会复杂的多,但是一般情况下是不会限流的,除非是有恶意用户针对性的访问接口,一秒内多个请求,发生这种情况将请求信息作为key存起来就好了,设置个过期时间,每次都从缓存中拿出来,给定固定的返回值就好了,或者直接拉黑,让这个请求信息永远无法访问。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值