Gateway说明
Spring Cloud Gateway 作为新一代网关,性能上有很大提升,而且 加了许多实用的功能。今天说下 Gateway 在spring cloud中的限流配置。

限流的目的
由于API 网关作为所有请求的入口,请求量大,所以可以对并发访问的请求进行限速来保护服务的可用性

目前限流提供了基于 Redis 的实现,我们需要增加pom文件以下依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

可以通过 KeyResolver 来指定限流的 Key,比如我们需要根据用户,IP ,接口等来做限流

IP 限流的 Key 指定具体代码如下

@Bean
public KeyResolver ipKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}

public static String getIpAddr(ServerHttpRequest request) {
    HttpHeaders headers = request.getHeaders();
    List<String> ips = headers.get("X-Forwarded-For");
    String ip = "127.0.0.1";
    if (ips != null && ips.size() > 0) {
        ip = ips.get(0);
    }
    return ip;
}

用户限流:

@Bean
KeyResolver userKeyResolver() {
    return exchange ->
        Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
}

接口限流:

@Bean
KeyResolver apiKeyResolver() {
    return exchange ->
        Mono.just(exchange.getRequest().getPath().value());
}

然后配置限流的过滤器

server:
  port: 8080
spring:
  redis:
    host: 127.0.0.1
    port: 6379
  cloud:
    gateway:
  routes:
    - id: test
  uri: lb://test
  predicates:
    - Path=/test/**
  filters:
    - name: RequestRateLimiter
  args:
    redis-rate-limiter.replenishRate: 10
    redis-rate-limiter.burstCapacity: 20
    key-resolver: "#{@ipKeyResolver}"

以下需注意几点:
filter 名称必须是 RequestRateLimiter。
redis-rate-limiter.replenishRate:允许用户每秒处理多少个请求。
redis-rate-limiter.burstCapacity:令牌桶的容量,允许在 1s 内完成的最大请求数。
key-resolver:使用 SpEL 按名称引用 bean。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