桶子能装令牌的个数有上限的,比如我的桶子最多只能装1000个令牌。
每个请求进来,就会去桶子拿一个令牌
- 比如这秒我有1001个请求,我就去桶子里边拿1001个令牌,此时可能会出现两种情况:
- 桶子里边没有1001个令牌,只有1000个,那没拿到令牌的请求只能被阻塞了(等待)
- 桶子里边有1001个令牌,所有请求都可以执行。
令牌桶算法支持网络上的突发流量
**漏桶和令牌桶的区别:**从上面的例子估计大家也能看出来了,漏桶只能以固定的速率去处理请求,而令牌桶可以以桶子最大的令牌数去处理请求
二、RateLimiter使用RateLimiter是Guava的一个限流组件,我这边的系统就有用到这个限流组件,使用起来十分方便。
引入pom依赖:
RateLimiter它是基于令牌桶算法的,API非常简单,看以下的Demo:
我们可以从结果看出,每秒只能执行三个: