91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java如何實現限流器處理Rest接口請求

發布時間:2021-11-02 13:52:36 來源:億速云 閱讀:142 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“Java如何實現限流器處理Rest接口請求”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Java如何實現限流器處理Rest接口請求”這篇文章吧。

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);
  // 請求監視器
  private final Monitor requestMoniter = new Monitor();
  // 處理監視器
  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) {
    // 請求監視器,創建監視向導,隊列數據量小于上限
    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("請求隊列已經上限,請稍后重試!");
    }
  }
 
  // 處理請求方法
  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的任務隊列,增加了監視器。

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() + ":處理數據 -> " + y.toString()));
                          }
                        })
                    .start());
  }
}

驗證執行結果

Java如何實現限流器處理Rest接口請求

以上是“Java如何實現限流器處理Rest接口請求”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南和县| 斗六市| 万山特区| 高邮市| 定远县| 闽清县| 辽宁省| 抚远县| 阿荣旗| 石阡县| 张家口市| 天峻县| 衡阳市| 鹤峰县| 宝山区| 三亚市| 厦门市| 马龙县| 浑源县| 宁阳县| 上思县| 通海县| 克拉玛依市| 阿鲁科尔沁旗| 姚安县| 峨眉山市| 清原| 浦县| 宁波市| 通道| 通城县| 翁源县| 鄂尔多斯市| 陵川县| 吴忠市| 新宁县| 龙江县| 石嘴山市| 来安县| 都匀市| 清流县|