Springboot限流工具之CurrentLimiting
1.工具简介
CurrentLimiting:基于令牌桶算法和漏桶算法实现的纳秒级分布式无锁限流插件,完美嵌入SpringBoot、SpringCloud应用,支持接口限流、方法限流、系统限流、IP限流、用户限流等规则,支持设置系统启动保护时间(保护时间内不允许访问),提供快速失败与CAS阻塞两种限流方案,开箱即用
2.引入包和配置
maven包的引入
<dependency> <groupId>cn.yueshutong</groupId> <artifactId>spring-boot-starter-current-limiting</artifactId> <version>0.0.8.RELEASE</version> </dependency>
application.yml配置
current: limiting: #开启全局限流 enabled: false #开启注解限流,可使注解失效 part-enabled: true #每秒并发量 这里的qps是全局限流开启的时候的值,如果使用注解在注解里设置QPS值 qps: 100 #开启快速失败,可切换为阻塞 fail-fast: true #系统启动保护时间为0 initial-delay: 0
3. 接口限流代码
1.接口代码 @CurrentLimiter(QPS = 2) 这个注解里的QPS =2 就是当前接口的每秒的并发量
@RestController public class MyController { @RequestMapping("/hello") @CurrentLimiter(QPS = 2) public String hello(){ return "hello"; } }
2. 拒绝策略:针对限流的访问做一个返回处理,新建MyCurrentLimitHandler.class
@Component public class MyCurrentLimitHandler implements CurrentAspectHandler { @Override public Object around(ProceedingJoinPoint pjp, CurrentLimiter rateLimiter) { //限流的返回数据可以自己根据需求场景设计 JSONObject jsonObject=new JSONObject(); jsonObject.put("code",500); jsonObject.put("msg","接口访问繁忙,休息一下"); return jsonObject.toString(); } }
4.接口限流测试
已经用jemter或者调用工具手动测试,发现每秒接口并发超过2的时候会返回我们定义的提示信息:
接口访问繁忙,休息一下
5.集群限流
集群限流的目的是对相同实例(即ApplicationName)的集群进行统一的限流,前提是已经开启并配置好Redis,直接开启即可:
spring: redis: host: 127.0.0.1 password: port: 6379 #一行开启 current: limiting: cloud-enabled: true
6.自定义限流规则
在实际场景中,我们的限流规则并不只是简单的对整个系统或单个接口进行流控,需要考虑的是更复杂的场景。例如:
- 对请求的目标URL进行限流(例如:某个URL每分钟只允许调用多少次)
- 对客户端的访问IP进行限流(例如:某个IP每分钟只允许请求多少次)
- 对某些特定用户或者用户组进行限流(例如:非VIP用户限制每分钟只允许调用100次某个API等)
- 多维度混合的限流。此时,就需要实现一些限流规则的编排机制。与、或、非等关系。
7.总结
CurrentLimiting支持单接口限流,单机限流和集群限流。基本能完成业务常用的需求。是一个非常值得选择的限流工具。
作者:森林木马
-------------------------------------------
特此声明:所有评论和私信都会在第一时间回复。也欢迎朋友们指正错误,共同进步!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
个性签名:好记性不如勤随笔,好随笔还请多关注!