該篇文章内容:
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開發。