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限流器简单实现相关推荐

  1. JAVA实现简单限流器(上)

    JAVA实现简单限流器 什么是限流器 在高并发的场景下,出于对系统的保护会对流量进行限制. 信号量实现限流器 提到限流器的实现方式,很容易可以想到信号量是与之类似的原理,都是允许一定数量的线程访问临界 ...

  2. java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)

    用java实现简单的小游戏(你一定玩过) 对于java初学者来说,通过一些学习小游戏来对swing学习以及对java基础的学习是一个好的方法,同时也给学习带来了很多的乐趣,接下来就给大家分享一个jav ...

  3. java实现简单窗体小游戏----球球大作战

    java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: ​ 坐标.大小.颜色.方向.速度 2.抽象类:Ball ​ 设计类:BallMain-创建窗体 ​ BallJPanel- ...

  4. Java JNI简单实现

    Java JNI简单实现 JNI(Java Native Interface)允许了Java和C&C++进行交互?这不折腾人嘛! 一.JNI简述 http://baike.baidu.com/ ...

  5. java实现账号单一ip登录,使用Java实现简单后台访问并获取IP示例

    使用Java实现简单后台访问并获取IP示例 发布时间:2020-10-28 21:57:57 来源:亿速云 阅读:92 作者:Leah 使用Java实现简单后台访问并获取IP示例?针对这个问题,这篇文 ...

  6. 用limit 实现java的简单分页

    https://blog.csdn.net/xinyuezitang/article/details/84324359 用limit 实现java的简单分页 xinyuezitang 2018-11- ...

  7. redis java应用_redis在JAVA的简单应用

    reids是一个高性能的key-value数据库.它存储的value支持各种类型的数据,如String,List,set,hash类型.在此基础上,各种不同方式的排序. 本文不具体争对redis数据库 ...

  8. java实现简单的约瑟夫环问题

    我自己学习数据结构的时候,总希望能找到很简单的入门代码,可总是很难找到,于是就想到能写一些简单的java代码.  在百度百科上面搜索到约瑟夫环的问题时,并没有发现java的简单实现,自己在下面弄也是弄 ...

  9. Java Kafka 简单示例

    Java Kafka 简单示例 简介     Java kafka 简单代码示例 maven依赖配置 <!-- kafka --> <dependency><groupI ...

最新文章

  1. linux uefo引导 win_基于UEFI和GPT模式下U盘安装windows8.1和Linux双启动教程
  2. pandas.core.frame.DataFrame是什么数据结构,为什么要如此取值  [ ]中嵌套[ ]
  3. Hinton 发表新作探索流体胶囊网络 | AI日报
  4. python环境变量配置_?Python项目读取配置的正确姿势
  5. C语言中变量的链接属性
  6. Java学习 第四章 java面向对象(二)
  7. 计算机数据库系统考研复试面试题,2016年山西财经大学081203计算机应用技术871数据库系统概论复试笔试最后押题五套卷...
  8. 双系统ubuntu 删除后重装
  9. Typed DataSet的批量操作优化
  10. 写出常用的5个linux命令 并解释,【PHP面试题】写出尽可能多的Linux命令。
  11. vue-cli结构介绍
  12. 前端英文和数字不换行怎么解决
  13. VS Qt 项目 “fatal error C1083: ”无法打开包括文件
  14. CorelDRAW2022(CDR2022-64位),Win7 、Win10通用\免激活注册中文版安装图文教程
  15. 前端工程师项目能力精选文章50篇
  16. android按钮点击次数,android按键精灵 设置次数
  17. 图形学 Lecture7 光线追踪
  18. UUI Make StartUp Disk
  19. 搜狗拼音输入法输入数字和英文时总是有空格
  20. 大道至简之九:周期的实质与投资机会

热门文章

  1. 120 行代码实现纯 Web 剪辑视频
  2. XML/JSON 语法随堂笔记
  3. unity-光照烘焙GI简单应用
  4. c语言数字拆分,在手机上玩C语言—数字拆分
  5. 组态王安装error_组态王常见问题的解决方法
  6. 基于Java+Dubbo设计的智能公交查询系统
  7. JAVA 多态,封装,继承
  8. c语言是学电脑吗,c语言入门至精通这些天一直有人问我,c语言好学吗?我是个新手...
  9. 值得推荐的MAC软件下载软件的网站
  10. 我眼中的机器学习(二) 解方程 为什么需要用到机器学习算法