0

I am trying to use Geode Redis Adapter as my server for Rate Limiting provided by Spring Cloud Gateway. If I use a real Redis Server, everything works perfectly, but with Geode Redis Adapter doesn't. I am not too sure if this functionality is supported.

I tried to start a [Geode image] (https://hub.docker.com/r/apachegeode/geode/) exposing the default Redis port 6739. Starting the container, I executed using gfsh the following commands: start server --name=redis --redis-port=6379 --J=-Dgemfireredis.regiontype=PARTITION_PERSISTENT

When I try to access in my local machine by redis-cli -h localhost -p 6379 I can get connected.

My implementation is simple:

application.yaml

      - id: rate-limitter
        predicates:
          - Path=${GUI_CONTEXT_PATH:/rate-limit}
          - Host=${APP_HOST:localhost:8080}
        filters:
          - name: RequestRateLimiter
            args:
              key-resolver: "#{@remoteAddrKeyResolve}"
              redis-rate-limiter:
                replenishRate: ${rate.limit.replenishRate:1}
                burstCapacity: ${rate.limit.burstCapacity:2}
        uri: ${APP_HOST:localhost:8080}

Application.java

  @Bean
  KeyResolver remoteAddrKeyResolve() {
    return exchange -> Mono.just(exchange.getSession().subscribe().toString());
  }

When my application is started and I try to access /rate-limit, I expected to connect to redis and my page be displayed.

However, my Spring application keeps trying to access and can't i.l.c.p.ReconnectionHandler: Reconnected to localhost:6379. So, the page is not displayed and keep loading. FIXED in Edit1 below

Problem is I am using RedisRateLimiter and tried to simulate the access with a for loop. Checking the RedisRateLimiter.REMAINING_HEADER, the value is -1 always. Doesn't seems right, because I don't have this issue in Redis itself. During the start of the application, I also receive these messages on connection to Geode Redis Adapter: Starting without optional epoll library Starting without optional kqueue library

Is anything missing in my Geode Redis Adapter or anything else in Spring? Thank you

Edit 1: I was missing to start the locator and region, that's why I wasn't able to connect. start locator --name=locator start server --name=redis --redis-port=6379 --J=-Dgemfireredis.regiontype=PARTITION_PERSISTENT create region --name=redis-region --type=REPLICATE_PERSISTENT

Julia Bel
  • 337
  • 4
  • 18
  • I'm not entirely sure if this would work since Spring Cloud Gateway executes a lua script to calculate the remaining RPS. Could be that this is not working with Geode. Try to see if it can execute this script on `RedisRateLimiter`L225. – TYsewyn Jul 17 '19 at 16:02
  • Tysewyn, I think you maybe be right. I am using RedisRateLimiter and tried to simulate the access with a for. Checking the RedisRateLimiter.REMAINING_HEADER, the value is -1. Would it respond your suggestion? I am updating the question. – Julia Bel Jul 18 '19 at 08:45

0 Answers0