스프링 Spring
19. Spring Boot에서 API Gateway 및 Rate Limiting 설정 (Rate Limiter)
안녕하세요! 태마입니다.
Spring 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
스프링 Spring

포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. API Gateway란?
✔ API Gateway는 클라이언트 요청을 여러 마이크로서비스로 라우팅하는 중앙 진입점 역할
✔ 인증, 로깅, 로드 밸런싱, 캐싱, Rate Limiting 등의 기능을 제공하여 API 요청을 효율적으로 관리 가능
📌 API Gateway의 주요 역할
라우팅(Routing) | 클라이언트 요청을 적절한 서비스로 전달 |
인증(Authentication) 및 보안(Security) | JWT, OAuth2를 활용한 인증 및 보안 기능 제공 |
로드 밸런싱(Load Balancing) | 여러 서비스 인스턴스로 트래픽을 분산 |
Rate Limiting | 요청 횟수를 제한하여 서비스 보호 |
📌 API Gateway를 사용하면 "클라이언트와 백엔드 간의 요청을 효율적으로 관리 가능"
2. Rate Limiting이란?
✔ Rate Limiting(요청 제한)은 클라이언트가 일정 시간 내에 보낼 수 있는 요청 수를 제한하는 기능
✔ DDoS 공격을 방지하고, API 남용을 방지하여 서비스 안정성을 유지 가능
📌 Rate Limiting이 필요한 경우
✔ API 요청이 과도하게 많아 서비스 성능이 저하될 경우
✔ DDoS 공격 및 악의적인 요청을 차단하고 싶을 때
✔ 공유 API에서 특정 사용자(고객)별 요청량을 제한해야 할 때
📌 Rate Limiting을 적용하면 "서비스 안정성을 유지하면서 트래픽을 효과적으로 제어 가능"
✅ 여기까지 API Gateway와 Rate Limiting의 개념을 배웠습니다!
👉 "그렇다면, Spring Boot에서 API Gateway와 Rate Limiting을 어떻게 구현할까?"
✅ 2부에서 Spring Cloud Gateway를 활용한 API Gateway 설정 및 Rate Limiting 구현 방법을 배워봅시다!
2. 상세 주제 정리
1. Spring Cloud Gateway 의존성 추가
✔ Spring Boot에서 API Gateway를 설정하려면 spring-cloud-starter-gateway 의존성을 추가해야 함
📌 1️⃣ build.gradle 설정
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
}
✔ Spring Cloud Gateway를 추가하여 API 요청을 관리 가능
2. API Gateway 설정 (application.yml)
✔ API Gateway에서 요청을 특정 서비스로 라우팅하도록 설정 가능
📌 application.yml 설정 예시
spring:
cloud:
gateway:
routes:
- id: user-service
uri: http://localhost:8081
predicates:
- Path=/users/**
- id: order-service
uri: http://localhost:8082
predicates:
- Path=/orders/**
✔ /users/** 요청은 user-service로, /orders/** 요청은 order-service로 라우팅
📌 API Gateway를 설정하면 "클라이언트가 단일 엔드포인트를 통해 여러 서비스에 접근 가능"
3. Rate Limiting 설정 (요청 제한 적용)
✔ Rate Limiting을 적용하려면 Bucket4j 또는 Resilience4j 같은 라이브러리를 활용 가능
📌 1️⃣ Resilience4j 의존성 추가 (Rate Limiting을 위한 라이브러리)
dependencies {
implementation 'io.github.resilience4j:resilience4j-ratelimiter'
}
✔ Resilience4j를 활용하여 API 요청을 제한 가능
📌 2️⃣ Rate Limiting 설정 (GatewayFilter 적용)
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.time.Duration;
import java.util.concurrent.Semaphore;
@Component
public class RateLimiterFilter implements GatewayFilterFactory<RateLimiterFilter.Config> {
private final Semaphore semaphore = new Semaphore(5); // 최대 동시 요청 개수 제한
public RateLimiterFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
if (!semaphore.tryAcquire()) {
exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange).doFinally(signalType -> semaphore.release());
};
}
public static class Config {
}
}
✔ 동시에 처리할 수 있는 요청 수를 제한하는 Rate Limiter 필터 구현
✔ 5개 이상의 요청이 동시에 들어오면 HTTP 429 (Too Many Requests) 응답 반환
📌 Rate Limiting을 적용하면 "API 과부하를 방지하고 서비스 안정성을 유지 가능"
📌 3️⃣ API Gateway에 Rate Limiting 필터 적용
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GatewayConfig {
private final RateLimiterFilter rateLimiterFilter;
public GatewayConfig(RateLimiterFilter rateLimiterFilter) {
this.rateLimiterFilter = rateLimiterFilter;
}
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("user-service", r -> r.path("/users/**")
.filters(f -> f.filter(rateLimiterFilter.apply(new RateLimiterFilter.Config())))
.uri("http://localhost:8081"))
.route("order-service", r -> r.path("/orders/**")
.filters(f -> f.filter(rateLimiterFilter.apply(new RateLimiterFilter.Config())))
.uri("http://localhost:8082"))
.build();
}
}
✔ Rate Limiting 필터를 API Gateway 라우트에 적용하여 요청을 제한
📌 API Gateway에서 "과부하를 방지하고 서비스 부하를 효과적으로 관리 가능"
4. API Gateway 로그 모니터링 설정
✔ API Gateway에서 요청 로그를 남겨서 트래픽을 분석 가능
📌 Logging 설정 추가 (application.yml)
logging:
level:
org.springframework.cloud.gateway: DEBUG
✔ API Gateway에서 요청 로그를 기록하여 트래픽을 분석 가능
📌 로그를 설정하면 "API Gateway의 요청 흐름을 모니터링하고 최적화 가능"
✅ 여기까지 Spring Boot에서 API Gateway 및 Rate Limiting 설정을 배웠습니다!
👉 "그렇다면, Spring WebFlux와 비동기 프로그래밍 (Reactor, Mono, Flux 개념)은 어떻게 할까?"
✅ 다음 회차에서 **Spring WebFlux와 비동기 프로그래밍 (Reactor, Mono, Flux 개념)**을 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
Spring 기초 <23. Spring Boot에서 Multi-Tenancy 아키텍처 구현> (0) | 2025.04.09 |
---|---|
Spring 기초 <22. Spring Security에서 RBAC(Role-Based Access Control) 적용> (1) | 2025.04.08 |
Spring 기초 <21. Spring Boot에서 웹소켓(WebSocket)과 실시간 데이터 처리> (1) | 2025.04.07 |
Spring 기초 <20. Spring WebFlux와 비동기 프로그래밍 (Reactor, Mono, Flux 개념)> (1) | 2025.04.06 |
Spring 기초 <18. OAuth2.0 인증 및 소셜 로그인(Google, Facebook, GitHub) 적용> (0) | 2025.04.04 |
Spring 기초 <17. Spring Boot에서 JWT(Json Web Token) 인증 구현> (0) | 2025.04.03 |
Spring 기초 <16. Spring Security 기본 개념 및 인증 방식 (JWT, OAuth2, Session 비교)> (0) | 2025.04.02 |
Spring 기초 <15. Spring Batch – 대용량 데이터 처리 및 배치 작업 구현> (0) | 2025.04.01 |