天天看點

Springboot 整合 Current-Limiting 實作接口限流

該篇文章内容:

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個并發

Springboot 整合 Current-Limiting 實作接口限流

調用看下結果:

接口調用成功的傳回是 success:

Springboot 整合 Current-Limiting 實作接口限流

因為限流傳回的失敗處理是:

Springboot 整合 Current-Limiting 實作接口限流

整體的結果是:

Springboot 整合 Current-Limiting 實作接口限流

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開發。

繼續閱讀