来源:https://mrbird.cc/Guava-RateLimiter.html Google Guava提供的RateLimiter使用的是令牌桶算法。...RateLimiter常用于限制访问资源的速率。...RateLimiter使用示例 下面是一个RateLimiter的简单使用示例: public class RateLimiterTest { // 1秒钟产生0.5张令牌 private...final static RateLimiter limiter = RateLimiter.create(0.5); public static void main(String[] args...RateLimiter limiter = RateLimiter.create(1); System.out.println(limiter.acquire(4));
流量预热的做法 我们以Guava中的RateLimiter为例,看看流量预热在RateLimiter中是如何运作的,我们用下面的状态转换图来展示整个过程: 横坐标是令牌桶的当前容量,纵坐标是令牌发放速率...RateLimiter正是通过这种方式来控制令牌发放的时间间隔,从而使流量的变化更加平滑。 核心代码 理解了预热模型的运作流程之后,我们来看一下具体代码是如何实现的。...maxPermits//初始化的状态是3x间隔 : storedPermits * maxPermits / oldMaxPermits; } } 通过上面的两个函数,RateLimiter
常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前都从桶中获取令牌,只有取到令牌的请求才会被成功响应...本次实战,我们用的是guava的RateLimiter,场景是spring mvc在处理请求时候,从桶中申请令牌,申请到了就成功响应,申请不到时直接返回失败; 对于的源码可以在我的git下载,地址是:https...rateLimiter = RateLimiter.create(5.0); /** * 尝试获取令牌 * @return */ public boolean...tryAcquire(){ return rateLimiter.tryAcquire(); } } 调用方是个普通的controller,每次收到请求的时候都尝试去获取令牌,...还有一点要注意,我们通过RateLimiter.create(5.0)配置的是每一秒5枚令牌,但是限流的时候发出的是6枚,改用其他值验证,也是实际的比配置的大1。
RateLimiter的核心思路 如下图所示,我创建一个1秒产生0.1的RateLimiter(即10秒产生1个),左边是时间轴,现在有3个线程申请数据,nextFreeTicketMicros初始化为...先设置nextFreeTicketMicros,在sleep(如果需要的话) Demo //创建一个一秒产生0.1个令牌的实例 RateLimiter rateLimiter = RateLimiter.create...(1)); RateLimiter初始化 1调用RateLimiter.create方法,传入参数0.1,表示每秒允许0.1个令牌,即10秒创建1个令牌 //每秒创建0.1个令牌,即10秒创建一个令牌...RateLimiter rateLimiter = RateLimiter.create(0.1); 其中permitsPersecond = 0.1 public static RateLimiter...(stopwatch, 1.0 /* maxBurstSeconds */); rateLimiter.setRate(permitsPerSecond); return rateLimiter
使用 Redis + Lua 脚本的方式可以简单的实现 Guava RateLimiter guava RateLimiter 作为抽象类有个子类 SmoothRateLimiter, 这是个抽象类并且又两个实现类...RateLimiter只有两个属性: // 用于计时,RateLimiter 把实例化的时间设置为 0 值,后续都是取相对时间,用微秒表示。...Object mutexDoNotUseDirectly; SmoothRateLimiter SmoothRateLimiter 作为抽象类继承于 RateLimiter。...rateLimiter = new SmoothBursty(stopwatch, 1.0 /* maxBurstSeconds */); rateLimiter.setRate(permitsPerSecond...参考资料 Guava限流器RateLimiter中mutexDoNotUseDirectly/锁的使用
18-06-21 18:21:17 Accessing: 6 --- 18-06-21 18:21:17 Accessing: 7 --- 18-06-21 18:21:22 六、Semaphore和RateLimiter...RateLimiter:这是guava的,直译是速率限制器。其作用是 限制一秒内只能有N个线程执行,超过了就只能等待下一秒。注意,N是double类型。...======================================== Semaphore:从线程个数限流 RateLimiter:从速率限流 目前常见的算法是漏桶算法和令牌算法 令牌桶算法...RateLimiter来实现
序 本文主要研究一下Guava的RateLimiter RateLimiter guava-26.0-jre-sources.jar!.../com/google/common/util/concurrent/RateLimiter.java @Beta @GwtIncompatible public abstract class RateLimiter...{ //...... /** * Acquires the given number of permits from this {@code RateLimiter}, blocking...* The maximum number of permits that can be saved (when the RateLimiter is unused) is defined in...RateLimiter.html Rate-Limiter
RateLimiter 限流 RateLimiter 是基于令牌桶实现的限速。...RateLimiterTest { public static void main(String[] args) { RateLimiter rateLimiter = RateLimiter.create...{ public static void main(String[] args) { RateLimiter rateLimiter = RateLimiter.create...rateLimiter = RateLimiter.create(5); System.out.println("sleep 5秒"); Uninterruptibles.sleepUninterruptibly...class RateLimiterTest { public static void main(String[] args) { RateLimiter rateLimiter
本次要介绍的RateLimiter使用的是令牌桶算法。...RateLimiter是google的guava包中的一个轻巧限流组件,它主要有两个java类文件,RateLimiter.java和SmoothRateLimiter.java。...final RateLimiter rateLimiter = RateLimiter.create(2.0); // 创建一个每秒2个许可的RateLimiter对象....final RateLimiter rateLimiter = RateLimiter.create(5000.0); // 创建一个每秒5k个许可的RateLimiter对象 void submitPacket...5.1 代码结构 整体类图如下: 图4.整体类图示意 RateLimiter类 RateLimiter类是顶级类,也是唯一暴露给使用者的类,它提供了工厂方法来创建RateLimiter方法。
写作缘由 在和某学长炫耀在自己会用Redis+Lua实现滑动窗口限流时,他说现在都用RateLimiter,所以就我就想搞个Demo,但是度娘了一下,感觉我搜索到的博客有几个个人认为不太完善的地方...源码下载 https://github.com/cbeann/Demooo/tree/master/springboot-ratelimiter 部分代码 pom <!...rateLimiter = null; if (rateHashMap.get(key) == null) { rateLimiter = RateLimiter.create...(permitsPerSecond); rateHashMap.put(key, rateLimiter); } else { rateLimiter = rateHashMap.get...(key); } boolean tryAcquire = rateLimiter.tryAcquire(timeout, TimeUnit.MILLISECONDS);
RateLimiter使用以及源码解析 Google开源工具包Guava提供了限流工具类RateLimiter,该类基于令牌桶算法实现流量限制,使用十分方便,而且十分高效。...(), permitsPerSecond); } RateLimiter是一个抽象类,SmoothBursty是其子类SmoothRateLimiter的子类,其两个构造参数含义如下 SleepingStopwatch...create(SleepingStopwatch stopwatch, double permitsPerSecond) { RateLimiter rateLimiter = new SmoothBursty...(stopwatch, 1.0 /* maxBurstSeconds */); //根据每秒向桶中放入令牌的数量来设置当前存储令牌数 rateLimiter.setRate(permitsPerSecond...rateLimiter = RateLimiter.create(Double.MAX_VALUE); /** * 带有指定注解切入 */ @ResponseBody
Cloud Alibaba实战项目》 视频教程已经录完了,涉及到Alibaba的各种中间件实战,戳这里--->Spring Cloud Alibaba 实战 视频专栏 开放订阅~ 今天来聊一聊Guava RateLimiter...Guava 是 Google 开源的 Java 类库,提供了一个工具类 RateLimiter。我们先来看看 RateLimiter 的使用,让你对限流有个感官的印象。...//限流器流速:2个请求/秒 RateLimiter limiter = RateLimiter.create(2.0); //执行任务的线程池 ExecutorService es = Executors...上面我们介绍了 Guava 是如何实现令牌桶算法的,我们的示例代码是对 Guava RateLimiter 的简化,Guava RateLimiter 扩展了标准的令牌桶算法,比如还能支持预热功能。
作者:温安适 来源:https://my.oschina.net/floor/blog/4965200 前言 本文不是一个RateLimiter的详细分析,仅仅是概要分析。...令牌桶算法 一说到RateLimiter,必然要是说的令牌桶,它的大致逻辑如下: ?...RateLimiter概要实现 我一开始是按照自己实现的逻辑,去查看Guava的RateLimiter的源码的,结果发现RateLimiter根本没有集合充当桶,核心是记录了下一令牌产生的时间与现存令牌数...nextFreeTicketMicros, waitMicros); this.storedPermits -= storedPermitsToSpend; return returnValue; } 总结:RateLimiter
Guava RateLimiter详解以及源码分析 RateLimiter使用场景介绍 首先你需要明白限流的概念,在高并发、高流量的场景中,我们的系统有时候会通过限流的手段来防止自己的系统被外部的流量打挂...而Ratelimiter是个轻量级的限流工具,提供的是单机场景下的限流方案。不过需要说明的是,Sentinel在实现上参考了部分Ratelimiter的思路。...RateLimiter原理及源码解读 RateLimiter是基于令牌桶算法实现的限流方案,如下图所示: ?...{ RateLimiter rateLimiter = new SmoothBursty(stopwatch, 1.0 /* maxBurstSeconds */); rateLimiter.setRate...这也是RateLimiter的一个设计亮点。 具备了以上的背景知识后,再来继续看Ratelimiter暴露的接口。
常用的限流算法有令牌桶和和漏桶,而Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。...RateLimiter RateLimiter实现的令牌桶算法,不仅可以应对正常流量的限速,而且可以处理突发暴增的请求,实现平滑限流。RateLimiter方法摘要如下。...修饰符和类型 方法和描述 double acquire()从RateLimiter获取一个令牌,该方法会被阻塞直到获取到令牌 double acquire(int permits)从RateLimiter...)创建RateLimiter,permitsPerSecond指每秒可执行的数量,也指每秒放入的令牌数 static RateLimiter create(double permitsPerSecond...方案:使用RateLimiter限制发送请求的频率,假设第三方服务每秒可处理5笔请求,示例代码如下。
作者 | 温安适 来源 | https://my.oschina.net/floor/blog/4965200 前言 本文不是一个RateLimiter的详细分析,仅仅是概要分析。...令牌桶算法 一说到RateLimiter,必然要是说的令牌桶,它的大致逻辑如下: 按图实现 令牌桶的图,网上到处可见,按图实现也非常简单,无非是定时添加令牌桶,并提供一个获取令牌的函数,博主实现了一遍代码如下...} public void acqurie(){ while (TOKEN_BUCKET.poll()==null){}; } } 测试结果如下,基本满足要求 RateLimiter...概要实现 我一开始是按照自己实现的逻辑,去查看Guava的RateLimiter的源码的,结果发现RateLimiter根本没有集合充当桶,核心是记录了下一令牌产生的时间与现存令牌数,并动态更新它们。...nextFreeTicketMicros, waitMicros); this.storedPermits -= storedPermitsToSpend; return returnValue; } 总结:RateLimiter
基本使用 RateLimiter的使用很简单: //create方法传入的是每秒生成令牌的个数 RateLimiter rateLimiter= RateLimiter.create(1); for (...RateLimiter rateLimiter= RateLimiter.create(1); double waitTime=rateLimiter.acquire(1000); System.out.println...的创建 先看创建RateLimiter的create方法。...rateLimiter = new SmoothBursty(stopwatch, 1.0 /* maxBurstSeconds */); rateLimiter.setRate(permitsPerSecond...而在唯品会的开源项目vjtools中,有人提出了这个问题,唯品会的同学对guava的RateLimiter进行了拓展。
以下是使用Guava RateLimiter的最佳实践: 1 创建RateLimiter对象的最佳实践 在创建RateLimiter对象时,建议使用静态工厂方法来创建,因为它提供了更清晰的API,并且允许您使用不同的参数值来创建...RateLimiter对象。...以下是使用静态工厂方法创建RateLimiter对象的示例: RateLimiter rateLimiter = RateLimiter.create(10); //每秒允许10个请求 1.1 使用 acquire...以下是使用 acquire()方法的示例: //创建RateLimiter RateLimiter rateLimiter = RateLimiter.create(10); //每秒允许10个请求...以下是使用tryAcquire()方法的示例: //创建RateLimiter RateLimiter rateLimiter = RateLimiter.create(10); //每秒允许10个请求
Guava RateLimiter Guava是Google推出的java工具包,其中提供了相当多简化开发的工具类,其中部分功能与Apache的一些工具包重合。...简单使用demo: //新建一个每秒限制3个的令牌桶 RateLimiter rateLimiter = RateLimiter.create(3.0); ThreadPoolExecutor executor...() { @Override public void run() { //获取令牌桶中一个令牌,最多等待10秒 if (rateLimiter.tryAcquire
参考 常用4种限流算法介绍及比较 超详细的Guava RateLimiter限流原理解析 限流算法简介 1.计数器(固定窗口)算法 计数器算法是使用计数器在周期内累加访问次数,当达到设定的限流值时,触发限流策略...令牌桶算法 令牌桶是按照固定速率往桶中添加令牌,请求是否被处理需要看桶中令牌是否足够,当令牌数减为零时则拒绝新的请求; 令牌桶限制的是平均流入速率,允许突发请求,只要有令牌就可以处理 Guava RateLimiter...Demo 1.平滑突发限流 public void testSmoothBursty() { RateLimiter r = RateLimiter.create(5); while...0.197538s * get 1 tokens: 0.196049s */ } 2.平滑预热限流 public void testSmoothwarmingUp() { RateLimiter...r = RateLimiter.create(2, 3, TimeUnit.SECONDS); while (true) { System.out.println("get
领取专属 10元无门槛券
手把手带您无忧上云