java 实现限流器,可用于Rest接口请求处理 | Java工具类
目录
前言
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工具类相关推荐
- java 中间容器 表格_【JAVA SE基础篇】45.迭代器、Collections工具类以及使用容器存储表格...
本文将要为您介绍的是[JAVA SE基础篇]45.迭代器.Collections工具类以及使用容器存储表格,具体完成步骤: 1.迭代器 迭代器为我们提供了统一遍历容器(List/Map/Set)的方式 ...
- .NET WebApi调用微信接口Https请求工具类
.NET WebApi调用微信接口Https请求工具类 using System; using System.Collections.Generic; using System.IO; using S ...
- Java操作大数据量Excel导入导出万能工具类(完整版)
Java操作大数据量Excel导入导出万能工具类(完整版) 转载自:https://blog.csdn.net/JavaWebRookie/article/details/80843653 更新日志: ...
- java 获取两条经纬度线段的交点坐标工具类
java 获取两条经纬度线段的交点坐标工具类 网上有线段是否相交的判断方法,但是很少有获取线段交点的坐标的方法 我在这里整合了网上的一些相交的方法,通过相交的xy轴点返推出了经纬度. 拾取坐标系统 可 ...
- java8 两个list合并_深入介绍和使用 Java 8 的 Collector 接口和 Collectors 工具类
1 概述 java.util.stream.Collector: Collector 接口用于将 Stream 流中的数据加工,转换,处理,最后返回结果. java.util.stream.Colle ...
- Java实验一—创建用于计算身体质量指数的BMI类
(仅记录自己的学习之路) 创建用于计算身体质量指数的BMI类,成员变量和成员方法如下: (1) 一个字符串类型的私有数据域(数据域.成员变量和属性含义相同)name,描述人的名字: (2) 一个int ...
- Java讲课笔记28:Path接口和Files工具类
文章目录 零.本讲学习目标 1.熟悉Path接口的基本使用 2.掌握Files工具类的基本使用 一.NIO概述(选讲) (一)NIO定义 (二)NIO相关包 (三)NIO三大核心 1.Buffer 2 ...
- Java学习笔记6.3.4 文件操作 - Path接口和Files工具类
文章目录 零.本讲学习目标 一.NIO概述 (一)NIO定义 (二)NIO相关包 (三)NIO三大核心 二.NIO.2概述 (一)NIO.2定义与特点 (二)NIO.2提供的接口与工具类 三.Path ...
- Java并发包中那些值得学习的并发工具类(空谈误国,实干兴邦,代码示范,抛砖引玉)
首先我们通常说的并发包就是java.util.concurrent包及其子包.集中了Java并发的各种基础工具类. 一.这个并发包在哪 上面的包就是传说中的并发包. 为什么这个并发包就比较流弊呢? 原 ...
最新文章
- 免费ASP,PHP空间
- 水晶报表技术(12)——一个投票系统水晶报表应用
- SqlDependency学习笔记
- 函数动态传参详细,作用域和名称空间,global和nonlocal
- 详解Linux多线程编程
- 用户访问共享计算机没有权限,win7共享没有权限访问 共享文件访问权限的方法...
- 快速傅里叶变换(FFT)详解
- python独立图形_Python图形界面(自学Python系列笔记-4)(不定期更新)
- [设计模式]单例模式
- FC6000蒸汽气体热水液体智能流量积算仪特点
- ⑴配置1-5_Telnet_Isolate_Vlan_Hybrid_MAC-Vlan
- 电信:自娱自乐的全员揽装,让人心寒!
- ConceptDraw MINDMAP 12 Mac版思维导图软件有哪些有点?
- python贴吧自动签到,解放你的双手
- ObjectARX-学习笔记
- 简单解释op(面向过程procedure- oriented)与oo(面向对象object-oriented)
- python合并excel的多个sheet
- matlab中de 乘法符号,FPGA 中的有符号数乘法
- Maven聚合淘淘商城工程时,报错Could not find artifact
- Niagara station站点打不开,怎么办?