要在spring cloud gateway中實現api限流,核心步驟包括:1. 添加依賴:引入spring-cloud-starter-gateway和spring-boot-starter-data-redis-reactive模塊,并可選支持lua腳本的redis配置;2. 配置限流策略:使用redisratelimiter工廠類,在application.yml中定義replenishrate(每秒補充令牌數)、burstcapacity(最大突發(fā)容量)及key-resolver(限流維度)等參數;3. 定義限流維度:通過編寫keyresolver實現類,如基于用戶ip地址返回mono類型的限流鍵值;4. 可選優(yōu)化:啟用lua腳本方式,通過配置script-location指向lua限流腳本,以原子操作提升并發(fā)下的準確性。以上步驟完成后,結合合理的redis配置與業(yè)務參數調整,即可實現穩(wěn)定高效的api限流功能。
API限流是微服務架構中保障系統(tǒng)穩(wěn)定性的關鍵手段之一,而spring cloud Gateway作為新一代網關組件,內置了對限流的完整支持。要實現API限流,核心在于合理配置Redis和Gateway的聯合使用,利用Redis的高性能來記錄請求次數,從而控制訪問頻率。
下面從幾個關鍵環(huán)節(jié)入手,講講怎么在Spring Cloud Gateway中完成限流配置。
1. 添加依賴:引入Redis與Gateway限流模塊
要在Spring Cloud Gateway中啟用限流功能,首先要確保項目中引入了相關的依賴包。主要用到的是spring-cloud-starter-gateway和spring-boot-starter-data-redis-reactive這兩個模塊。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency>
如果要用Lua腳本提升限流準確性(推薦),還需要確保Redis版本支持Lua腳本執(zhí)行,并且項目能正常連接Redis服務器。
2. 配置限流策略:使用RedisRateLimiter工廠類
Spring Cloud Gateway提供了一個內置的限流過濾器工廠——RedisRateLimiter,它基于令牌桶算法實現限流邏輯。
在application.yml中配置一個路由并應用限流策略:
spring: cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path=/api/user/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 redis-rate-limiter.burstCapacity: 20 key-resolver: "#{@userKeyResolver}"
上面的配置含義如下:
- replenishRate:每秒補充的令牌數,即允許的平均請求數。
- burstCapacity:令牌桶的最大容量,即突發(fā)請求最多能處理多少個。
- key-resolver:指定用于區(qū)分限流維度的Bean名稱,比如按用戶ID、IP等進行限流。
3. 定義限流維度:編寫KeyResolver實現類
限流的關鍵在于“誰被限流”,這就需要定義一個KeyResolver Bean。例如根據用戶的IP地址進行限流:
@Configuration public class RateLimiterConfig { @Bean public KeyResolver userKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName()); } }
你也可以根據實際需求擴展成更復雜的規(guī)則,比如從Header或Token中提取用戶ID做限流。
注意:這個KeyResolver必須是一個Spring Bean,并且返回值為Mono
4. 可選優(yōu)化:使用Lua腳本避免并發(fā)問題
默認情況下,Spring Cloud Gateway的限流機制通過多次Redis命令實現,這可能在高并發(fā)下出現競爭條件。為了更精確地控制限流行為,可以啟用Lua腳本方式。
開啟方式很簡單,只需要添加以下配置:
spring: cloud: gateway: redis: rate-limiter: script-location: "classpath:scripts/request_rate_limiter.lua"
然后在資源目錄下放置標準的Lua限流腳本(可以從官方示例中復制)。這樣每次限流判斷都通過一個原子操作完成,避免多個Redis命令之間的狀態(tài)不一致問題。
基本上就這些。只要把Redis配好,Key維度設計清楚,再結合業(yè)務場景調整速率參數,就能實現比較穩(wěn)定的API限流能力了。