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中一些比较常用的注解总结
Jun 11 Java/Android
详解Java实现设计模式之责任链模式
Jun 23 Java/Android
Java中CyclicBarrier和CountDownLatch的用法与区别
Aug 23 Java/Android
Java SSM配置文件案例详解
Aug 30 Java/Android
logback如何自定义日志存储
Aug 30 Java/Android
使用logback实现按自己的需求打印日志到自定义的文件里
Aug 30 Java/Android
关于springboot配置druid数据源不生效问题(踩坑记)
Sep 25 Java/Android
使用jpa之动态插入与修改(重写save)
Nov 23 Java/Android
Java tomcat手动配置servlet详解
Nov 27 Java/Android
Java设计模式之享元模式示例详解
Mar 03 Java/Android
spring注解 @PropertySource配置数据源全流程
Mar 25 Java/Android
Java由浅入深通关抽象类与接口(上篇)
Apr 26 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
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
php设计模式 Composite (组合模式)
2011/06/26 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
浅谈PHP链表数据结构(单链表)
2016/06/08 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
使用python实现省市三级菜单效果
2016/01/20 Python
Django csrf 验证问题的实现
2018/10/09 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
Delphi笔试题
2016/11/14 面试题
渡河少年教学反思
2014/02/12 职场文书
考试诚信承诺书
2014/05/23 职场文书
教师师德师风整改措施
2014/10/24 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
行风评议整改报告
2014/11/06 职场文书
2014年房地产销售工作总结
2014/12/01 职场文书