千家信息网

Java如何实现限流器处理Rest接口请求

发表于:2025-11-17 作者:千家信息网编辑
千家信息网最后更新 2025年11月17日,这篇文章主要为大家展示了"Java如何实现限流器处理Rest接口请求",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java如何实现限流器处理Rest接口请
千家信息网最后更新 2025年11月17日Java如何实现限流器处理Rest接口请求

这篇文章主要为大家展示了"Java如何实现限流器处理Rest接口请求",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java如何实现限流器处理Rest接口请求"这篇文章吧。

Maven依赖

            com.google.guava            guava            31.0.1-jre        

代码

上代码,不废话。

首先是限流器代码。

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 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 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接口请求"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0