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支持單接口限流,單機限流和集群限流。基本能完成業務常用的需求。是一個非常值得選擇的限流工具。
