给 API 网关装上 Redisson 分布式限流保险丝:3 步接入 + 3 个坑
发布时间:2026/9/5 20:04:16 作者:尧图编辑部 阅读量:1,286

给 API 网关装上 Redisson 分布式限流保险丝3 步接入 3 个坑【免费下载链接】redissonRedisson: Valkey Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache..项目地址: https://gitcode.com/GitHub_Trending/re/redissonRedisson 是 Redis / Valkey 的 Java 客户端用它内置的分布式限流器API 网关就能在流量洪峰前统一把关避免后端服务被打垮。为什么网关需要一根保险丝 秒杀开场那一刻下单接口会瞬间承受平时十倍的调用。数据库扛不住连健康的其他接口也会被拖死。突发爬虫更糟单一 IP 反复扫搜索接口把连接池占满正常用户跟着遭殃。这两类事故的共性是流量是脉冲式的后端处理能力是固定的中间必须有一道闸门先放行 N 个剩下的直接拒绝。这就是限流。那为什么不让每个网关节点各记各的数因为多节点对不上账每个节点都觉得自己只放了 100 个全局早超了。所以计数器必须放在所有节点共享的地方也就是 Redis。Redisson 的限流器本质是一个存在 Redis 里的计数器靠 Lua 脚本保证并发下的增减正确这部分内部机制了解即可。三步跑起来Redisson 限流怎么配置总共三步。第一步连接客户端。地址指向你的 Redis就能拿到客户端实例。第二步设速率。trySetRate的意思是尝试设置首次调用才写入之后调用不会覆盖适合启动时一次性定好速率。注意第一个参数OVERALL 表示所有客户端共享一份额度所有网关节点加起来不超过上限PER_CLIENT 表示按每个客户端实例单独计额度。Config config new Config(); config.useSingleServer().setAddress(redis://127.0.0.1:6379); RedissonClient client Redisson.create(config); RRateLimiter limiter client.getRateLimiter(limit:order:create); limiter.trySetRate(RateType.OVERALL, 100, Duration.ofSeconds(1));上面表示 1 秒内放行 100 个。第三步判断放行。tryAcquire尝试取一个许可拿到就过拿不到就拒// true 额度内false 已超限 boolean ok limiter.tryAcquire();接入网关按路径各配一个限流器关键设计思路拿请求路径当限流键。/order/create和/product/list各有一份独立额度爬虫把搜索接口打爆时不会占用下单接口的预算。键名记得加统一前缀方便以后批量清理和迁移。接入方式一句话带过Spring 项目里给 pom 加redisson-spring-boot-starter依赖配置文件中写上 Redis 地址客户端会自动创建不需要额外搭建。请求进来后按路径取限流器、尝试获取超限就返回 429——也就是浏览器提示请求过多的那个状态码你在网关监控里看到的 429 限流就来自这里RRateLimiter limiter client.getRateLimiter(limit: path); if (!limiter.tryAcquire()) { return exchange.getResponse() .setStatusCode(HttpStatus.TOO_MANY_REQUESTS).setComplete(); } return chain.filter(exchange);进阶玩法三个手段调节限流器动态调速trySetRate只在首次生效之后想改值就用setRate随时覆盖。流量低谷把 100 调到 200告警响起再压回 50无需重启。批量获取导出任务一次要占 10 个额度调tryAcquire(10, Duration.ofSeconds(2))拿到的数量和第二参数的等待上限都由你定。异步获取调用对应的*Async方法会返回RFuture结果就绪再继续处理线程全程不阻塞。避坑清单 1. OVERALL 和 PER_CLIENT 选错。现象多个网关节点时实际放行量远超配置值。原因PER_CLIENT 给每个节点独立配额10 个节点就是 10 份。解法要整个接口总量就用 OVERALL只有确实想按节点各自限制才选 PER_CLIENT。2. tryAcquire 超时不合理。现象高负载时接口 RT 突然变长线程池被排队请求塞满。原因超时给得太长请求干等很久才被拒。解法超时对齐接口的 P99 响应时间比如 50~100ms等不到额度就直接拒绝别陪跑。3. 限流键命名没有规范。现象接口调整上线后旧限流配置找不着或作用到了错误的对象。原因键就是getRateLimiter传的名字名字随手起就无法批量迁移。解法统一前缀 接口路径格式如limit:order:create改版只动前缀。限流只是网关的第一道闸极端场景下后面还得排队和降级配合。Redisson 的完整能力清单可看官方文档 docs/overview.md。【免费下载链接】redissonRedisson: Valkey Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache..项目地址: https://gitcode.com/GitHub_Trending/re/redisson创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考