千家信息网

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

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,这篇文章主要为大家展示了"Java如何实现限流器处理Rest接口请求",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java如何实现限流器处理Rest接口请
千家信息网最后更新 2024年11月20日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接口请求"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

处理 队列 限流器 监视 代码 监视器 接口 上限 内容 篇文章 数据 学习 帮助 验证 成功 上代 任务 向导 实体 废话 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发加班有工资吗 四年级网络安全手抄报图片 一个数据库服务器可以管理 免费英国服务器节点 虹口区节能软件开发服务有哪些 optaplanner软件开发 仙国志游戏服务器都叫什么 服务器主板功率 包括居民负债的数据库 ae安装失败无法访问服务器 数据库链接地址怎么填 数据库中有个log文件超级大 南职物联网网络技术专业 连云港市网络安全优秀实践案例 建众互联网科技有限公司 git搭建本地服务器 数据库连接方法不用密码和账号 1188电脑软件开发 网络安全策划书活动内容 软件开发管理的软件 pubg需要下载服务器吗 网络安全 先进个人公示材料 一台服务器拆成多个虚拟机 品牌软件开发厂家价格 物业管家学网络安全 网络安全员证多久过期 济源精确的外贸数据库系统排名 数据库及其安全技术 我的世界服务器该怎么输入密码 dell服务器硬盘检测
0