ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

高并发 API 网关防雪崩:用 Redisson 分布式限流挡住流量洪峰

高并发 API 网关防雪崩:用 Redisson 分布式限流挡住流量洪峰 高并发 API 网关防雪崩用 Redisson 分布式限流挡住流量洪峰【免费下载链接】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凌晨3点一个刷单脚本把下单接口打到雪崩整条链路跟着崩。与其靠人力盯监控不如在网关入口就把流量摁住。这正是 Redisson 分布式限流要解决的场景。它到底解决了什么Redisson 是一个 Redis / Valkey 的 Java 客户端把限流状态直接存在 Redis 里靠 Lua 脚本在 Redis 单线程内原子执行的脚本保证多个实例同时抢许可时不超发。核心价值只有一条限流决策集中在一处任何一台网关机器都读同一份配额。你不用自己维护计数器也不会因为请求落到不同节点而失控。最小可用方案30 秒跑通第一个限流器先跑通再谈调优。下面这段代码建一个客户端、拿一个限流器、设好速率、试着抢许可。Config config new Config(); config.useSingleServer().setAddress(redis://127.0.0.1:6379); RedissonClient redisson Redisson.create(config); // 名字对应 Redis 里的一个 key是限流器的身份标识 RRateLimiter limiter redisson.getRateLimiter(api:order:limiter); // 首次设置每 1 秒最多放行 100 个请求 limiter.trySetRate(RateType.OVERALL, 100, Duration.ofSeconds(1)); boolean ok limiter.tryAcquire(); // 抢一个许可 System.out.println(ok);跑起来后ok每秒最多出现 100 个true之后全变false。限流器在 Redis 里会生成{api:order:limiter}这几个 key存速率和剩余许可。几个关键参数逐个讲透限流行为由三个参数决定逐个拆开看。rate和rateInterval速率与窗口是什么窗口内最多放行的许可数和窗口时长。怎么设trySetRate(RateType.OVERALL, 100, Duration.ofSeconds(1))即 1 秒 100 个。设错会怎样窗口开太大峰值挡不住开太小正常流量也被拦接口误报 429。RateType全局限流还是按客户端限流是什么计数范围。OVERALL全局共享一份配额PER_CLIENT每个 Redisson 实例各算各的。怎么设网关统一挡量用OVERALL想按调用方隔离用PER_CLIENT。设错会怎样本意要全局封顶却用了PER_CLIENT多台网关加起来会翻倍限流形同虚设。RateType含义典型用途OVERALL所有实例共享同一配额网关按接口总量封顶PER_CLIENT每个客户端各一份配额按调用方隔离避免互相挤占tryAcquire和acquire抢不到怎么办是什么tryAcquire()抢不到立刻返回falseacquire()抢不到就阻塞等待直到拿到。怎么设网关高 QPS 场景用tryAcquire别用阻塞的acquire。设错会怎样用了阻塞式流量一尖峰线程全堆在等待上池子很快被占满。从 Demo 到生产网关集成三步走第一步加依赖。在 pom 里引入 Spring Boot 启动器。dependency groupIdorg.redisson/groupId artifactIdredisson-spring-boot-starter/artifactId version3.40.0/version /dependency第二步配连接。在 application.yml 里指到同一份 Redis网关集群必须共用。spring: data: redis: host: 127.0.0.1 port: 6379 redisson: config: | singleServerConfig: address: redis://127.0.0.1:6379 connectionMinimumIdleSize: 8第三步写过滤器。按路径拿限流器抢不到直接回 429。public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { String path exchange.getRequest().getPath().value(); RRateLimiter limiter redisson.getRateLimiter(gw: path); limiter.trySetRate(RateType.OVERALL, 100, Duration.ofSeconds(1)); if (limiter.tryAcquire()) { return chain.filter(exchange); // 抢到放行 } exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS); return exchange.getResponse().setComplete(); // 抢不到回 429 }trySetRate只在限流器还没初始化时生效所以每个节点反复调它也不会互相覆盖阈值。进阶用法与常见坑别用已废弃的枚举单位。RateIntervalUnit标记了Deprecated直接换Duration重载可读性更好setRate(RateType.OVERALL, 200, Duration.ofSeconds(1))。一次申请不能超过rate。Lua 脚本里有断言tryAcquire(150)而rate100会直接抛异常不是返回 false。想动态改阈值别用trySetRate。它改不动已存在的值要用setRate重置或用updateRate(RateLimiterArgs.of(...))保留状态。keepAliveTime有约束。传了 keepAliveTime 必须 ≥rateInterval否则抛IllegalArgumentException。想省线程用异步版。RFutureBoolean f limiter.tryAcquireAsync(1);回调里再决定放行或拒绝。限流阈值和配额都落在 Redis接口文档在 docs/data-and-services/objects.md限流器接口定义见 RRateLimiter.java。【免费下载链接】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),仅供参考
返回列表