Spring Cloud Gateway는 마이크로서비스 아키텍처(MSA) 환경에서 사용되는 API Gateway 솔루션입니다. 스프링 팀이 공식적으로 제공하며 Spring WebFlux 기반으로 만들어졌습니다.
✅ Spring Cloud Gateway란?
- API Gateway 역할을 수행하는 프레임워크입니다.
- 클라이언트와 여러 마이크로서비스 사이의 단일 진입점 역할을 합니다.
- 비동기 리액티브 프로그래밍(Non-blocking) 기반으로 구현되어 성능이 뛰어납니다.
- 요청 라우팅, 필터링, 보안, 로드 밸런싱 등의 기능을 제공합니다.
✅ Spring Cloud Gateway의 주요 기능
라우팅 (Routing)
- 요청을 적절한 서비스로 전달합니다.
- URL 패턴이나 조건에 따라 라우팅 규칙을 설정할 수 있습니다.
필터 (Filters)
- 요청과 응답을 전/후 처리할 수 있습니다.
- 예:
- 인증/인가 검사
- 로그 추가
- 헤더 추가/변경
로드 밸런싱 (Load Balancing)
- Spring Cloud LoadBalancer와 통합되어 여러 서비스 인스턴스에 요청을 분산할 수 있습니다.
보안 (Security)
- JWT 인증, CORS 설정, SSL/TLS를 통해 보안 기능을 제공합니다.
속도 제한 (Rate Limiting)
- 요청 수를 제한하여 과부하를 방지할 수 있습니다.
Fallback 및 재시도 (Retry)
- 실패 시 Fallback 처리를 하거나 요청을 재시도할 수 있습니다.
경로 변환 (Path Rewrite)
- 요청 경로를 동적으로 변경하거나 재정의할 수 있습니다.
✅ Spring Cloud Gateway 설정 방법
1. 의존성 추가
pom.xml
에 Spring Cloud Gateway 의존성을 추가합니다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
2. application.yml 설정
라우팅 규칙과 필터를 설정합니다.
spring:
cloud:
gateway:
routes:
- id: user-service # 라우팅 규칙 ID
uri: http://localhost:8081 # 대상 서비스 URI
predicates: # 조건
- Path=/api/users/** # 경로 조건
filters:
- AddRequestHeader=example-header, example-value # 요청 헤더 추가
- RewritePath=/api/(?<segment>.*), /$\{segment} # 경로 재작성
- id: order-service
uri: http://localhost:8082
predicates:
- Path=/api/orders/**
filters:
- CircuitBreaker=name=orderServiceFallback
3. 라우팅 및 필터 처리 예시
Custom Filter (필터 커스터마이징 예시):
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
@Component
public class CustomHeaderFilter extends AbstractGatewayFilterFactory<CustomHeaderFilter.Config> {
public CustomHeaderFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
exchange.getRequest()
.mutate()
.header("X-Custom-Header", "CustomHeaderValue");
return chain.filter(exchange);
};
}
public static class Config {
// 설정 클래스 (필요시 설정값 추가)
}
}
application.yml
에 필터 적용:
filters:
- name: CustomHeaderFilter
✅ Spring Cloud Gateway 주요 장점
리액티브 기반
- Spring WebFlux를 기반으로 비동기/Non-blocking 방식을 사용하여 높은 성능을 제공합니다.
유연한 라우팅
- 다양한 조건(Predicate)과 필터를 통해 정교한 라우팅이 가능합니다.
확장성
- 사용자 정의 필터를 통해 기능을 확장할 수 있습니다.
Spring Cloud 통합
- Eureka, Spring Cloud LoadBalancer, Config Server와 쉽게 연동됩니다.
✅ Spring Cloud Gateway vs Netflix Zuul
기능 | Spring Cloud Gateway | Netflix Zuul |
---|---|---|
프로그래밍 모델 | 리액티브 기반 (WebFlux) | Servlet 기반 (블로킹 I/O) |
성능 | 비동기 처리로 성능이 더 뛰어남 | 상대적으로 성능이 낮음 |
확장성 | 커스텀 필터와 유연한 확장 제공 | 기본 필터 제공, 확장성이 낮음 |
로드 밸런싱 | Spring Cloud LoadBalancer와 통합 | Ribbon과 통합 |
지원 여부 | 최신 버전에서 지속적으로 지원 | Zuul 1은 더 이상 유지보수 안됨 |
✅ 정리
Spring Cloud Gateway는 마이크로서비스 아키텍처에서 API Gateway 역할을 하며,
- 라우팅, 필터링, 보안, 로드 밸런싱 등 다양한 기능을 제공하고
- 리액티브 프로그래밍 기반으로 높은 성능과 확장성을 보장합니다.
Netflix Zuul의 한계를 개선하고 더 현대적인 기술 스택을 지원하므로,
최신 MSA 프로젝트에서는 Spring Cloud Gateway가 더 많이 사용됩니다.
'Microservices Architecture' 카테고리의 다른 글
/actuator/gateway/refresh의 refresh (0) | 2024.12.16 |
---|---|
리액티브(Reactive)와 논리액티브(Non-Reactive) (0) | 2024.12.16 |
서비스 게이트웨이(Service Gateway) (0) | 2024.12.16 |
Netflix Zuul (0) | 2024.12.16 |
링 버퍼(Ring Buffer) (0) | 2024.12.13 |