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 相关文章推荐
springboot @ConfigurationProperties和@PropertySource的区别
Jun 11 Java/Android
Java用自带的Image IO给图片添加水印
Jun 15 Java/Android
Java框架入门之简单介绍SpringBoot框架
Jun 18 Java/Android
Java基于字符界面的简易收银台
Jun 26 Java/Android
Netty结合Protobuf进行编解码的方法
Jun 26 Java/Android
Java生成读取条形码和二维码的简单示例
Jul 09 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
spring注解 @PropertySource配置数据源全流程
Mar 25 Java/Android
Android自定义ScrollView实现阻尼回弹
Apr 01 Java/Android
Spring Data JPA框架Repository自定义实现
Apr 28 Java/Android
Java多线程并发FutureTask使用详解
Jun 28 Java/Android
SpringBoot接入钉钉自定义机器人预警通知
Jul 15 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
短波问题解答
2021/02/28 无线电
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
在PWS上安装PHP4.0正式版
2006/10/09 PHP
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
PHP 实现重载
2021/03/09 PHP
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
Javascript实现登录记住用户名和密码功能
2017/03/22 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
python 实现删除文件或文件夹实例详解
2016/12/04 Python
Python 日期区间处理 (本周本月上周上月...)
2019/08/08 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
租车协议书范本
2014/04/22 职场文书
六一亲子活动总结
2014/07/01 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
计划生育目标责任书
2015/05/09 职场文书
宿舍卫生管理制度
2015/08/05 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs