SpringBoot API限流实战:令牌桶与分布式方案
1. 为什么我们需要API限流上周我们的订单服务突然崩溃排查后发现是某个合作方疯狂调用查询接口每秒请求量突破5000次直接打垮了服务集群。这种场景下API限流就像高速路上的收费站必须控制车流速度才能保证系统畅通。SpringBoot生态中有多种成熟的限流方案今天我就结合生产实践分享三种最实用的实现方式。2. 主流限流方案对比选型2.1 令牌桶 vs 漏桶算法先看两个核心算法令牌桶系统以固定速率往桶里放令牌请求需要拿到令牌才能执行类似游乐园门票漏桶请求像水一样流入桶中以恒定速率流出处理像漏斗匀速过滤我们做过压测对比算法类型突发流量处理实现复杂度适用场景令牌桶允许短时突发中等需要弹性限流的API漏桶严格匀速简单需要绝对平滑的场景2.2 Guava RateLimiter实战// 每秒10个令牌的限流器 RateLimiter limiter RateLimiter.create(10.0); GetMapping(/order) public String createOrder() { if(!limiter.tryAcquire()) { throw new RuntimeException(手速太快啦稍后再试); } // 业务逻辑 }重要提示单机版RateLimiter在集群环境下需要配合Redis实现分布式限流2.3 RedisLua分布式方案这是我们的生产级配置-- KEYS[1]限流keyARGV[1]限流阈值ARGV[2]过期时间 local key KEYS[1] local limit tonumber(ARGV[1]) local expire tonumber(ARGV[2]) local current tonumber(redis.call(get, key) or 0) if current 1 limit then return 0 else redis.call(INCR, key) if current 0 then redis.call(EXPIRE, key, expire) end return 1 endJava调用示例// 每秒限流100次 String luaScript ...; // 上面的脚本 RedisScriptLong script RedisScript.of(luaScript, Long.class); Boolean allowed redisTemplate.execute(script, Collections.singletonList(api_limit:apiKey), 100, 1);3. SpringCloud Gateway全局限流3.1 网关层过滤器配置spring: cloud: gateway: routes: - id: order-service uri: lb://order-service predicates: - Path/api/order/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 50 # 每秒令牌数 redis-rate-limiter.burstCapacity: 100 # 令牌桶容量 key-resolver: #{ipKeyResolver}3.2 自定义限流维度Bean KeyResolver ipKeyResolver() { return exchange - { String ip exchange.getRequest() .getRemoteAddress().getAddress().getHostAddress(); return Mono.just(ip); // 按IP限流 }; }可以扩展为按用户ID、设备号等维度限流4. 生产环境避坑指南4.1 突发流量应对策略我们曾遇到秒杀活动导致限流失效最终采用分级限流方案网关层全局QPS限制服务层方法级细粒度限流线程池控制并发处理数4.2 监控指标埋点建议监控这些关键指标限流触发次数请求响应时间P99系统负载变化错误码429占比Prometheus配置示例- pattern: spring_cloud_gateway_requests_seconds_count{outcomeTHROTTLED,} name: api_throttled_requests4.3 动态调整技巧通过配置中心实现热更新RefreshScope Configuration public class RateLimitConfig { Value(${rate.limit.threshold}) private int threshold; // 动态创建限流器 }5. 高级场景解决方案5.1 热点参数限流比如对商品详情页实现普通商品1000QPS爆款商品5000QPSRateLimiter(value #{rateConfig.getLimit(#productId)}) public ProductDetail getDetail(String productId) { //... }5.2 灰度环境特殊策略在AB测试时我们对新老版本采用不同限流值if(featureToggle.isNewVersion(userId)){ rateLimiter RateLimiter.create(200); }else{ rateLimiter RateLimiter.create(100); }实际项目中我们组合使用这些方案后API可用性从99.5%提升到了99.99%。最后分享一个经验在网关层建议设置稍宽松的限流值具体的业务规则限制放在服务内部实现这样既能防刷又不会误伤正常请求。

相关新闻

AI 动手之前先让人拍板:Laravel AI 工具审批机制完整指南

AI 动手之前先让人拍板:Laravel AI 工具审批机制完整指南

