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 相关文章推荐
idea搭建可运行Servlet的Web项目
Jun 26 Java/Android
浅谈Python魔法方法
Jun 28 Java/Android
JavaWeb Servlet实现网页登录功能
Jul 04 Java/Android
SpringMVC 整合SSM框架详解
Aug 30 Java/Android
SpringBoot实现quartz定时任务可视化管理功能
Aug 30 Java/Android
使用Java去实现超市会员管理系统
Mar 18 Java/Android
Java实战之课程信息管理系统的实现
Apr 01 Java/Android
Springboot-cli 开发脚手架,权限认证,附demo演示
Apr 28 Java/Android
Java版 简易五子棋小游戏
May 04 Java/Android
Java完整实现记事本代码
Jun 16 Java/Android
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
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
点评山进PR-D3L三波段收音机
2021/03/02 无线电
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
js事件绑定快捷键以ctrl+k为例
2014/09/30 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
angular中子控制器向父控制器传值的实例
2018/10/08 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
python3转换code128条形码的方法
2019/04/17 Python
对Django中内置的User模型实例详解
2019/08/16 Python
python可视化text()函数使用详解
2020/02/11 Python
python如何提取英语pdf内容并翻译
2020/03/03 Python
python 读取二进制 显示图片案例
2020/04/24 Python
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
高中生家长会演讲稿
2014/01/14 职场文书
初一生物教学反思
2014/01/18 职场文书
城管大队整治方案
2014/05/06 职场文书
二手车转让协议书
2015/01/29 职场文书
解除处分决定书
2015/06/25 职场文书