该篇文章内容:
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一下,也是能测试的,不过作为东道主,我就用这些专业点的给你们展示),
设置每秒100个并发
调用看下结果:
接口调用成功的返回是 success:
因为限流返回的失败处理是:
整体的结果是:
ps:提前跟小杠们说的 不是代码里设置的每秒5个并发么,为什么成功的才4个?
这个问题不做回应。
好了,这次springboot整合Current-Limiting 实现接口限流 就到此吧,其实看到yml的配置项,是可以设置系统级别的限流,但是该篇不做介绍,这些可以自己调试下就好,都是开箱即用。
转载:https://blog.csdn.net/qq_35387940/article/details/105639258
查看评论