接口限流从手写到落地:自定义注解+Redis滑动窗口——一行@RateLimit就搞定
引言 上线第二个月的某个周五晚上,运营在群里发了个爆款活动链接。十分钟后,订单服务的监控曲线齐刷刷跳水——不是宕机,是一个"查优惠券"的接口被人写脚本疯狂调用,单机 QPS 冲到 8000,把 Tomcat 的 200 个工作线程全部占满,正常的下单请求全部在排队超时。 那一刻我们才意识到:限流不是"高可用锦上添花",是保命的。 当时团队内部手写的限流方案长这样——每个需要限流的接口里塞一段: // 散落在 20 多个 Controller 里的"祖传代码" if (!rateLimiter.tryAcquire("coupon/query", 100)) { throw new BizException("操作太频繁,请稍后再试"); } doQuery(); 三个致命问题: 代码侵入:业务逻辑里混着限流细节,改限流阈值要发版 策略写死:硬编码在代码里,运营说"大促期间查询放宽到 200/s",得走发布流程 单机视角:只限了单台实例,集群 8 台实例就是 8 倍配额,"100 次/秒"名存实亡 这篇文章把我们最终落地的方案完整讲一遍:自定义 @RateLimit 注解(支持 k....