您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Java如何實(shí)現(xiàn)限流器處理Rest接口請求”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Java如何實(shí)現(xiàn)限流器處理Rest接口請求”這篇文章吧。
<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 { // 請求隊(duì)列 private final ConcurrentLinkedQueue<Request> bucket = new ConcurrentLinkedQueue<>(); // 隊(duì)列上限 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(); /** 請求實(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) { // 請求監(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ì)列加入新的請求!" + Thread.currentThread() + " request:" + request); } else { System.out.println("加入新請求失敗!"); } } finally { requestMoniter.leave(); } } else { // 隊(duì)列已滿 // System.out.println("請求隊(duì)列已經(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ù)隊(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é)果
以上是“Java如何實(shí)現(xiàn)限流器處理Rest接口請求”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。