java限频_单个用户及Ip请求频率限制思路(附java实现)
> 我们熟悉的限流算法漏桶和令牌桶外,很多情况我们还需要考虑当个用户(ip)访问频率控制,避免被恶意调用。如果是开放平台限制一天调用多少次这种粗放的粒度相对好处理一些。如果需要更小时间粒度控制,譬如一个10秒时间窗口最大只允许访问10次,相对上述粗放粒度我们还需要考虑性能和边界两个问题。在这里提供一种思路给大家,这个也是我写的api网关访问频率控制的代码,经过了线上环境实践。
推荐: jeesuite开发框架,免费开源、一站式解决方案。
思路(以10秒限制10次为例)
定义一个全局map
key为用户标识(ip or sessionId),
value:List<10秒内访问时间戳>
private Map> accessDatas = new ConcurrentHashMap<>();
启动一个定时器,用于清除10秒前的访问时间
cleanScheduledExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
long currentTime = System.currentTimeMillis();
List < Long > accessPoints = null;
Iterator < String > idsIterator;
if (gloabalScanFlag == 5) {
//清理空记录
if (cleanNulling = accessDatas.size() > cleanNullSize) {
log.debug("cleanNulling...");
Set < String > keys = accessDatas.keySet();
for (String key: keys) {
List < Long > points = accessDatas.get(key);
if (points.isEmpty()) {
points = null;
accessDatas.remove(key);
}
}
cleanNulling = false;
}
idsIterator = accessDatas.keySet().iterator();
gloabalScanFlag = 0;
} else {
idsIterator = maybeFullIds.iterator();
gloabalScanFlag++;
}
while (idsIterator.hasNext()) {
accessPoints = accessDatas.get(idsIterator.next());
//
removeExpirePoints(accessPoints, currentTime);
}
}
},
1000, 1000, TimeUnit.MILLISECONDS);
移除过期的请求时间戳记录
private int removeExpirePoints(List ponits,long currentTimeMillis){
int removeNums = 0;
if(ponits == null || ponits.isEmpty()){
return removeNums;
}
Iterator pointsIterator = ponits.iterator();
while (pointsIterator.hasNext()) {
if(pointsIterator.next().compareTo(currentTimeMillis - timeWindowMillis) <= 0){
pointsIterator.remove();
removeNums++;
}else{
break;
}
}
return removeNums;
}
频控检查
/**
* 访问频率检查
* @param identification 用户标识(ip or sessionId)
* @param uri
* @return
* @copyright http://www.jeesuite.com
*/
private boolean requestFrequencyCheck(String identification, String uri) {
while (cleanNulling);
boolean result = false;
long currentTime = System.currentTimeMillis();
List < Long > accessPoints = accessDatas.get(identification);
try {
if (accessPoints == null) {
accessPoints = new Vector < >(permits);
accessDatas.put(identification, accessPoints);
}
int size;
if ((size = accessPoints.size()) < permits) {
if (size >= putFullQueueSize) {
maybeFullIds.add(identification);
}
result = true;
} else {
int removeNums = removeExpirePoints(accessPoints, currentTime);
result = removeNums > 0;
}
return result;
} finally {
accessPoints.add(currentTime);
}
}
java限频_单个用户及Ip请求频率限制思路(附java实现)相关推荐
- 视频教程-大型Java项目视频教程_王勇老师DRP项目教程完整版292集-Java
大型Java项目视频教程_王勇老师DRP项目教程完整版292集 动力节点王勇老师,CCTV<影响力对话>栏目特约嘉宾,Java培训知名讲师,中国Java培训领军人物,北京动力节点创始人,董 ...
- ASP.NET Core IP 请求频率限制
在网站或API应用中,我们为了防止无聊人士或恶意攻击,通常希望屏蔽某一IP短时间的内高频率请求.在ASP.NET Core中,限制IP请求频率非常简单,我们来看看吧. 轮子一个 .NET Core 目 ...
- java 单个用户的多重并发会话_单个用户的多重并发会话限制/限制单客户端同时登录多个用户...
我使用的是SSH2框架,做安全测试需要限制:1.单个用户的多重并发会话限制 2. 限制单客户端同时登录多个用户 .这两个内容,没有采用在web.xml中配置过滤器的方式,我处理的方式是如果一个用户在第 ...
- 怎么安装java插件下载_向各位牛人请教:正常安装的Java,浏览器却不能加载插件怎么办?...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我的Java安装并且正常运行,但浏览器无法加载某个重要的Java插件,Java控制台显示如下代码: Java 插件11.25.2.18 使用 JRE 版本 ...
- java前沿技术_互联网百强企业架构师告诉你,Java应该这么学!云和数据超全面Java中级程序员学习路线图重磅发布!...
作为常居编程语言排行榜第一名的编程语言,Java语言以其稳定性.健壮性著称,是一门非常成熟的编程语言,多年来一直是国际上众多企业的首选编程语言. Java语言不仅吸收了C++语言的各种优点,还摒弃了C ...
- 设备描述符请求失败_如果用户发出过多请求 苹果将取消Apple ID帐户恢复
出于安全原因,恢复丢失的苹果ID帐户可能需要几天时间,但如果用户希望顺利恢复,则该避免采取一些行动.任何人都可能忘记他们的Apple ID密码,因此该公司必须为用户提供一种方法,让用户在他们忘记密码的 ...
- java数组搞笑_面试官:小伙子,给我说一下Java 数组吧
Java 数组 Java 语言中提供的数组是用来存储固定大小的同类型元素. 1.声明数组变量 首先必须声明数组变量,才能在程序中使用数组. dataType[] arrayRefVar; // 首选的 ...
- ios rsa加密 java解密_iOS RSA加密与解密 签名与验签(附Java端处理)
本篇文章将涉及以下几个操作: 1.iOS端使用RSA公钥加密,iOS端使用RSA私钥解密. 2.iOS端使用RSA私钥加签,iOS端使用RSA公钥验签. 3.iOS端使用RSA公钥加密,Java端使用 ...
- java动物乐园_基于jsp的动物园管理系统-JavaEE实现动物园管理系统 - java项目源码...
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的动物园管理系统, 该项目可用各类java课程设计大作业中, 动物园管理系统的系统架构分为前后台两部分, 最终实现在 ...
最新文章
- Python 数据库操作 psycopg2
- linux增加 编译选项,4. CMake 系列 - 项目添加编译选项
- C++ string(转)
- loadrunner—事务、TPS
- SpringBoot启动流程是怎样的
- Chinese NER Using Lattice LSTM
- 基于CNN目标检测方法(RCNN,Fast-RCNN,Faster-RCNN,Mask-RCNN,YOLO,SSD)行人检测
- 如何快速制作短视频?拥有这个神器,轻松搞定!
- mysql查询最接近的记录
- 20165234 《Java程序设计》第八周学习总结
- 一般不要在头文件中定义变量
- Hive数据分析案例——汽车销售数据分析
- 【React】利用Dooringx快速制作H5搭建平台
- 环洋市场咨询:全球OLED收入预计2028年达到502.4亿美元
- 保镖机器人作文_保镖小学生作文
- JS的浮点数计算精度丢失问题解决方案
- Android RecyclerView万能分割线
- windows10 热点一直显示正在断开中
- usaco-5.1-fc-passed
- 镜像制作dockerfile编写
热门文章
- [原理篇] 逻辑回归
- 关于DCF(判别相关滤波器)的闭式解详细推导
- OpenGL编程指南14:混合半透明Blend
- 结构张量用于区分平坦、边缘、角点区域
- 从内存中加载并启动一个exe
- 使用汇编软件emu8086输出十次Hello World!
- IntelliJ Idea解决Could not autowire. No beans of 'xxxx' type found的错误提示
- C语言再学习 -- 关键字typedef
- Fully Convolutional Networks for Semantic Segmentation (FCN)论文翻译和理解
- 距离语音交互技术的更大范围应用,还差点什么?