令牌桶算法图例
a. 按特定的速率向令牌桶投放令牌
b. 根据预设的匹配规则先对报文进行分类,不符合匹配规则的报文不需要经过令牌桶的处理,直接发送;
c. 符合匹配规则的报文,则需要令牌桶进行处理。当桶中有足够的令牌则报文可以被继续发送下去,同时令牌桶中的令牌 量按报文的长度做相应的减少;
d. 当令牌桶中的令牌不足时,报文将不能被发送,只有等到桶中生成了新的令牌,报文才可以发送。这就可以限制报文的流量只能是小于等于令牌生成的速度,达到限制流量的目的。
注意:当令牌不足时,这里报文:
1、可以被丢弃
2、可以排放在队列中以便当令牌桶中累积了足够多的令牌时再传输
3、可以继续发送,但需要做特殊标记,网络过载的时候将这些特殊标记的包丢弃
伪代码:
public classTokenBucketDemo {public long timeStamp =getNowTime();public int capacity; //桶的容量
public int rate; //令牌放入速度
public int tokens; //当前令牌数量
public booleangrant() {long now =getNowTime();//先添加令牌//min(桶的容量,当前令牌 + 上次请求获取令牌时间到当前时间内