当前位置: 首页 > news >正文

简易的提交限流实现-java

public class MessageController {// ================== 1. 限流配置区域 (纯Java实现) ==================// 最大容量 (允许瞬间并发多少个)private static final double MAX_TOKENS = 5.0;// 生成速率 (每秒允许通过多少个请求,这里设为 2 个/秒)private static final double RATE_PER_SECOND = 2.0;// 当前剩余令牌数 (初始填满)private static double currentTokens = MAX_TOKENS;// 上次补充令牌的时间private static long lastRefillTime = System.currentTimeMillis();// 线程锁对象 (保证多线程安全)private static final Object lock = new Object();/*** 尝试获取令牌 (核心算法)* @return true=获取成功(放行), false=获取失败(拦截)*/private boolean tryAcquire() {synchronized (lock) {long now = System.currentTimeMillis();// A. 计算由于时间流逝,应该补充多少令牌// (当前时间 - 上次时间) / 1000秒 * 每秒速率double generatedTokens = (now - lastRefillTime) / 1000.0 * RATE_PER_SECOND;// B. 补充令牌,但不能超过最大容量if (generatedTokens > 0) {currentTokens = Math.min(MAX_TOKENS, currentTokens + generatedTokens);lastRefillTime = now; // 更新补充时间}// C. 尝试拿走 1 个令牌if (currentTokens >= 1.0) {currentTokens -= 1.0;return true; // 放行} else {return false; // 桶空了,拦截}}}// ================== 限流配置结束 ==================/*** 接收表单提交*/public void save() {// 【第 4 道防线:全局熔断限流】// 如果拿不到令牌,直接返回繁忙,根本不执行后面的数据库查询if (!tryAcquire()) {renderJson(Ret.fail("msg", "提交人数过多,请稍后重试"));return;}// ... 下面是你的业务代码 ...// 1. 验证码校验// 2. 判空// 3. 手机号去重 (DB查询)// 4. IP 限流 (Cache查询)// ... 保存到数据库}// ... 其他方法 ...
}

代码解析

  1.  关键字

    • 必须使用 static 修饰 currentTokens 等变量。

    • 因为 JFinal 的 Controller 是多例的(或者是原型模式),每次请求都会 new 一个新的 Controller 对象。只有 static 才能让所有请求共享同一个“令牌桶”。

  2. synchronized (lock)

    • 这是为了线程安全

    • 当 100 个请求同时到达 tryAcquire 方法时,必须要排队去拿令牌,防止出现“计算错误”(例如本来只有 1 个令牌,结果两个线程同时读到有余额,都放行了)。

    • 由于这个锁里的逻辑非常简单(只有加减法运算),耗时是纳秒级的,完全不会影响系统性能。

效果

  • 平时:用户慢慢填表单,令牌桶一直是满的,点击提交瞬间通过。

  • 被攻击时:黑客 1 秒发 1000 个请求。

    • 前 5 个请求瞬间通过(消耗掉桶里的存货)。

    • 第 6 个请求进来,发现桶空了,直接被 if (!tryAcquire()) 拦截,返回 JSON 错误。

    • 后续每过 0.5 秒(1秒 / 2个速率),系统会自动生成 1 个新令牌,允许 1 个请求通过。

    • 数据库:每秒最多只承受 2 次查询压力,稳如泰山。

这就是【最简单的分布式拒绝服务防御】(DDoS Protection Lite),不用第三方包,原生 Java 就能搞定!

http://www.zskr.cn/news/74249.html

相关文章:

  • 刚入职的AIops菜鸡,应该知道gang-scheduling和binpack调度吗?
  • 2025年评价高的挂通垃圾车/勾臂垃圾车厂家推荐及选购参考榜
  • CMCC RAX3000Me 23.10 升级 24.10 救砖
  • 2025年比较好的汽车散装设备/散装设备行业内口碑厂家排行榜
  • 关键词:
  • 2025年比较好的ODM/OEM衣帽间收纳最新用户好评榜
  • 深圳继承纠纷律师哪家强?2025年最新避坑指南及5位高口碑律师专业推荐!
  • 短视频直播系统,关于数据关系的正确认知 - 云豹科技
  • 视频快下:可自动更新的视频下载工具, 一直可以使用
  • 2025年热门的单螺旋压榨机TOP品牌厂家排行榜
  • 2026 北京市律师哪家好?权威测评排行榜:5 家机构实力与解决方案解析
  • 2025年新能源汽车升级排名及软件升级推荐,看看哪家专业可靠
  • 2025年热门的起重机减速机最新TOP品牌厂家排行
  • 2025年质量好的拖拉机圆盘耙厂家推荐及选择参考
  • 2025年知名的耐铬酸涂层厂家最新实力排行
  • wps窗口置顶的方法
  • 一款基于 .NET WinForm 开源、轻量且功能强大的节点编辑器,采用纯 GDI+ 绘制无任何依赖库仅仅100+Kb - 教程
  • 小视频源码,关于鉴权你了解多少? - 云豹科技
  • 2025年靠谱的耐盐雾型MMA彩色防滑路面‌/薄层喷涂MMA彩色防滑路面厂家最新权威实力榜
  • 2025年知名的双向犁厂家最新TOP排行榜
  • 故城县农村自建房找谁好?河北省衡水市故城县自建房公司/机构深度评测口碑推荐榜
  • 2025年哈尔滨隐形车衣服务推荐榜单,看看哪家服务好?
  • 2025年热门的智能无主灯厂家最新TOP排行榜
  • 2025年中国五大商用音乐授权平台推荐:猴子音悦的市场口碑如
  • 2025年靠谱的处理压滤机高评价厂家推荐榜
  • 2025年质量好的单螺旋挤浆机行业内知名厂家排行榜
  • .Net使用AgentFramework进行多Agent工作流编排-智能体AI开发
  • 2026 年广西 PET/KET 备考观察:考生家长的现实挑战与专业应对路径
  • 2025年质量好的反弹阻尼隐藏轨/橱柜阻尼隐藏轨最新TOP厂家排名
  • 三石量化股票数据提取分析报告 - 2025年12月06日