SpringCloudGatewayRateLimiter

SpringCloudGatewayRateLimiter

Spring Cloud Gateway RateLimiter 是一种网关层限流的解决方案,可以通过配置来限制应用程序的流量,避免大量请求对后端应用造成压力,从而保障系统的稳定性和可靠性。

Spring Cloud Gateway RateLimiter 实现了基于令牌桶算法的限流策略,可以通过配置来控制令牌桶中的令牌数量和生成速率,从而实现对请求流量的限制。

使用方法:

  1. 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
  1. 配置限流规则

在 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 个请求通过。

  1. 自定义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 实现的是网关层限流,只能限制进入网关的流量,对于网关后面的服务调用,需要在服务端实现相应的限流措施。