IT Developer/Spring

Spring 기초 <19. Spring Boot에서 API Gateway 및 Rate Limiting 설정 (Rate Limiter)>

TEMA_ 2025. 4. 5. 13:48
반응형

스프링 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 개념)**을 배워봅시다!



 

반응형