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实现分布式事务的三种方案
Jun 11 Java/Android
Java实现斗地主之洗牌发牌
Jun 14 Java/Android
Java用自带的Image IO给图片添加水印
Jun 15 Java/Android
spring项目中切面及AOP的使用方法
Jun 26 Java/Android
java解析XML详解
Jul 09 Java/Android
Java比较两个对象中全部属性值是否相等的方法
Aug 07 Java/Android
SpringCloud之@FeignClient()注解的使用方式
Sep 25 Java/Android
JVM的类加载器和双亲委派模式你了解吗
Mar 13 Java/Android
Spring Data JPA框架自定义Repository接口
Apr 28 Java/Android
Android开发之底部导航栏的快速实现
Apr 28 Java/Android
ConditionalOnProperty配置swagger不生效问题及解决
Jun 14 Java/Android
Android学习之BottomSheetDialog组件的使用
Jun 21 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 curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
Array对象方法参考
2006/10/03 Javascript
Javascript 陷阱 window全局对象
2008/11/26 Javascript
jQuery MD5加密实现代码
2010/03/15 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
javascript + jquery实现定时修改文章标题
2014/03/19 Javascript
javascript实现点击单选按钮链接转向对应网址的方法
2015/08/12 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
jQuery实现拼图小游戏(实例讲解)
2017/07/24 jQuery
jQuery AJAX应用实例总结
2020/05/19 jQuery
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
python日期相关操作实例小结
2019/06/24 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
介绍一下内联、左联、右联
2013/12/31 面试题
渗透攻击的测试步骤
2014/06/07 面试题
统计专业自荐书
2014/07/06 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
工会工作个人总结
2015/03/03 职场文书
微观世界观后感
2015/06/10 职场文书
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers