欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年11月02日 11:37:20   作者:劍客阿良_ALiang  
在工作中是否會碰到這樣的場景,高并發(fā)的請求但是無法全部執(zhí)行,需要一定的限流。如果你是使用的微服務(wù)框架,比如SpringCloud,可以使用Gateway增加限流策略來解決。本篇文章是在沒有框架的情況實現(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:
 * 請求限流器 @Version: V1.0
 */
public class RequestRateLimiter {
  // 請求隊列
  private final ConcurrentLinkedQueue<Request> bucket = new ConcurrentLinkedQueue<>();
  // 隊列上限
  private static final int BUCKET_CAPACITY = 100;
  // 漏桶下沿水流速度
  private final RateLimiter rateLimiter = RateLimiter.create(10.0D);
  // 請求監(jiān)視器
  private final Monitor requestMoniter = new Monitor();
  // 處理監(jiān)視器
  private final Monitor handleMoniter = new Monitor();
 
  /** 請求實體 */
  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) {
    // 請求監(jiān)視器,創(chuàng)建監(jiān)視向?qū)?,隊列?shù)據(jù)量小于上限
    if (requestMoniter.enterIf(requestMoniter.newGuard(() -> bucket.size() < BUCKET_CAPACITY))) {
      try {
        boolean result = bucket.offer(request);
        if (result) {
          System.out.println("成功向隊列加入新的請求!" + Thread.currentThread() + " request:" + request);
        } else {
          System.out.println("加入新請求失?。?);
        }
      } finally {
        requestMoniter.leave();
      }
    } else {
      // 隊列已滿
      // System.out.println("請求隊列已經(jī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、有個長度100的任務(wù)隊列,增加了監(jiān)視器。

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

驗證代碼

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());
  }
}

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

總結(jié)

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

如果本文對你有用的,請不要吝嗇你的贊,謝謝支持。

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

相關(guān)文章

  • Mybatis實現(xiàn)動態(tài)SQL編寫的示例詳解

    Mybatis實現(xiàn)動態(tài)SQL編寫的示例詳解

    這篇文章主要為大家詳細介紹了mybatis中的動態(tài)sql的使用以及緩存的相關(guān)知識,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,需要的可以參考一下
    2023-02-02
  • JAVA中 Spring定時器的兩種實現(xiàn)方式

    JAVA中 Spring定時器的兩種實現(xiàn)方式

    本文向您介紹Spring定時器的兩種實現(xiàn)方式,包括Java Timer定時和Quartz定時器,兩種Spring定時器的實現(xiàn)方式各有優(yōu)點,可結(jié)合具體項目考慮是否采用。
    2015-09-09
  • javaweb學(xué)習(xí)總結(jié)——使用JDBC處理MySQL大數(shù)據(jù)

    javaweb學(xué)習(xí)總結(jié)——使用JDBC處理MySQL大數(shù)據(jù)

    本篇文章主要介紹了JDBC處理MySQL大數(shù)據(jù),有時是需要用程序把大文本或二進制數(shù)據(jù)直接保存到數(shù)據(jù)庫中進行儲存的,非常具有實用價值,需要的朋友可以參考下。
    2016-11-11
  • springboot2.0配置連接池(hikari、druid)的方法

    springboot2.0配置連接池(hikari、druid)的方法

    springboot 2.0 默認連接池就是Hikari了,直接在配置文件中輸入配置就可以了,本文通過實例代碼給大家介紹了springboot2.0配置連接池(hikari、druid)的方法,感興趣的朋友一起看看吧
    2021-12-12
  • 簡單談?wù)刯ava的異常處理(Try Catch Finally)

    簡單談?wù)刯ava的異常處理(Try Catch Finally)

    在程序設(shè)計中,進行異常處理是非常關(guān)鍵和重要的一部分。一個程序的異常處理框架的好壞直接影響到整個項目的代碼質(zhì)量以及后期維護成本和難度。
    2016-03-03
  • Java集合的定義與Collection類使用詳解

    Java集合的定義與Collection類使用詳解

    這篇文章主要介紹了Java集合的定義及Collection工具類使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • 用Java生成二維碼并附帶文字信息

    用Java生成二維碼并附帶文字信息

    這篇文章主要介紹了用Java生成二維碼并附帶文字信息,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringBoot實現(xiàn)動態(tài)定時任務(wù)

    SpringBoot實現(xiàn)動態(tài)定時任務(wù)

    這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)動態(tài)定時任務(wù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java中break的第三種用法說明

    Java中break的第三種用法說明

    這篇文章主要介紹了Java中break的第三種用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • springboot mybatis-plus實現(xiàn)登錄接口

    springboot mybatis-plus實現(xiàn)登錄接口

    本文主要介紹了springboot mybatis-plus實現(xiàn)登錄接口,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11

最新評論