目录

前言

Maven依赖

代码

总结


前言

在工作中是否会碰到这样的场景,高并发的请求但是无法全部执行,需要一定的限流。如果你是使用的微服务框架,比如SpringCloud,可以使用Gateway增加限流策略来解决。本篇文章是在没有框架的情况实现限流器

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;}@Overridepublic 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工具类相关推荐

  1. java 中间容器 表格_【JAVA SE基础篇】45.迭代器、Collections工具类以及使用容器存储表格...

    本文将要为您介绍的是[JAVA SE基础篇]45.迭代器.Collections工具类以及使用容器存储表格,具体完成步骤: 1.迭代器 迭代器为我们提供了统一遍历容器(List/Map/Set)的方式 ...

  2. .NET WebApi调用微信接口Https请求工具类

    .NET WebApi调用微信接口Https请求工具类 using System; using System.Collections.Generic; using System.IO; using S ...

  3. Java操作大数据量Excel导入导出万能工具类(完整版)

    Java操作大数据量Excel导入导出万能工具类(完整版) 转载自:https://blog.csdn.net/JavaWebRookie/article/details/80843653 更新日志: ...

  4. java 获取两条经纬度线段的交点坐标工具类

    java 获取两条经纬度线段的交点坐标工具类 网上有线段是否相交的判断方法,但是很少有获取线段交点的坐标的方法 我在这里整合了网上的一些相交的方法,通过相交的xy轴点返推出了经纬度. 拾取坐标系统 可 ...

  5. java8 两个list合并_深入介绍和使用 Java 8 的 Collector 接口和 Collectors 工具类

    1 概述 java.util.stream.Collector: Collector 接口用于将 Stream 流中的数据加工,转换,处理,最后返回结果. java.util.stream.Colle ...

  6. Java实验一—创建用于计算身体质量指数的BMI类

    (仅记录自己的学习之路) 创建用于计算身体质量指数的BMI类,成员变量和成员方法如下: (1) 一个字符串类型的私有数据域(数据域.成员变量和属性含义相同)name,描述人的名字: (2) 一个int ...

  7. Java讲课笔记28:Path接口和Files工具类

    文章目录 零.本讲学习目标 1.熟悉Path接口的基本使用 2.掌握Files工具类的基本使用 一.NIO概述(选讲) (一)NIO定义 (二)NIO相关包 (三)NIO三大核心 1.Buffer 2 ...

  8. Java学习笔记6.3.4 文件操作 - Path接口和Files工具类

    文章目录 零.本讲学习目标 一.NIO概述 (一)NIO定义 (二)NIO相关包 (三)NIO三大核心 二.NIO.2概述 (一)NIO.2定义与特点 (二)NIO.2提供的接口与工具类 三.Path ...

  9. Java并发包中那些值得学习的并发工具类(空谈误国,实干兴邦,代码示范,抛砖引玉)

    首先我们通常说的并发包就是java.util.concurrent包及其子包.集中了Java并发的各种基础工具类. 一.这个并发包在哪 上面的包就是传说中的并发包. 为什么这个并发包就比较流弊呢? 原 ...

最新文章

  1. 免费ASP,PHP空间
  2. 水晶报表技术(12)——一个投票系统水晶报表应用
  3. SqlDependency学习笔记
  4. 函数动态传参详细,作用域和名称空间,global和nonlocal
  5. 详解Linux多线程编程
  6. 用户访问共享计算机没有权限,win7共享没有权限访问 共享文件访问权限的方法...
  7. 快速傅里叶变换(FFT)详解
  8. python独立图形_Python图形界面(自学Python系列笔记-4)(不定期更新)
  9. [设计模式]单例模式
  10. FC6000蒸汽气体热水液体智能流量积算仪特点
  11. ⑴配置1-5_Telnet_Isolate_Vlan_Hybrid_MAC-Vlan
  12. 电信:自娱自乐的全员揽装,让人心寒!
  13. ConceptDraw MINDMAP 12 Mac版思维导图软件有哪些有点?
  14. python贴吧自动签到,解放你的双手
  15. ObjectARX-学习笔记
  16. 简单解释op(面向过程procedure- oriented)与oo(面向对象object-oriented)
  17. python合并excel的多个sheet
  18. matlab中de 乘法符号,FPGA 中的有符号数乘法
  19. Maven聚合淘淘商城工程时,报错Could not find artifact
  20. Niagara station站点打不开,怎么办?

热门文章

  1. K8S污点容忍度调度
  2. 【Python爬虫案例学习4】Python 爬取meizitu
  3. 毁掉一个孩子只要十步(80%的家长都在做)
  4. 安装部署(七) HBase集群安装部署与测试
  5. html仿微信评论输入框,简单仿微信朋友圈评论功能
  6. Agarose bound-WFA,WFL;琼脂糖结合紫藤凝集素(WFA,WFL)
  7. ET之快递测试法学习感悟20140922
  8. 利用百度云API接口上传照片进行植物识别
  9. 告别 PS !3 行代码 5 秒搞定抠图的 AI 神器!
  10. 女生 男生 都该学会的潜规则