Java如何实现限流器处理Rest接口请求
短信预约 -IT技能 免费直播动态提醒
这篇文章主要为大家展示了“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; 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(); } } }}
代码说明
有个长度100的任务队列,增加了监视器。
添加了限流器,限流为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; 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接口请求”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341