java限流器简单实现
package com.zeng.ratelimit;/*** @Description:限流器工厂* @Author jerry* Date 2020/1/3 9:52 上午**/ public class RateLimiterFactory {public static SimpleRateLimiter getSimpleRateLimiter(RateLimiterParam rateLimiterParam) {if (RateLimiterType.SEMAPHORE.equals(rateLimiterParam.getRateLimiterType())) {return new SemaphoreRateLimiter(rateLimiterParam);} else {return new TokenBucketRateLimiter(rateLimiterParam);}} }
package com.zeng.ratelimit;import java.util.Objects; import java.util.concurrent.TimeUnit;/*** @Description:限流器* @Author jerry* Date 2020/1/3 9:53 上午**/ public class RateLimiterParam {private RateLimiterType rateLimiterType = RateLimiterType.TOKEN_BUCKET;private int threshold = 50;private long timeout = 3000;private TimeUnit unit = TimeUnit.MILLISECONDS;public int getThreshold() {return threshold;}public RateLimiterParam setThreshold(int threshold) {this.threshold = threshold;return this;}public long getTimeout() {return timeout;}public RateLimiterParam setTimeout(long timeout) {this.timeout = timeout;return this;}public TimeUnit getUnit() {return unit;}public RateLimiterParam setUnit(TimeUnit unit) {this.unit = unit;return this;}public RateLimiterType getRateLimiterType() {return rateLimiterType;}public void setRateLimiterType(RateLimiterType rateLimiterType) {this.rateLimiterType = rateLimiterType;}@Overridepublic String toString() {return "RateLimiterParam{" +"rateLimiterType=" + rateLimiterType +", threshold=" + threshold +", timeout=" + timeout +", unit=" + unit +'}';}@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}RateLimiterParam that = (RateLimiterParam) o;return threshold == that.threshold &&timeout == that.timeout &&rateLimiterType == that.rateLimiterType &&unit == that.unit;}@Overridepublic int hashCode() {return Objects.hash(rateLimiterType, threshold, timeout, unit);} }
package com.zeng.ratelimit;/*** @Description:限流器类型枚举* @Author jerry* Date 2020/1/3 10:01 上午**/ public enum RateLimiterType {SEMAPHORE(1, "并发限流"),TOKEN_BUCKET(2, "令牌桶限流");private int code;private String desc;RateLimiterType(int code, String desc) {this.code = code;this.desc = desc;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;} }
package com.zeng.ratelimit;import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit;/*** @Description:计数器限流* @Author jerry* Date 2020/1/3 10:12 上午**/ public class SemaphoreRateLimiter extends SimpleRateLimiter {private Semaphore semaphore;public SemaphoreRateLimiter(RateLimiterParam rateLimiterParam) {super(rateLimiterParam);this.semaphore = new Semaphore(rateLimiterParam.getThreshold());}@Overridepublic long acquire() {try {long start = System.currentTimeMillis();semaphore.acquire();return TimeUnit.NANOSECONDS.toMicros(System.currentTimeMillis() - start);} catch (InterruptedException e) {throw new RateLimiterException("rate limiter is interrupted by others");}}@Overridepublic boolean tryAcquire(long timeout, TimeUnit unit) {try {return semaphore.tryAcquire(timeout, unit);} catch (InterruptedException e) {throw new RateLimiterException("rate limiter is interrupted by others");}}@Overridepublic void supply() {semaphore.release();} }
package com.zeng.ratelimit;import com.google.common.base.Preconditions; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.util.Objects; import java.util.concurrent.TimeUnit;/*** @Description:简单限流器基类* @Author jerry* Date 2020/1/3 9:53 上午**/ public abstract class SimpleRateLimiter {protected static final Logger log = LoggerFactory.getLogger(SimpleRateLimiter.class);protected RateLimiterParam rateLimiterParam = new RateLimiterParam();public SimpleRateLimiter(RateLimiterParam rateLimiterParam) {Preconditions.checkNotNull(rateLimiterParam, "限流参数不能为空!");setRateLimiterParam(rateLimiterParam);}public RateLimiterParam getRateLimiterParam() {return rateLimiterParam;}private void setRateLimiterParam(RateLimiterParam rateLimiterParam) {if (rateLimiterParam.getThreshold() < 0) {log.warn("ratelimiter threshold set to " + rateLimiterParam.getThreshold() + ", is less than zero, will have no effect.");} else {this.rateLimiterParam.setThreshold(rateLimiterParam.getThreshold());}if (rateLimiterParam.getTimeout() < 0) {log.warn("ratelimiter timeout set to " + rateLimiterParam.getThreshold() + ", is less than zero, will have no effect.");} else {this.rateLimiterParam.setTimeout(rateLimiterParam.getTimeout());}if (Objects.isNull(rateLimiterParam.getUnit())) {log.warn("ratelimiter timeUnit is null, will have no effect.");} else {this.rateLimiterParam.setUnit(rateLimiterParam.getUnit());}this.rateLimiterParam.setRateLimiterType(rateLimiterParam.getRateLimiterType());}public abstract long acquire();public boolean tryDefaultAcquire() {return tryAcquire(rateLimiterParam.getTimeout(), rateLimiterParam.getUnit());}public abstract boolean tryAcquire(long timeout, TimeUnit unit);public abstract void supply();}
package com.zeng.ratelimit;import com.google.common.util.concurrent.RateLimiter;import java.util.concurrent.TimeUnit;/*** @Description:令牌桶限流* @Author jerry* Date 2020/1/3 10:12 上午**/ public class TokenBucketRateLimiter extends SimpleRateLimiter {private RateLimiter limiter;public TokenBucketRateLimiter(RateLimiterParam rateLimiterParam) {super(rateLimiterParam);this.limiter = RateLimiter.create(rateLimiterParam.getThreshold());}@Overridepublic long acquire() {long start = System.currentTimeMillis();limiter.acquire();return TimeUnit.NANOSECONDS.toMicros(System.currentTimeMillis() - start);}@Overridepublic boolean tryAcquire(long timeout, TimeUnit unit) {return limiter.tryAcquire(timeout, unit);}@Overridepublic void supply() {} }
java限流器简单实现相关推荐
- JAVA实现简单限流器(上)
JAVA实现简单限流器 什么是限流器 在高并发的场景下,出于对系统的保护会对流量进行限制. 信号量实现限流器 提到限流器的实现方式,很容易可以想到信号量是与之类似的原理,都是允许一定数量的线程访问临界 ...
- java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)
用java实现简单的小游戏(你一定玩过) 对于java初学者来说,通过一些学习小游戏来对swing学习以及对java基础的学习是一个好的方法,同时也给学习带来了很多的乐趣,接下来就给大家分享一个jav ...
- java实现简单窗体小游戏----球球大作战
java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: 坐标.大小.颜色.方向.速度 2.抽象类:Ball 设计类:BallMain-创建窗体 BallJPanel- ...
- Java JNI简单实现
Java JNI简单实现 JNI(Java Native Interface)允许了Java和C&C++进行交互?这不折腾人嘛! 一.JNI简述 http://baike.baidu.com/ ...
- java实现账号单一ip登录,使用Java实现简单后台访问并获取IP示例
使用Java实现简单后台访问并获取IP示例 发布时间:2020-10-28 21:57:57 来源:亿速云 阅读:92 作者:Leah 使用Java实现简单后台访问并获取IP示例?针对这个问题,这篇文 ...
- 用limit 实现java的简单分页
https://blog.csdn.net/xinyuezitang/article/details/84324359 用limit 实现java的简单分页 xinyuezitang 2018-11- ...
- redis java应用_redis在JAVA的简单应用
reids是一个高性能的key-value数据库.它存储的value支持各种类型的数据,如String,List,set,hash类型.在此基础上,各种不同方式的排序. 本文不具体争对redis数据库 ...
- java实现简单的约瑟夫环问题
我自己学习数据结构的时候,总希望能找到很简单的入门代码,可总是很难找到,于是就想到能写一些简单的java代码. 在百度百科上面搜索到约瑟夫环的问题时,并没有发现java的简单实现,自己在下面弄也是弄 ...
- Java Kafka 简单示例
Java Kafka 简单示例 简介 Java kafka 简单代码示例 maven依赖配置 <!-- kafka --> <dependency><groupI ...
最新文章
- linux uefo引导 win_基于UEFI和GPT模式下U盘安装windows8.1和Linux双启动教程
- pandas.core.frame.DataFrame是什么数据结构,为什么要如此取值 [ ]中嵌套[ ]
- Hinton 发表新作探索流体胶囊网络 | AI日报
- python环境变量配置_?Python项目读取配置的正确姿势
- C语言中变量的链接属性
- Java学习 第四章 java面向对象(二)
- 计算机数据库系统考研复试面试题,2016年山西财经大学081203计算机应用技术871数据库系统概论复试笔试最后押题五套卷...
- 双系统ubuntu 删除后重装
- Typed DataSet的批量操作优化
- 写出常用的5个linux命令 并解释,【PHP面试题】写出尽可能多的Linux命令。
- vue-cli结构介绍
- 前端英文和数字不换行怎么解决
- VS Qt 项目 “fatal error C1083: ”无法打开包括文件
- CorelDRAW2022(CDR2022-64位),Win7 、Win10通用\免激活注册中文版安装图文教程
- 前端工程师项目能力精选文章50篇
- android按钮点击次数,android按键精灵 设置次数
- 图形学 Lecture7 光线追踪
- UUI Make StartUp Disk
- 搜狗拼音输入法输入数字和英文时总是有空格
- 大道至简之九:周期的实质与投资机会