gateway限流

本文介绍SpringCloud Gateway中如何通过基于Redis实现限流配置,包括IP、用户和接口限流,以及配置限流过滤器的具体步骤。

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。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值