這篇文章主要為大家展示了“Java如何實現限流器處理Rest接口請求”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Java如何實現限流器處理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 {
// 請求隊列
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接口請求”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。