第1、2、3备注行是获取上一步set的3个值:rate、interval、type,如果这3个值没有设置,直接返回rateLimiter没有被初始化。 第5备注行声明一个变量叫valueName 值为KEYS[2],KEYS[2]对应的值是getValueName()方法,getValueName()返回的就是上面第一步getRateLimiter我们设置的key;如果type=1,表示全局共享,那么v...
RateLimiter通过线程锁控制同步,只适用于单机应用,在分布式环境下,虽然有像阿里Sentinel的限流开源框架,但对于一些小型应用来说未免过重,但限流的需求在小型项目中也是存在的,比如获取手机验证码的控制,对资源消耗较大操作的访问频率控制等。本文介绍最近写的一个基于RateLimiter,适用于分布式环境下的限流实现,并使用sprin...
publicclassRateLimiterTest{privatestaticfinalSimpleDateFormatFORMATTER=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");privatestaticfinalintTHREAD_COUNT=25;@TestpublicvoidtestRateLimiter1(){RateLimiterrateLimiter=RateLimiter.create(5);Thread[]ts=newThread[THREAD_COUNT];for(inti=0;i<THREAD_COUNT;i++){t...
1、使用guava提供工具库里的RateLimiter类(内部采用令牌捅算法实现)进行限流 <!--核心代码片段-->private RateLimiter rateLimiter = RateLimiter.create(400);//400表示每秒允许处理的量是400 if(rateLimiter.tryAcquire()) { //短信发送逻辑可以在此处 } 2、使用Java自带delayqueue的延迟队列实现(编码过程相对麻烦,...
令牌桶算法是一种常见的限流算法,它基于一个令牌桶来控制请求的速率。在令牌桶算法中,令牌桶以固定的速率生成令牌,并将这些令牌存储在桶中。每当一个请求到达时,它必须从桶中获取一个令牌才能被处理。如果桶中没有足够的令牌,请求将被拒绝。 在Java中,可以使用Guava库中的RateLimiter类来实现令牌桶算法。RateLimite...
本文介绍一个轻量级的分布式限流实现,基于RateLimiter原理,并采用spring-boot-starter发布。此实现包含两种限流方式:限速控制和限量控制。限速控制基于令牌桶模型,与RateLimiter相似,包括关键属性与方法。令牌桶模型存储在Redis中,并通过分布式锁同步操作,确保分布式环境下的稳定性。工厂类管理缓存的令牌桶...
系统为分布式集群,需要控制整个分布式集群总的接口调用频率满足以上限制 Guava RateLimiter 上篇文章 《Guava RateLimiter源码解析》中介绍了Guava RateLimiter的用法及原理,但为什么不直接使用Guava RateLimiter?原因有二: Guava RateLimiter只能应用于单进程,多进程间协同控制便无能为力 ...
RateLimiter的原理类似于令牌桶,它主要由许可发出的速率来定义,如果没有额外的配置,许可证将按每秒许可证规定的固定速度分配,许可将被平滑地分发,若请求超过permitsPerSecond则RateLimiter按照每秒 1/permitsPerSecond 的速率释放许可。 ...
ratelimiter-spring-boot-starter 基于redis 的偏业务应用的分布式限流组件,目前支持时间窗口、令牌桶 两种限流算法。使得项目拥有分布式限流能力变得很简单。限流的场景有很多,常说的限流一般指网关限流,控制好洪峰流量,以免打垮后方应用。这里突出偏业务应用的分布式限流 的原因,是因为区别于网关限流,业务侧限流可以轻松根...
ratelimiter-spring-boot-starter 基于redis 的偏业务应用的分布式限流组件,使得项目拥有分布式限流能力变得很简单。限流的场景有很多,常说的限流一般指网关限流,控制好洪峰流量,以免打垮后方应用。这里突出偏业务应用的分布式限流的原因,是因为区别于网关限流,业务侧限流可以轻松根据业务性质做到细粒度的流量控制。比如如下场...