API 게이트웨이는 마이크로서비스 아키텍처에서 외부의 요청을 받아들이고 라우팅하는 역할을 하는 핵심 컴포넌트입니다.
API 게이트웨이는 인증 및 인가, 요청 및 응답 변환, 서비스 디스커버리 통합, 부하 분산 등의 기능을 제공하여 마이크로서비스의 복잡성을 추상화하고 외부에 간소화된 API를 제공합니다.
Spring Cloud에서는 Netflix Zuul과 Spring Cloud Gateway라는 두 가지 API 게이트웨이 솔루션을 제공합니다.
Netflix Zuul
Zuul은 Netflix에서 개발한 API 게이트웨이이자 서비스 프록시입니다. Zuul은 다음과 같은 주요 기능을 제공합니다.
- 동적 라우팅
 
- Eureka와 연동하여 동적으로 서비스 위치를 파악하고 요청을 라우팅합니다.
 
- 부하 분산
 
- Ribbon과 연동하여 클라이언트 측 부하 분산을 수행합니다.
 
- 인증 및 인가
 
- Spring Security와 연동하여 인증 및 인가 기능을 제공합니다.
 
- 필터
 
- pre, route, post 단계에서 요청과 응답을 변경하거나 로깅, 모니터링 등의 부가 기능을 추가할 수 있습니다.
 
Zuul 구성 예시
| 
 1 
2 
3 
4 
5 
6 
7 
 | 
 @EnableZuulProxy 
@SpringBootApplication 
public class ZuulGatewayApplication { 
    public static void main(String[] args) { 
        SpringApplication.run(ZuulGatewayApplication.class, args); 
    } 
} 
 | 
cs | 
Spring Cloud Gateway
Spring Cloud Gateway는 Spring Framework 5, Spring Boot 2, Project Reactor를 기반으로 구축된 비동기 논블로킹 API 게이트웨이입니다. Spring Cloud Gateway는 다음과 같은 주요 기능을 제공합니다.
- 라우팅
 
- Java 8의 함수형 프로그래밍 스타일로 라우팅을 정의할 수 있습니다.
 
- 서비스 디스커버리
 
- Eureka, Consul과 같은 서비스 디스커버리 도구와 통합할 수 있습니다.
 
- 필터
 
- 요청과 응답을 변경하거나 인증, 인가, 속도 제한 등의 기능을 추가할 수 있습니다.
 
- 웹소켓 지원
 
- 웹소켓 요청을 처리하고 라우팅할 수 있습니다.
 
Spring Cloud Gateway 구성 예시
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
 | 
 @SpringBootApplication 
public class GatewayApplication { 
    public static void main(String[] args) { 
        SpringApplication.run(GatewayApplication.class, args); 
    } 
    @Bean 
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { 
        return builder.routes() 
            .route(“user-service”, r –> r.path(“/users/**”) 
                .uri(“lb://user-service”)) 
            .route(“order-service”, r –> r.path(“/orders/**”) 
                .uri(“lb://order-service”)) 
            .build(); 
    } 
} 
 | 
cs | 
API 게이트웨이는 마이크로서비스 아키텍처에서 외부 요청의 단일 진입점 역할을 하여 내부 서비스의 복잡성을 숨기고, 보안, 성능, 모니터링 등의 횡단 관심사를 처리하는 데 도움을 줍니다.
하지만 API 게이트웨이가 단일 장애점이 될 수 있으므로, 게이트웨이의 확장성과 가용성을 고려해야 합니다.
