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 相关文章推荐
SpringAop日志找不到方法的处理
Jun 21 Java/Android
深入理解以DEBUG方式线程的底层运行原理
Jun 21 Java/Android
分析Java中Map的遍历性能问题
Jun 26 Java/Android
探讨Java中的深浅拷贝问题
Jun 26 Java/Android
Spring Boot两种全局配置和两种注解的操作方法
Jun 29 Java/Android
java解析XML详解
Jul 09 Java/Android
浅谈Java父子类加载顺序
Aug 04 Java/Android
mybatis源码解读之executor包语句处理功能
Feb 15 Java/Android
Java生成日期时间存入Mysql数据库的实现方法
Mar 03 Java/Android
JavaWeb实现显示mysql数据库数据
Mar 19 Java/Android
Flutter Navigator 实现路由传递参数
Apr 22 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 修改zen-cart下单和付款流程以防止漏单
2010/03/08 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
vue脚手架及vue-router基本使用
2018/04/09 Javascript
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
Python中的类与类型示例详解
2019/07/10 Python
python绘制彩虹图
2019/12/16 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
建龙钢铁面试总结
2014/04/15 面试题
求职自荐信范文格式
2013/11/29 职场文书
实习单位接收函模板
2014/01/10 职场文书
劳动实践课感言
2014/02/01 职场文书
高中学生期末评语
2014/04/25 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
公司离职证明范本
2014/10/17 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
预备党员自我评价范文
2015/03/04 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
2016小学新学期寄语
2015/12/04 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL