本文简要概述ratelimiter-starter限流组件的实现思路,文末附有源码可直接访问并下载使用。
1、限流维度
- 接口: 针对某个接口进行每秒钟总访问次数做限制,不区分用户。
- 用户: 用户级限流针对的该用户对整个系统的访问频次做限制,不区分接口。
如何标识1个用户?
1、基于IP识别(默认);
2、基于Cookie识别(可选);
3、用户自定义。
2、实现思路
-
限流组件以starter形式对外提供。
-
引入依赖:
1、SpringBoot(强依赖):基础框架。
2、Google Guava(强依赖):基于RateLimter限流器实现。
3、Caffeine(强依赖):本地缓存,用于存储限流器。基于容量和时间的清除策略,清除Cache中最近最少使用的限流器。 -
基于过滤器实现
UriRateLimterFilter
功能描述: 针对接口级限流。
优先级: 默认1(先执行),支持修改。
执行流程:
1、服务启动后加载限流配置到内存。
配置方式:直接读取配置。
注解方式:通过扫描类读取注解及注解值的方式加载限流配置。
2、根据配置进行限流器实例化并加入Cache中。
此Cache使用Map即可。
3、执行频率限制校验。UserRateLimterFilter
功能描述: 针对用户级限流。
优先级: 默认2(后执行),支持修改。
执行流程:
1、用户访问系统时从Cache中根据用户标识获取限流器。
2、如果获取不到则临时创建1个并加入Cache中。
考虑到C端用户量可能很大,当Cache容量满时会自动清除最近最少使用的限流器。
只针对集群的节点进行限流,暂不支持分布式限流。
3、执行频率限制校验。
3、源码地址
https://gitee.com/gwqin/ratelimiter-starter