【免费下载链接】ai The Laravel AI SDK provides a unified, expressive API for interacting with AI providers such as OpenAI, Anthropic, Gemini, and more. 项目地址: https://gitcode.com/gh_mirrors/ai89/ai 点击查看 免费下载 在 Laravel AI 中&#xff…

2026/10/15 15:08:52 阅读更多 →
64位ZBarSDK集成实战:从链接报错到稳定出码的完整路径

64位ZBarSDK集成实战:从链接报错到稳定出码的完整路径

简介:64位ZBarSDK是一套面向移动端与桌面端开发者的二维码扫描开发工具包,针对64位架构优化,可在iOS、Android及Windows平台集成使用,解决应用中二维码识别与数据接入的问题。压缩包共42个文件,约2.54MB,以…

2026/10/15 15:08:52 阅读更多 →
订单系统性能优化实战:从故障定位到架构升级

订单系统性能优化实战:从故障定位到架构升级

1. 事故背景与问题定位那天凌晨2点17分,我被一连串急促的报警短信惊醒。生产环境的核心订单服务响应时间从平时的200ms飙升到8秒以上,错误率突破30%。打开监控大盘时,整个服务集群的CPU利用率曲线像悬崖般陡峭上升,部分节点已经触…

2026/10/15 15:07:52 阅读更多 →

最新新闻

GD32F3x0固件库实战:时钟配置、PWM定时器与STM32迁移避坑指南

GD32F3x0固件库实战:时钟配置、PWM定时器与STM32迁移避坑指南

简介:面向GD32F3x0与GD32F30x系列MCU开发者的资源包,整合标准固件库及多种集成开发环境支持补丁,可解决Keil4、Keil5与IAR不同版本下的工程搭建与调试适配问题。包内含三个独立组件:Keil4环境补丁、Keil5在线支持包以及IAR环境补丁…

2026/10/15 15:51:06 阅读更多 →
世界地图GeoJSON实战:精度选择、前端渲染与TopoJSON压缩

世界地图GeoJSON实战:精度选择、前端渲染与TopoJSON压缩

简介:这份资源面向地理信息开发、地图可视化与GIS教学研究者,提供覆盖全球国家边界的世界地图GeoJSON数据集,可用于构建交互式世界地图、开展地理空间分析或作为服务端地理信息API的数据基础。压缩包共约2000个文件,以3443个json文…

2026/10/15 15:51:06 阅读更多 →
Delphi嵌入ECharts实现工业软件数据可视化

Delphi嵌入ECharts实现工业软件数据可视化

简介:本资源是一个面向Delphi开发者的数据可视化实践项目,聚焦于在原生Windows桌面应用中集成百度ECharts图表库,解决传统Delphi程序缺乏现代交互式图表能力的痛点,适用于数据分析、监控系统、报表工具等需动态展示数据的中高级开…

2026/10/15 15:51:06 阅读更多 →
CSS实现鼠标经过让图片在div中放大和缩小:TaoToken统一Key通道下的前端动效调试与验证

CSS实现鼠标经过让图片在div中放大和缩小:TaoToken统一Key通道下的前端动效调试与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 15:51:06 阅读更多 →
Whisper Money快速上手:从1条命令到Docker部署的完整教程,5分钟跑起你的私人财务中心

Whisper Money快速上手:从1条命令到Docker部署的完整教程,5分钟跑起你的私人财务中心

【免费下载链接】whisper-money Understand your personal finances. Forget Excels, try Whisper Money. 项目地址: https://gitcode.com/gh_mirrors/wh/whisper-money 点击查看 免费下载 Whisper Money 是一款注重隐私的开源个人财务管理应用,帮你记录…

2026/10/15 15:51:06 阅读更多 →
Mouzi完全评测:免费离线、隐私优先,这个自动文件整理工具如何治服你的下载文件夹

Mouzi完全评测:免费离线、隐私优先,这个自动文件整理工具如何治服你的下载文件夹

【免费下载链接】mouzi A free, privacy-first automatic file organizer that quietly sorts your Downloads folder from the system tray. 项目地址: https://gitcode.com/gh_mirrors/mo/mouzi 点击查看 免费下载 Mouzi 是一款免费、开源、100% 离线的自动文件整…

2026/10/15 15:50:05 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →