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

Java 實(shí)現(xiàn)限流器處理Rest接口請(qǐng)求詳解流程

 更新時(shí)間:2021年11月02日 11:37:20   作者:劍客阿良_ALiang  
在工作中是否會(huì)碰到這樣的場(chǎng)景,高并發(fā)的請(qǐng)求但是無法全部執(zhí)行,需要一定的限流。如果你是使用的微服務(wù)框架,比如SpringCloud,可以使用Gateway增加限流策略來解決。本篇文章是在沒有框架的情況實(shí)現(xiàn)限流器

Maven依賴

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.0.1-jre</version>
        </dependency>

代碼

上代碼,不廢話。

首先是限流器代碼。

package com.huyi.csdn.tools.rate;
 
import com.google.common.util.concurrent.Monitor;
import com.google.common.util.concurrent.RateLimiter;
 
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.function.Consumer;
 
/**
 * @Program: csdn @ClassName: RequestRateLimiter @Author: huyi @Date: 2021-10-30 22:16 @Description:
 * 請(qǐng)求限流器 @Version: V1.0
 */
public class RequestRateLimiter {
  // 請(qǐng)求隊(duì)列
  private final ConcurrentLinkedQueue<Request> bucket = new ConcurrentLinkedQueue<>();
  // 隊(duì)列上限
  private static final int BUCKET_CAPACITY = 100;
  // 漏桶下沿水流速度
  private final RateLimiter rateLimiter = RateLimiter.create(10.0D);
  // 請(qǐng)求監(jiān)視器
  private final Monitor requestMoniter = new Monitor();
  // 處理監(jiān)視器
  private final Monitor handleMoniter = new Monitor();
 
  /** 請(qǐng)求實(shí)體 */
  public static class Request {
    private int data;
 
    public Request(int data) {
      this.data = data;
    }
 
    @Override
    public String toString() {
      return "Request{" + "data=" + data + '}';
    }
  }
 
  public void submitRequest(int data) {
    this.submitRequest(new Request(data));
  }
 
  public void submitRequest(Request request) {
    // 請(qǐng)求監(jiān)視器,創(chuàng)建監(jiān)視向?qū)?,?duì)列數(shù)據(jù)量小于上限
    if (requestMoniter.enterIf(requestMoniter.newGuard(() -> bucket.size() < BUCKET_CAPACITY))) {
      try {
        boolean result = bucket.offer(request);
        if (result) {
          System.out.println("成功向隊(duì)列加入新的請(qǐng)求!" + Thread.currentThread() + " request:" + request);
        } else {
          System.out.println("加入新請(qǐng)求失??!");
        }
      } finally {
        requestMoniter.leave();
      }
    } else {
      // 隊(duì)列已滿
      // System.out.println("請(qǐng)求隊(duì)列已經(jīng)上限,請(qǐng)稍后重試!");
    }
  }
 
  // 處理請(qǐng)求方法
  public void handleRequest(Consumer<Request> consumer) {
    if (handleMoniter.enterIf(handleMoniter.newGuard(() -> !bucket.isEmpty()))) {
      try {
        // 勻速處理
        rateLimiter.acquire();
        consumer.accept(bucket.poll());
      } finally {
        handleMoniter.leave();
      }
    }
  }
}

代碼說明

1、有個(gè)長(zhǎng)度100的任務(wù)隊(duì)列,增加了監(jiān)視器。

2、添加了限流器,限流為10。

驗(yàn)證代碼

package com.huyi.csdn.tools.rate;
 
import java.time.LocalTime;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;
 
/**
 * @Program: csdn @ClassName: TestRateLimiter @Author: huyi @Date: 2021-10-30
 * 22:35 @Description: @Version: V1.0
 */
public class TestRateLimiter {
  private static final AtomicInteger DATA = new AtomicInteger(0);
  private static final RequestRateLimiter HANDLE = new RequestRateLimiter();
 
  public static void main(String[] args) {
    IntStream.range(0, 10)
        .forEach(
            (x) ->
                new Thread(
                        () -> {
                          while (true) {
                            HANDLE.submitRequest(DATA.getAndIncrement());
                            try {
                              TimeUnit.MILLISECONDS.sleep(100);
                            } catch (InterruptedException e) {
                              e.printStackTrace();
                            }
                          }
                        })
                    .start());
 
    IntStream.range(0, 20)
        .forEach(
            (x) ->
                new Thread(
                        () -> {
                          while (true) {
                            HANDLE.handleRequest(
                                y ->
                                    System.out.println(
                                        LocalTime.now() + ":處理數(shù)據(jù) -> " + y.toString()));
                          }
                        })
                    .start());
  }
}

驗(yàn)證執(zhí)行結(jié)果

總結(jié)

胸中一點(diǎn)浩然氣,天地千里快哉風(fēng)。

如果本文對(duì)你有用的,請(qǐng)不要吝嗇你的贊,謝謝支持。

到此這篇關(guān)于Java 實(shí)現(xiàn)限流器處理Rest接口請(qǐng)求詳解流程的文章就介紹到這了,更多相關(guān)Java Rest接口請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Java visualVM監(jiān)控遠(yuǎn)程JVM的流程分析

    使用Java visualVM監(jiān)控遠(yuǎn)程JVM的流程分析

    我們經(jīng)常需要對(duì)我們的開發(fā)的軟件做各種測(cè)試, 軟件對(duì)系統(tǒng)資源的使用情況更是不可少,JDK1.6開始自帶的VisualVM就是不錯(cuò)的監(jiān)控工具,本文給大家分享使用Java visualVM監(jiān)控遠(yuǎn)程JVM的問題,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • Spring mvc Controller和RestFul原理解析

    Spring mvc Controller和RestFul原理解析

    這篇文章主要介紹了Spring mvc Controller和RestFul原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java鏈表的頭插法和尾插法詳解

    java鏈表的頭插法和尾插法詳解

    本文介紹了鏈表的基本概念,包括節(jié)點(diǎn)類Listnode和鏈表類Linklist,頭插法和尾插法是兩種常見的插入節(jié)點(diǎn)的方法,分別通過頭指針和游標(biāo)來實(shí)現(xiàn),通過示例代碼和測(cè)試,展示了鏈表的創(chuàng)建和操作過程
    2024-12-12
  • java實(shí)現(xiàn)的漢字轉(zhuǎn)五筆功能實(shí)例

    java實(shí)現(xiàn)的漢字轉(zhuǎn)五筆功能實(shí)例

    這篇文章主要介紹了java實(shí)現(xiàn)的漢字轉(zhuǎn)五筆功能,結(jié)合具體實(shí)例形式分析了java基于字符串遍歷與編碼轉(zhuǎn)換等操作實(shí)現(xiàn)五筆編碼獲取的相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • idea創(chuàng)建spring boot項(xiàng)目及java版本只能選擇17和21的問題

    idea創(chuàng)建spring boot項(xiàng)目及java版本只能選擇17和21的問題

    這篇文章主要介紹了idea創(chuàng)建spring boot項(xiàng)目及java版本只能選擇17和21的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • Java通過百度地圖API獲取定位(普通IP定位)的方法教程

    Java通過百度地圖API獲取定位(普通IP定位)的方法教程

    這篇文章主要介紹了Java通過百度地圖API獲取定位的方法教程,首先說明了實(shí)現(xiàn)這個(gè)功能的需求和初衷,然后詳細(xì)描述了利用百度地圖API實(shí)現(xiàn)這個(gè)功能的步驟,包括在百度地圖開放平臺(tái)的準(zhǔn)備工作、學(xué)習(xí)官網(wǎng)API文檔、修改API的AK配置、Java代碼獲取定位等,需要的朋友可以參考下
    2024-11-11
  • 使用sts工具、SpringBoot整合mybatis的詳細(xì)步驟

    使用sts工具、SpringBoot整合mybatis的詳細(xì)步驟

    這篇文章主要介紹了使用sts工具、SpringBoot整合mybatis的詳細(xì)步驟,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java如何限制IP訪問頁面

    Java如何限制IP訪問頁面

    這篇文章主要介紹了Java如何限制IP訪問頁面,幫助大家完成需求,實(shí)現(xiàn)白名單,感興趣的朋友可以了解下
    2020-09-09
  • Java中的@builder建造者模式詳細(xì)解析

    Java中的@builder建造者模式詳細(xì)解析

    這篇文章主要介紹了Java中的@builder建造者模式詳細(xì)解析,使用 @Builder 注解可以簡(jiǎn)化手動(dòng)編寫建造者模式的代碼,使代碼更加簡(jiǎn)潔易讀,它可以自動(dòng)生成鏈?zhǔn)秸{(diào)用的方法來設(shè)置對(duì)象的屬性,并且可以在需要時(shí)進(jìn)行可選屬性的設(shè)置,需要的朋友可以參考下
    2024-01-01
  • SpringBoot之?dāng)r截器與過濾器解讀

    SpringBoot之?dāng)r截器與過濾器解讀

    這篇文章主要介紹了SpringBoot之?dāng)r截器與過濾器解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論

台山市| 丰县| 临城县| 莱阳市| 静海县| 雅江县| 克什克腾旗| 固始县| 融水| 绥棱县| 隆回县| 贡觉县| 焉耆| 广昌县| 拉萨市| 云林县| 桐梓县| 阿坝县| 山丹县| 林口县| 泰安市| 婺源县| 汝南县| 道孚县| 揭阳市| 永顺县| 宁津县| 新干县| 宁德市| 涡阳县| 游戏| 青州市| 大同市| 若羌县| 平罗县| 施甸县| 上栗县| 河曲县| 曲靖市| 崇阳县| 虎林市|