最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot單機(jī)限流的實(shí)現(xiàn)

 更新時(shí)間:2023年08月01日 11:06:47   作者:無(wú)敵少年小旋風(fēng)  
在系統(tǒng)運(yùn)維中, 有時(shí)候?yàn)榱吮苊庥脩舻膼阂馑⒔涌? 會(huì)加入一定規(guī)則的限流,本文主要介紹了SpringBoot單機(jī)限流的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

谷歌的 RateLimiter 介紹

使用谷歌的 guava 包中 RateLimiter 類(lèi)來(lái)實(shí)現(xiàn),先來(lái)介紹一個(gè)這個(gè)類(lèi):

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

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

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

使用 AOP 實(shí)現(xiàn)單機(jī)限流

實(shí)現(xiàn)步驟:

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

Controller

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

切面

@Component
@Aspect
public class ServiceLogAspect {
? ? /**
? ? ?* 對(duì) controller 限流
? ? ?*/
? ? @Pointcut("execution(* com.javagpt.back.controller.*.*(..))")
? ? public void rateLimitPointCut() {}
? ? private static final RateLimiter rateLimiter = RateLimiter.create(10);
? ? @SneakyThrows // 使用之后不需要拋出異常,lombok會(huì)自動(dòng)在編譯時(shí)加上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í)行,注意這里返回的對(duì)象要和 Controller 方法的返回對(duì)象類(lèi)型相同,否則會(huì)報(bào)錯(cuò)
? ? ? ? ? ? return "訪問(wèn)太過(guò)頻繁";
? ? ? ? }
? ? }
}

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

相關(guān)文章

  • Mybatis環(huán)境配置及測(cè)試詳解

    Mybatis環(huán)境配置及測(cè)試詳解

    這篇文章主要介紹了Mybatis環(huán)境配置及測(cè)試詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • SpringBoot如何讀取配置文件中的數(shù)據(jù)到map和list

    SpringBoot如何讀取配置文件中的數(shù)據(jù)到map和list

    這篇文章主要介紹了SpringBoot如何讀取配置文件中的數(shù)據(jù)到map和list,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • JDBC增刪改查和查唯一的完整代碼解析

    JDBC增刪改查和查唯一的完整代碼解析

    這篇文章主要介紹了JDBC增刪改查和查唯一的完整代碼解析,代碼分為第四部分,每部分代碼都不錯(cuò),對(duì)jdbc增刪改查操作感興趣的朋友一起學(xué)習(xí)吧
    2016-12-12
  • 解決feign接口返回泛型設(shè)置屬性為null的問(wèn)題

    解決feign接口返回泛型設(shè)置屬性為null的問(wèn)題

    這篇文章主要介紹了解決feign接口返回泛型設(shè)置屬性為null的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • springboot整合minio實(shí)現(xiàn)文件上傳與下載且支持鏈接永久訪問(wèn)

    springboot整合minio實(shí)現(xiàn)文件上傳與下載且支持鏈接永久訪問(wèn)

    本文主要介紹了springboot整合minio實(shí)現(xiàn)文件上傳與下載且支持鏈接永久訪問(wèn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Spring之@Qualifier注解的具體使用

    Spring之@Qualifier注解的具體使用

    本文主要介紹了Spring之@Qualifier注解的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Spring Boot超詳細(xì)講解請(qǐng)求處理流程機(jī)制

    Spring Boot超詳細(xì)講解請(qǐng)求處理流程機(jī)制

    SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架,本篇讓我們一起分析請(qǐng)求處理流程機(jī)制
    2022-07-07
  • Springboot解決跨域問(wèn)題的實(shí)現(xiàn)方案

    Springboot解決跨域問(wèn)題的實(shí)現(xiàn)方案

    本文從跨域的本質(zhì)(同源策略)出發(fā),系統(tǒng)講解SpringBoot中5種主流跨域方案,每個(gè)方案包含原理解析+可運(yùn)行代碼+適用場(chǎng)景,幫你徹底解決跨域問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Java SPI簡(jiǎn)單應(yīng)用案例詳解

    Java SPI簡(jiǎn)單應(yīng)用案例詳解

    這篇文章主要介紹了Java SPI簡(jiǎn)單應(yīng)用案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 10個(gè)SpringBoot框架內(nèi)置的實(shí)用功能詳解

    10個(gè)SpringBoot框架內(nèi)置的實(shí)用功能詳解

    在 Spring Boot 開(kāi)發(fā)中,框架內(nèi)置的諸多實(shí)用功能猶如一把把利刃,能讓開(kāi)發(fā)者在項(xiàng)目的各個(gè)階段都事半功倍,這些功能無(wú)需額外集成,通過(guò)簡(jiǎn)單配置或編碼即可快速實(shí)現(xiàn)常見(jiàn)需求,下面將為你深入解析一系列極具價(jià)值的內(nèi)置功能,需要的朋友可以參考下
    2025-06-06

最新評(píng)論

普陀区| 富顺县| 无极县| 普宁市| 油尖旺区| 积石山| 腾冲县| 都江堰市| 崇左市| 五指山市| 得荣县| 左权县| 社旗县| 历史| 兴仁县| 宁城县| 莆田市| 资溪县| 桂阳县| 平遥县| 泰来县| 桂东县| 新邵县| 武陟县| 舟山市| 临清市| 鸡东县| 吉林市| 临城县| 刚察县| 神池县| 永平县| 铅山县| 巴马| 隆化县| 内江市| 德庆县| 开江县| 盘山县| 江津市| 永嘉县|