java实现接口限流方案:限流算法之令牌桶法
java实现接口限流方案:限流算法之令牌桶法实现关键点:令牌桶算法示意图今天简单解释另一种令牌桶法,系统会以一定的速率往桶里添加令牌,处理请求前,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则返回失败。大概描述如下:下面就是一个简单的示意图:
限流算法之令牌桶法(Java实现)
前面2篇说过限速算法,可以参考以下:
限流算法之计数器算法(Java实现)
限流算法之滑动窗口法(Java实现)
令牌桶算计介绍今天简单解释另一种令牌桶法,系统会以一定的速率往桶里添加令牌,处理请求前,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则返回失败。
大概描述如下:
- 所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;
- 获取不到令牌,则请求返回失败
- 根据限流大小,设置按照一定的速率往桶里添加令牌;
- 桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃或者拒绝;
下面就是一个简单的示意图:
令牌桶算法示意图
实现一个简单的令牌桶算法实现关键点:
- 初始化固定数量的令牌放入令牌桶中
- 初始化和开启一个定时的任务,定时往令牌桶添加令牌
- 提供一个获取令牌的方法,获取一个令牌,令牌桶中减一,如果令牌桶中为空,返回失败
还是说干就干,以下就是简单的实现TokenLimiter,
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.