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集成flyway自动创表的详细配置
Jun 26 Java/Android
Spring Boot 启动、停止、重启、状态脚本
Jun 26 Java/Android
详解Spring Boot使用系统参数表提升系统的灵活性
Jun 30 Java/Android
详解Java七大阻塞队列之SynchronousQueue
Sep 04 Java/Android
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
Sep 25 Java/Android
关于springboot配置druid数据源不生效问题(踩坑记)
Sep 25 Java/Android
java高级用法JNA强大的Memory和Pointer
Apr 19 Java/Android
Springboot-cli 开发脚手架,权限认证,附demo演示
Apr 28 Java/Android
Java对文件的读写操作方法
Apr 29 Java/Android
Android开发手册TextInputLayout样式使用示例
Jun 10 Java/Android
java实现web实时消息推送的七种方案
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中的超全局变量
2006/10/09 PHP
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
div层的移动及性能优化
2010/11/16 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
python实现sublime3的less编译插件示例
2014/04/27 Python
Python and、or以及and-or语法总结
2015/04/14 Python
python修改操作系统时间的方法
2015/05/18 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
Python pandas用法最全整理
2019/08/04 Python
Python中的sys.stdout.write实现打印刷新功能
2020/02/21 Python
python右对齐的实例方法
2020/07/05 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
罗德与泰勒百货官网:Lord & Taylor
2016/08/12 全球购物
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
新年寄语大全
2014/04/12 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
周一给客户的问候语
2015/11/10 职场文书
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS