![6d375d6869c9712b45959d34ed895c7d.png](https://i-blog.csdnimg.cn/blog_migrate/2d590496b749735a17466d3a4c487a8a.jpeg)
限流算法之令牌桶法(Java实现)
前面2篇说过限速算法,可以参考以下:
限流算法之计数器算法(Java实现)
限流算法之滑动窗口法(Java实现)
令牌桶算计介绍
今天简单解释另一种令牌桶法,系统会以一定的速率往桶里添加令牌,处理请求前,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则返回失败。
大概描述如下:
- 所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;
- 获取不到令牌,则请求返回失败
- 根据限流大小,设置按照一定的速率往桶里添加令牌;
- 桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃或者拒绝;
下面就是一个简单的示意图:
![2404083506718de5bc81d5edd7f5ca9d.png](https://i-blog.csdnimg.cn/blog_migrate/d3ad7d239279e9531007e9fb27c3f356.jpeg)
令牌桶算法示意图
实现一个简单的令牌桶算法
实现关键点:
- 初始化固定数量的令牌放入令牌桶中
- 初始化和开启一个定时的任务,定时往令牌桶添加令牌
- 提供一个获取令牌的方法,获取一个令牌,令牌桶中减一,如果令牌桶中为空,返回失败
还是说干就干,以下就是简单的实现TokenLimiter,
![8db7ba01633c8cbae04d72b151ee2d3e.png](https://i-blog.csdnimg.cn/blog_migrate/3dfdd567c669d60eeb2967f950ba1efb.jpeg)
TokenLimiter
Google提供的Guava中的SmoothRateLimiter就是用来限流的,算法就是令牌桶算法,有时间分析一下SmoothRateLimiter的实现原理。RateLimiter类的注解如下:
A rate limiter. Conceptually, a rate limiter distributes permits at a configurable rate. Each acquire() blocks if necessary until a permit is available, and then takes it. Once acquired, permits need not be released.