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 相关文章推荐
浅析NIO系列之TCP
Jun 15 Java/Android
Springboot如何使用logback实现多环境配置?
Jun 16 Java/Android
springboot如何初始化执行sql语句
Jun 22 Java/Android
基于Java的MathML转图片的方法(示例代码)
Jun 23 Java/Android
eclipse创建项目没有dynamic web的解决方法
Jun 24 Java/Android
解决ObjectMapper.convertValue() 遇到的一些问题
Jun 30 Java/Android
java实现对Hadoop的操作
Jul 01 Java/Android
logback如何自定义日志存储
Aug 30 Java/Android
springboot如何接收application/x-www-form-urlencoded类型的请求
Nov 02 Java/Android
你知道Java Spring的两种事务吗
Mar 16 Java/Android
Android Canvas绘制文字横纵向对齐
Jun 05 Java/Android
Android学习之BottomSheetDialog组件的使用
Jun 21 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超全局数组(Superglobals)介绍
2015/07/01 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
微信小程序movable view移动图片和双指缩放实例代码
2017/08/08 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
Python导出DBF文件到Excel的方法
2015/07/25 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
最新的大学生找工作自我评价
2013/09/29 职场文书
大学生写自荐信的技巧
2014/01/08 职场文书
生日派对邀请函
2014/01/13 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
记账会计岗位职责
2014/06/16 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
社区灵活就业证明
2014/11/03 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
学术会议领导致辞
2015/07/29 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers