目录:
- 限流原理
- 知识点
- 具体实现
- 结语
内容:
1、限流原理 -- 令牌桶算法
令牌桶算法的原理是系统会以一个恒定的速度(每秒生成一个令牌)往桶里放入令牌。当有访问者(针对于 IP)要访问接口时,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。 当桶满时,新添加的令牌被丢弃或拒绝。
2、知识点
- Springboot
- Guava -- RateLimiter
- Interceptor(拦截器)
3、具体实现
1)先写一个限流 Service -- LoadingCacheService,代码如下:
@Service
public class LoadingCacheService {
private final Logger logger = LoggerFactory.getLogger(LoadingCacheService.class);
private LoadingCache<String, RateLimiter> ipRequestCaches = CacheBuilder.newBuilder()
// 设置缓存上限
.maximumSize(10000)
// 设置一分钟对象没有被读/写访问则对象从内存中删除
.expireAfterAccess(1, TimeUnit.MINUTES)
// CacheLoader 类实现自动加载
.build(new CacheLoader<String, RateLimiter>() {
@Override
public RateLimiter load(String s) {
// 新的 IP 初始化 (限流每秒生成 2 个令牌)
return RateLimiter.create(2);