Java 實(shí)現(xiàn)限流器處理Rest接口請(qǐng)求詳解流程
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)文章
Mybatis實(shí)現(xiàn)動(dòng)態(tài)SQL編寫的示例詳解
這篇文章主要為大家詳細(xì)介紹了mybatis中的動(dòng)態(tài)sql的使用以及緩存的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-02-02JAVA中 Spring定時(shí)器的兩種實(shí)現(xiàn)方式
本文向您介紹Spring定時(shí)器的兩種實(shí)現(xiàn)方式,包括Java Timer定時(shí)和Quartz定時(shí)器,兩種Spring定時(shí)器的實(shí)現(xiàn)方式各有優(yōu)點(diǎn),可結(jié)合具體項(xiàng)目考慮是否采用。2015-09-09javaweb學(xué)習(xí)總結(jié)——使用JDBC處理MySQL大數(shù)據(jù)
本篇文章主要介紹了JDBC處理MySQL大數(shù)據(jù),有時(shí)是需要用程序把大文本或二進(jìn)制數(shù)據(jù)直接保存到數(shù)據(jù)庫中進(jìn)行儲(chǔ)存的,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-11-11springboot2.0配置連接池(hikari、druid)的方法
springboot 2.0 默認(rèn)連接池就是Hikari了,直接在配置文件中輸入配置就可以了,本文通過實(shí)例代碼給大家介紹了springboot2.0配置連接池(hikari、druid)的方法,感興趣的朋友一起看看吧2021-12-12簡(jiǎn)單談?wù)刯ava的異常處理(Try Catch Finally)
在程序設(shè)計(jì)中,進(jìn)行異常處理是非常關(guān)鍵和重要的一部分。一個(gè)程序的異常處理框架的好壞直接影響到整個(gè)項(xiàng)目的代碼質(zhì)量以及后期維護(hù)成本和難度。2016-03-03SpringBoot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)
這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04springboot mybatis-plus實(shí)現(xiàn)登錄接口
本文主要介紹了springboot mybatis-plus實(shí)現(xiàn)登錄接口,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11