该篇文章内容:
1.实现标题中提到的接口限流
2.使用压测工具jmeter给大家展现验证效果
第一部分,代码的实现
首先是导入依赖包:
<dependency> <groupId>cn.yueshutong</groupId> <artifactId>spring-boot-starter-current-limiting</artifactId> <version>0.0.1.RELEASE</version> </dependency>
然后是application.yml :
current: limiting: #开启全局限流 enabled: false #开启注解限流,可使注解失效 part-enabled: true #每秒并发量 这里的qps是全局限流开启的时候的值,如果使用注解在注解里设置QPS值 qps: 100 #开启快速失败,可切换为阻塞 fail-fast: true #系统启动保护时间为0 initial-delay: 0
然后是写测试接口,使用限流注解标记接口的并发量 QPS :
@RequestMapping("/testLimit") @CurrentLimiter(QPS = 5) public String testLimit1() throws InterruptedException { //业务处理...... return "success"; }
@CurrentLimiter(QPS = 5) 这个注解里的QPS =5 就是当前接口的每秒的并发量 。
最后再针对限流的访问做一个返回处理,新建MyCurrentLimitHandler.class :
import cn.yueshutong.springbootstartercurrentlimiting.annotation.CurrentLimiter; import cn.yueshutong.springbootstartercurrentlimiting.handler.CurrentAspectHandler; import com.alibaba.fastjson.JSONObject; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.stereotype.Component; /** * @Author : JCccc * @CreateTime : 2020/4/20 * @Description : **/ @Component public class MyCurrentLimitHandler implements CurrentAspectHandler { @Override public Object around(ProceedingJoinPoint pjp, CurrentLimiter rateLimiter) { //限流的返回数据可以自己根据需求场景设计 JSONObject jsonObject=new JSONObject(); jsonObject.put("resultCode",10011); jsonObject.put("msg","接口访问繁忙,休息一下"); return jsonObject.toString(); } }
ps: 有兴趣的可以点进源码里面看,其实是我们非常熟悉的注解方式使用AOP的环绕。
第二部分,接口限流测试
我这边使用的是 Apache JMeter 压测工具给大家做个测试(大家不想额外用这种测试工具的话,设置并发QPS=1,然后手速快一点,再配合在接口里面sleep一下,也是能测试的,不过作为东道主,我就用这些专业点的给你们展示),
设置每秒10个并发
调用看下结果:
接口调用成功的返回是 success:
因为限流返回的失败处理是:
整体的结果是:
ps:提前跟小杠们说的 不是代码里设置的每秒5个并发么,为什么成功的才4个?
这个问题不做回应。
好了,这次springboot整合Current-Limiting 实现接口限流 就到此吧,其实看到yml的配置项,是可以设置系统级别的限流,但是该篇不做介绍,这些可以自己调试下就好,都是开箱即用。
ps:
这个限流jar不同版本差异还是存在的,如果是简单的单机使用,就用0.0.1版本即可:
0.0.1.RELEASE:单点限流,注解+全局配置。
0.0.2.RELEASE:结合Redis实现集群限流,使用选举算法选出Master节点。
0.0.3.RELEASE:可自定义规则限流、增加令牌桶算法与漏桶算法的切换,纳秒级并发控制。
0.0.4.RELEASE:解决大规模限流器注册而长时间不使用导致的内存泄漏问题,定时删除过期的限流器对象,秒级。统一线程池管理,并可定义核心线程数。
0.0.5.RELEASE:去掉集群限流器的锁操作,改进令牌桶算法,实现真正的无锁限流。使用享元模式减少大量对象的创建。
0.0.6.RELEASE:使用Lua脚本减少Redis网络请求次数。
0.0.7.RELEASE:从SpringBoot2切换到SpringBoot1.5开发。
0.0.8.RELEASE:修复了0.0.7版本的集群限流失效bug。