分布式限流:Spring Cloud Gateway 限流
在现代微服务架构中,流量控制是一个至关重要的部分。分布式限流作为一种有效的流量控制手段,能够帮助我们保护系统不被突发的流量冲垮。Spring Cloud Gateway支持多种限流方式。
什么是分布式限流
分布式限流是一种在分布式系统中限制请求数量的技术,旨在保护服务不被过载请求压垮。常见的限流算法包括漏桶算法、令牌桶算法和计数器算法。
漏桶算法
漏桶算法通过一个固定容量的漏桶来限制数据的流入和流出,确保流量以恒定速率处理。
令牌桶算法
令牌桶算法在固定时间间隔内向桶中添加一定数量的令牌,请求必须拿到令牌才能被处理,从而控制请求速率。
计数器算法
计数器算法在固定时间窗口内对请求计数,当计数达到预设上限时,拒绝后续请求。
Spring Cloud Gateway 限流实现
Spring Cloud Gateway 提供了多种限流方式,包括基于 Redis 的分布式限流。下面我们将详细介绍如何使用 Redis 实现分布式限流。
配置依赖
首先,在 pom.xml
中添加必要的依赖:
<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>
配置限流过滤器
在 application.yml
中配置限流过滤器:
spring:
cloud:
gateway:
routes:
- id: limit_route
uri: http://your-service
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
启用 Redis
确保 Redis 服务正在运行,并在 application.yml
中配置 Redis 连接:
spring:
redis:
host: localhost
port: 6379
自定义限流键
为了根据不同的业务需求自定义限流键,可以实现 KeyResolver
接口:
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;
@Configuration
public class RateLimiterConfiguration {
@Bean
public KeyResolver userKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
}
在 application.yml
中引用自定义的 KeyResolver
:
spring:
cloud:
gateway:
routes:
- id: limit_route
uri: http://your-service
filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@userKeyResolver}"
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20