RateLimiter질문입니다.
안녕하세요
포스트맨으로 테스트 결과
X-RateLimit-Remaining -1
X-RateLimit-Requested-Tokens 1
X-RateLimit-Burst-Capacity 20
X-RateLimit-Replenish-Rate 10
X-RateLimit-Remaining이 계속 -1이 뜨고 레디스 인사이트로 저장이 안되는걸 확인했습니다.
레디스도 잘 연결되어 있는데 어떻게 해야할지 정보가 없어서 질문드렸습니다.
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: shop-user-mysql
restart: always
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: admin
TZ: Asia/Seoul
volumes:
- ./db/mysql/data:/var/lib/mysql
- ./db/mysql/init:/docker-entrypoint-initdb.d
platform: linux/x86_64
redis:
container_name: shop-user-redis
hostname: redis
image: redis:latest
ports:
- "6379:6379"
restart: always
@Slf4j
@Configuration
public class RateLimitConfig {
@Bean
public RedisRateLimiter redisRateLimiter() {
// replenishRate : 초당 허용 수
// burstCapacity : 최대 누적 가능한 요청 수
RedisRateLimiter redisRateLimiter = new RedisRateLimiter(10, 20);
redisRateLimiter.setIncludeHeaders(true);
return redisRateLimiter;
}
/**
* KeyResolver는 요청이 계속 들어왔을때 어떤 부분을 key값으로 잡고 요청을 count하는 부분
* 유저별로 제한하기 위해서 X-USER-ID 헤더에서 userId가 있으면 사용을 하고 없으면
* ip주소로 제한
*/
@Bean
public KeyResolver userKeyResolver() {
return exchange -> {
String key = exchange.getRequest().getHeaders().getFirst("X-USER-ID") != null ?
exchange.getRequest().getHeaders().getFirst("X-USER-ID") :
exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
log.info("Rate Limit Key: {}", key); // 로그 추가
return Mono.just(key);
};
}
}