Spring Framework/Spring Cloud
Spring Cloud Gateway RateLimiter 적용
소농배
2020. 8. 4. 15:24
Local 환경에서 RedisRateLimiter 를 적용한 과정.
1. docker 를 이용해서 redis 띄우기
docker run -d -p 6379:6379 --name rate_limiter_redis redis
- port 를 mapping 하지 않아서 spring cloud gateway 에서 redis 로 접속이 안되는 문제가 있었다.
2. build.gradle 에 spring-boot-starter-data-redis-reactive 의존성 추가
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis-reactive', version: '2.3.2.RELEASE'
3. bootstrap.yml 에 redis 접속을 위한 설정 추가
spring:
redis:
host: localhost
port: 6379
database: 0
4. bootstrap.yml 에 RequestRateLimiter 필터 설정
spring:
cloud:
gateway:
routes:
- id: return_delivery
uri: http://localhost:8082
predicates:
- Path=/limit/test
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 5
key-resolver: "#{@myKeyResolver}"
++ Key 를 찾을 수 없을때에 대해서 block 할지 말지에 대한 설정은 아래 값을 변경해주면 된다. (true/false)
spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key: true
위와 같이 설정했다면 설정한대로 RateLimit 이 잘 동작 하는지 확인!
KeyResolver 에서 모든 요청에 대해서 동일한 key 를 사용하도록 설정하였으므로 predicate 에 매칭된 모든 요청에 대해서 RateLimit 이 적용된다.
설정한 값보다 많은 요청이 들어올 경우에 429 로 응답이 오는것을 확인할 수 있다.
RedisRateLimiter 의 응답값은 log level 을 DEBUG 로 변경하면 요청마다 확인할 수 있다.
application.properties
logging.level.root=DEBUG
2020-08-04 15:21:09.575 DEBUG 88419 --- [ioEventLoop-5-1] o.s.c.g.f.ratelimit.RedisRateLimiter : response: Response{allowed=false, headers={X-RateLimit-Remaining=0, X-RateLimit-Burst-Capacity=5, X-RateLimit-Replenish-Rate=1}, tokensRemaining=-1}
++ Redis container 에 접속해서 현재 세팅된 key 의 value 값을 redis-cli 로 확인할 수 있다.
redis container 접속
docker exec -it rate_limiter_redis /bin/bash
redis-cli 실행
redis-cli
저장되어 있는 모든 키 확인
127.0.0.1:6379> keys *
key 의 value 확인
get request_rate_limiter.{WOOOONGS}.tokens