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 相关文章推荐
Java并发编程之详解CyclicBarrier线程同步
Jun 23 Java/Android
Java基础之线程锁相关知识总结
Jun 30 Java/Android
Java基础之this关键字的使用
Jun 30 Java/Android
新手初学Java网络编程
Jul 07 Java/Android
Java中CyclicBarrier和CountDownLatch的用法与区别
Aug 23 Java/Android
Java实现房屋出租系统详解
Oct 05 Java/Android
解决persistence.xml配置文件修改存放路径的问题
Feb 24 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
Android自定义scrollview实现回弹效果
Apr 01 Java/Android
Java详细解析==和equals的区别
Apr 07 Java/Android
带你了解Java中的ForkJoin
Apr 28 Java/Android
Android开发手册Chip监听及ChipGroup监听
Jun 10 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
杏林同学录(九)
2006/10/09 PHP
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
JavaScript的Cookies
2008/01/16 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
layer.js之回调销毁对话框的例子
2019/09/11 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
Python中input与raw_input 之间的比较
2017/08/20 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
Python通过len函数返回对象长度
2020/10/22 Python
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
捐献物资倡议书范文
2014/05/19 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
辞职信标准格式
2015/02/27 职场文书
博士给导师的自荐信
2015/03/06 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
《山中访友》教学反思
2016/02/24 职场文书