Springboot 整合 Current-Limiting 实现接口限流
#系统启动保护时间为 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:可自定义规则限流、增加令牌桶算法与漏桶算法的切换,纳秒级并发控制。
评论