root layout

패스트캠퍼스

RateLimiter질문입니다.

2025.02.17 16:20 작성

안녕하세요


포스트맨으로 테스트 결과

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);

};

}

}

image.png


답변 

연관 질문

커뮤니티 질문보기