Java 实现限流器处理Rest接口请求详解流程


Posted in Java/Android onNovember 02, 2021

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:
 * 请求限流器 @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接口请求详解流程

总结

胸中一点浩然气,天地千里快哉风。

如果本文对你有用的,请不要吝啬你的赞,谢谢支持。

 

到此这篇关于Java 实现限流器处理Rest接口请求详解流程的文章就介绍到这了,更多相关Java Rest接口请求内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
分析Netty直接内存原理及应用
Jun 14 Java/Android
Java elasticsearch安装以及部署教程
Jun 28 Java/Android
一篇文章带你学习Mybatis-Plus(新手入门)
Aug 02 Java/Android
logback如何自定义日志存储
Aug 30 Java/Android
Java设计模式之享元模式示例详解
Mar 03 Java/Android
Spring this调用当前类方法无法拦截的示例代码
Mar 20 Java/Android
springboot用户数据修改的详细实现
Apr 06 Java/Android
Java工作中实用的代码优化技巧分享
Apr 21 Java/Android
JAVA springCloud项目搭建流程
May 11 Java/Android
Java实现添加条码或二维码到Word文档
Jun 01 Java/Android
java实现web实时消息推送的七种方案
Jul 23 Java/Android
Spring Boot 的创建和运行示例代码详解
Jul 23 Java/Android
Java8中接口的新特性使用指南
Nov 01 #Java/Android
Spring中的使用@Async异步调用方法
Nov 01 #Java/Android
MyBatis自定义SQL拦截器示例详解
Oct 24 #Java/Android
java多态注意项小结
Spring Security中用JWT退出登录时遇到的坑
Java实现房屋出租系统详解
Oct 05 #Java/Android
Java Spring 控制反转(IOC)容器详解
You might like
谨慎使用PHP的引用原因分析
2012/09/06 PHP
php中require和require_once的区别说明
2014/02/27 PHP
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
php提交post数组参数实例分析
2015/12/17 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
PHP的mysqli_select_db()函数讲解
2019/01/23 PHP
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
jquery实现表单输入时提示文字滑动向上效果
2015/08/10 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
VUE写一个简单的表格实例
2019/08/06 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
跟老齐学Python之编写类之二方法
2014/10/11 Python
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
酒店出纳岗位职责
2013/12/29 职场文书
篝火晚会策划方案
2014/05/16 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
中国世界遗产导游词
2015/02/13 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
MongoDB 常用的crud操作语句
2021/06/20 MongoDB
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB
PyTorch中permute的使用方法
2022/04/26 Python