3

我在我的 spring cloud api 网关中使用 redis 实现了 ratelimit。这是一部分application.yml

spring:  
  cloud:
    gateway:
      httpclient:
        ssl:
          useInsecureTrustManager: true
      discovery:
        locator:
          enabled: true
      routes:
        - id: test-rest-service
          uri: lb://test-rest-service
          predicates:
            - Path=/test/**
          filters:
            - RewritePath=/test/(?<path>.*), /$\{path}
            - name: RequestRateLimiter
              args:
                key-resolver: "#{@userRemoteAddressResolver}"
                redis-rate-limiter.replenishRate: 2
                redis-rate-limiter.burstCapacity: 3

我通过邮递员调用了 GET API 并检查了响应标头。

X-RateLimit-Remaining -1
X-RateLimit-Burst-Capacity 3
X-RateLimit-Replenish-Rate 2

速率限制不起作用。为什么我得到负值X-RateLimit-Remaining?这是什么意思?我如何解决它?

4

2 回答 2

0

我最近遇到了同样的问题。就我而言,安装了旧版本的 Redis,导致 X-RateLimit-Remaining 不断设置为 -1。

redis-cli shutdown
于 2020-05-18T09:54:33.183 回答
0

这发生在我身上是因为没有启动 Redis 实例。你有两个选择:

1) 使用 docker 下载并运行一个 Redis 实例:

docker run --name redis -d redis

2) 您可以通过添加 maven 依赖项来测试嵌入式 Redis 服务器如下文所述:

<dependency>
  <groupId>it.ozimov</groupId>
  <artifactId>embedded-redis</artifactId>
  <version>0.7.2</version>
  <scope>test</scope>
</dependency>

并包括以下代码段:

@TestConfiguration
public class TestRedisConfiguration {

    private RedisServer redisServer;

    public TestRedisConfiguration() {
        this.redisServer = new RedisServer(6379);
    }

    @PostConstruct
    public void postConstruct() {
        redisServer.start();
    }

    @PreDestroy
    public void preDestroy() {
        redisServer.stop();
    }
}
于 2020-04-26T22:24:05.693 回答