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 数组内置函数toArray详解
Jun 28 Java/Android
Java使用httpRequest+Jsoup爬取红蓝球号码
Jul 02 Java/Android
JUnit5常用注解的使用
Jul 02 Java/Android
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
Jul 26 Java/Android
idea 在springboot中使用lombok插件的方法
Aug 02 Java/Android
使用HttpSessionListener监听器实战
Mar 17 Java/Android
Android超详细讲解组件ScrollView的使用
Mar 31 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
零基础学java之带参数以及返回值的方法
Apr 10 Java/Android
JavaScript正则表达式实现注册信息校验功能
May 30 Java/Android
Spring IOC容器Bean的作用域及生命周期实例
May 30 Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
Yii配置文件用法详解
2014/12/04 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
2013/04/12 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
php实例分享之实现显示网站运行时间
2014/05/20 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
ionic3 懒加载
2017/08/16 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
解决csv.writer写入文件有多余的空行问题
2018/07/06 Python
python递归全排列实现方法
2018/08/18 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
详细分析Python collections工具库
2020/07/16 Python
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
蛋白质世界:Protein World
2017/11/23 全球购物
澳洲健康食品网上商店:Aussie Health Products
2018/06/15 全球购物
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
园林施工员岗位职责
2013/12/11 职场文书
九一八事变纪念日演讲稿
2014/09/14 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
个人房屋买卖协议书(范本)
2014/10/04 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
小学大队长竞选稿
2015/11/20 职场文书
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电