项目需要使用限流措施,查阅后主要使用令牌桶算法实现,为了更灵活的实现限流,就自
己实现了一个简单的基于令牌桶算法的限流实现。
令牌桶算法描述
令牌桶这种控制机制基于令牌桶中是否存在令牌来指示什么时候可以发送流量。令牌桶中
的每一个令牌都代表一个字节。如果令牌桶中存在令牌,则允许发送流量;而如果令牌桶
中不存在令牌,则不允许发送流量。因此,如果突发门限被合理地配置并且令牌桶中有足
够的令牌,那么流量就可以以峰值速率发送。
令牌桶算法图描述
简单的说就是,一边请求时会消耗桶内的令牌,另一边会以固定速率往桶内放令牌。
当消耗的请求大于放入的速率时,进行相应的措施,比如等待,或者拒绝等。
Java 的简单实现
为了更灵活的定制限流措施,自己实现了限流的部分代码,如下:
/**
* @author xiezhengchao
* @since 18/1/3 上午 9:45.
* 限流器
*/
public class RateLimiter{
private volatile int token;
private final int originToken;
private static Unsafe unsafe = null;
private static final long valueOffset;
private final Object lock = new Object();
static {
try {
// 应用开发中使用 unsafe 对象必须通过反射获取
Class<?> clazz = Unsafe.class;
Field f = clazz.getDeclaredField("theUnsafe");
f.setAccessible(true);
unsafe = (Unsafe) f.get(clazz);
valueOffset =
unsafe.objectFieldOffset(RateLimiter.class.getDeclaredField("toke
n"));
} catch (Exception ex) {throw new Error(ex);}
}
评论1