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 将PPT幻灯片转为HTML文件的实现思路
Jun 11 Java/Android
Java并发编程之详解CyclicBarrier线程同步
Jun 23 Java/Android
spring项目中切面及AOP的使用方法
Jun 26 Java/Android
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
Jan 18 Java/Android
关于maven依赖 ${xxx.version}报错问题
Jan 18 Java/Android
解析探秘fescar分布式事务实现原理
Feb 28 Java/Android
Java9新特性对HTTP2协议支持与非阻塞HTTP API
Mar 16 Java/Android
Java处理延时任务的常用几种解决方案
Jun 01 Java/Android
Android中的Launch Mode详情
Jun 05 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
Jun 10 Java/Android
Android开发EditText禁止输入监听及InputFilter字符过滤
Jun 10 Java/Android
Java结构型设计模式之组合模式详解
Sep 23 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防止form重复提交的方法
2013/07/01 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
JavaScript下申明对象的几种方法小结
2008/10/02 Javascript
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
JQuery基础语法小结
2015/02/27 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
AngularJs验证重复密码的方法(两种)
2016/11/25 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
2018/09/21 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
连锁经营管理专业大学生求职信
2013/10/30 职场文书
应届毕业生个人求职自荐信
2014/01/06 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
保护校园环境倡议书
2015/04/28 职场文书
奖励申请报告范文
2015/05/15 职场文书
卫生主题班会
2015/08/14 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
Matlab如何实现矩阵复制扩充
2021/06/02 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python