Springboot限流工具之CurrentLimiting


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.自定義限流規則

在實際場景中,我們的限流規則並不只是簡單的對整個系統或單個接口進行流控,需要考慮的是更復雜的場景。例如:

  1. 對請求的目標URL進行限流(例如:某個URL每分鍾只允許調用多少次)
  2. 對客戶端的訪問IP進行限流(例如:某個IP每分鍾只允許請求多少次)
  3. 對某些特定用戶或者用戶組進行限流(例如:非VIP用戶限制每分鍾只允許調用100次某個API等)
  4. 多維度混合的限流。此時,就需要實現一些限流規則的編排機制。與、或、非等關系。

7.總結

CurrentLimiting支持單接口限流,單機限流和集群限流。基本能完成業務常用的需求。是一個非常值得選擇的限流工具。

框架源碼地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM