亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot單機限流的實現(xiàn)

 更新時間:2023年08月01日 11:06:47   作者:無敵少年小旋風  
在系統(tǒng)運維中, 有時候為了避免用戶的惡意刷接口, 會加入一定規(guī)則的限流,本文主要介紹了SpringBoot單機限流的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

谷歌的 RateLimiter 介紹

使用谷歌的 guava 包中 RateLimiter 類來實現(xiàn),先來介紹一個這個類:

  • RateLimiter 是一個頻率限制器,通過配置頻率來發(fā)放許可,如果 1 秒內(nèi)可以訪問十次,那么這十次許可發(fā)送的間隔是完全相同的
  • 并發(fā)使用是安全的
  • RateLimiter 還可以去配置先處于一個預熱器,每秒增加發(fā)放的許可知道達到穩(wěn)定的頻率
  • RateLimiter 不影響請求本身的節(jié)流,而是影響下一次請求的節(jié)流,比如當前任務如果占用許可較多,到達 RateLimiter 之后,會立即占用,當下一個請求到達 RateLimiter 時就會經(jīng)歷節(jié)流,因為上一個請求已經(jīng)占用大量的許可。

一個小示例用法,如果想要發(fā)送一組數(shù)據(jù),我們限制他在 5kb 每秒:

// 給每一個字節(jié)發(fā)放 1 個許可,限制在 5kb 每秒的話,只需要每秒發(fā)放 5000 個許可即可
final RateLimiter rateLimiter = RateLimiter.create(5000.0);
void submitPacket(byte[] packet) {
   rateLimiter.acquire(packet.length);
   networkService.send(packet);
}

使用 AOP 實現(xiàn)單機限流

實現(xiàn)步驟:

  • 定義切面,攔截 Controller 層方法
  • 創(chuàng)建一個 RateLimiter,定義訪問頻率
  • 當執(zhí)行方法時,發(fā)放一個許可,如果拿不到許可,直接攔截 Controller 層方法的執(zhí)行,返回一個訪問頻繁的提示

Controller

@RestController
@RequestMapping("/rate")
public class RateController {
  @GetMapping
  public String testRate() {
    return "測試 Rate ";
  }
}

切面

@Component
@Aspect
public class ServiceLogAspect {
? ? /**
? ? ?* 對 controller 限流
? ? ?*/
? ? @Pointcut("execution(* com.javagpt.back.controller.*.*(..))")
? ? public void rateLimitPointCut() {}
? ? private static final RateLimiter rateLimiter = RateLimiter.create(10);
? ? @SneakyThrows // 使用之后不需要拋出異常,lombok會自動在編譯時加上try/catch
? ? @Around("rateLimitPointCut()")
? ? public Object rateLimit(ProceedingJoinPoint joinPoint) {
? ? ? ? double rate = rateLimiter.getRate();
? ? ? ? System.out.println(rate);
? ? ? ? if (rateLimiter.tryAcquire()) {
? ? ? ? ? ? return joinPoint.proceed();
? ? ? ? } else {
? ? ? ? ? ? // 如果超出限流次數(shù),攔截方法的執(zhí)行,注意這里返回的對象要和 Controller 方法的返回對象類型相同,否則會報錯
? ? ? ? ? ? return "訪問太過頻繁";
? ? ? ? }
? ? }
}

到此這篇關于SpringBoot單機限流的實現(xiàn)的文章就介紹到這了,更多相關SpringBoot單機限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java遞歸算法遍歷部門代碼示例

    Java遞歸算法遍歷部門代碼示例

    這篇文章主要介紹了Java遞歸算法遍歷部門代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Java入門基礎之常規(guī)的命名方法和變量的值及其引用

    Java入門基礎之常規(guī)的命名方法和變量的值及其引用

    這篇文章主要介紹了Java的命名方法和變量的值及其引用,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • Java代理模式實例分析

    Java代理模式實例分析

    這篇文章主要介紹了Java代理模式,結合實例形式對比分析了java代理模式的使用方法與相關操作技巧,需要的朋友可以參考下
    2019-07-07
  • SpringBoot集成Nacos的項目實踐

    SpringBoot集成Nacos的項目實踐

    本文主要介紹了SpringBoot集成Nacos的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • 詳解java裝飾模式(Decorator Pattern)

    詳解java裝飾模式(Decorator Pattern)

    這篇文章主要為大家詳細介紹了java裝飾模式Decorator Pattern,這種類型的設計模式屬于結構型模式,它是作為現(xiàn)有的類的一個包裝,對裝飾器模式感興趣的小伙伴們可以參考一下
    2016-04-04
  • 微信開發(fā)之使用java獲取簽名signature

    微信開發(fā)之使用java獲取簽名signature

    這篇文章主要為大家詳細介紹了微信開發(fā)之使用java獲取簽名signature,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Mybatis如何通過注解開啟使用二級緩存

    Mybatis如何通過注解開啟使用二級緩存

    這篇文章主要介紹了Mybatis基于注解開啟使用二級緩存,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Springboot整合Freemarker的實現(xiàn)詳細過程

    Springboot整合Freemarker的實現(xiàn)詳細過程

    這篇文章主要介紹了Springboot整合Freemarker的實現(xiàn)詳細過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • SpringCloudGateway開發(fā)過程解析

    SpringCloudGateway開發(fā)過程解析

    這篇文章主要介紹了SpringCloudGateway開發(fā)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Idea自動生成Entity實現(xiàn)過程詳解

    Idea自動生成Entity實現(xiàn)過程詳解

    這篇文章主要介紹了Idea自動生成Entity實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09

最新評論