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 게이트웨이가 단일 장애점이 될 수 있으므로, 게이트웨이의 확장성과 가용성을 고려해야 합니다.