Spring Cloud Gateway实现API访问频率限制
在Spring Cloud Gateway中实现API访问频率限制,可以使用Spring Cloud Gateway内置的过滤器RequestRateLimiterGatewayFilterFactory
。以下是一个简单的示例:
- 添加依赖(确保已经添加了Spring Cloud Gateway和Spring Cloud Circuit Breaker依赖):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
- 配置路由和过滤器,在
application.yml
中添加如下配置:
spring:
cloud:
gateway:
routes:
- id: rate_limited_service
uri: http://localhost:8080
filters:
- name: RequestRateLimiter
args:
key-resolver: '#{@apiKeyResolver}'
redis-rate-limiter.replenishRate: 1 # 每秒填充平均速率
redis-rate-limiter.burstCapacity: 2 # 限流容量
- 创建
KeyResolver
类,用于确定限流的键:
@Component
public class ApiKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
// 这里可以根据实际情况获取用户ID或者其他用于区分用户的信息
return Mono.just(exchange.getRequest().getQueryParams().getFirst("apiKey"));
}
}
- 配置Redis连接:
spring:
redis:
host: localhost
port: 6379
以上配置将会对路由rate_limited_service
进行访问频率限制,基于提供的API key进行限流,每秒允许1个请求,最大Burst容量为2。
确保你的Redis服务器正在运行,并且Spring Cloud Gateway的路由配置指向了正确的服务。
访问API时,你可以通过添加查询参数apiKey
来试验限流效果,例如:
http://localhost:8080/api?apiKey=123
如果你需要对所有API进行限流,可以将key-resolver
指定为使用请求的原始IP地址:
spring:
cloud:
gateway:
routes:
- id: rate_limited_service
uri: http://localhost:8080
filters:
- name: RequestRateLimiter
args:
key-resolver: '#{@ipAddressResolver}'
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 2
并创建IpAddressResolver
类:
@Component
public class IpAddressResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
}
这样配置后,每个IP地址将被限制为每秒一个请求。
评论已关闭