이번 강의에서는 Spring Boot
기반의 개별 마이크로서비스 내부에서 Rate Limiter
패턴을 구현하는 방법을 설명합니다. 이 예제에서는 getJavaVersion()
메서드를 사용하여 요청 속도를 제한합니다. 이를 통해 지정된 시간 내에 허용된 요청 수를 초과할 경우 오류를 반환하도록 합니다.
먼저, getJavaVersion()
메서드에 @RateLimiter
어노테이션을 추가합니다.
@RateLimiter(name = "getJavaVersion")
public String getJavaVersion() {
// 실제 Java 버전 정보를 반환하는 로직
return System.getProperty("java.version");
}
@RateLimiter
설명: 이 어노테이션을 통해 메서드 호출에 대한 속도 제한을 설정할 수 있습니다. name
속성에는 Rate Limiter 설정을 식별할 이름을 지정합니다.이제 application.yml
파일에 Rate Limiter 설정을 추가합니다.
resilience4j:
ratelimiter:
configs:
default:
limitRefreshPeriod: 5000ms
limitForPeriod: 1
timeoutDuration: 1s
limitRefreshPeriod
: 5초(5000ms)마다 할당량을 새로 고칩니다.limitForPeriod
: 매 5초마다 최대 1개의 요청만 허용됩니다.timeoutDuration
: 요청이 제한된 경우, 새로운 할당량이 생성될 때까지 최대 1초 동안 기다립니다. 1초가 지나도 새로운 할당량이 생성되지 않으면 오류가 반환됩니다.설정을 마친 후, 애플리케이션을 다시 빌드하고 시작합니다.
./mvn clean install
이후, AccountsApplication
을 시작하고 GatewayServerApplication
을 재시작합니다.
./mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8080
이제 Postman
을 사용하여 getJavaVersion()
API를 여러 번 호출하여 Rate Limiter 동작을 확인합니다.
POST http://localhost:8080/accounts/getJavaVersion
RateLimiter
에 의해 제한되어 "RateLimiter does not permit further calls" 오류가 발생합니다.이제 Rate Limiter에서 요청이 제한된 경우에 대비한 fallback 메서드를 추가합니다.
@RateLimiter(name = "getJavaVersion", fallbackMethod = "getJavaVersionFallback")
public String getJavaVersion() {
return System.getProperty("java.version");
}
public String getJavaVersionFallback(Throwable throwable) {
// Fallback 메서드에서는 간단한 대체 값을 반환합니다.
return "Java 17";
}
getJavaVersionFallback
메서드는 Rate Limiter가 호출을 허용하지 않을 때 호출됩니다. 여기서 기본값 "Java 17"을 반환합니다.애플리케이션을 재시작한 후, 다시 API를 테스트합니다. 여러 번 요청을 보낸 후에는 Rate Limiter
에 의해 제한되며, 이때 fallback 메서드가 호출되어 "Java 17"이 반환됩니다.
이번 강의에서는 개별 Spring Boot
마이크로서비스에서 Rate Limiter
패턴을 구현하는 방법을 학습했습니다. 이 패턴은 시스템의 안정성을 유지하고 과도한 트래픽을 제어하는 데 유용합니다. 또한, fallback 메커니즘을 통해 제한된 요청에 대한 대체 응답을 제공할 수 있습니다. 이를 통해 비즈니스 요구 사항에 맞는 유연한 서비스 설계를 할 수 있습니다.