SpringCloudGatewayRateLimiter
Spring Cloud Gateway RateLimiter 是一种网关层限流的解决方案,可以通过配置来限制应用程序的流量,避免大量请求对后端应用造成压力,从而保障系统的稳定性和可靠性。
Spring Cloud Gateway RateLimiter 实现了基于令牌桶算法的限流策略,可以通过配置来控制令牌桶中的令牌数量和生成速率,从而实现对请求流量的限制。
使用方法:
- 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- 配置限流规则
在 application.yml 文件中添加如下配置:
spring:
cloud:
gateway:
default-filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@apiKeyResolver}"
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 2
routes:
- id: demo-service
uri: http://localhost:8080
predicates:
- Path=/demo/**
以上配置表示针对路径为 /demo/** 的请求进行限流,限制的规则是每秒钟只允许处理 1 个请求,同时最多只允许 2 个请求通过。
- 自定义KeyResolver
以上配置中需要使用一个自定义的KeyResolver来获取限流的key值:
@Component("apiKeyResolver")
public class ApiKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getPath().toString());
}
}
在应用程序启动时,就会自动读取以上配置并生效,当有请求时,就会根据限流规则进行限制,如果超出限制就会返回 429 Too Many Requests 错误。
Spring Cloud Gateway RateLimiter 实现的是网关层限流,只能限制进入网关的流量,对于网关后面的服务调用,需要在服务端实现相应的限流措施。