API 게이트웨이(Zuul, Spring Cloud Gateway)

 

API 게이트웨이는 마이크로서비스 아키텍처에서 외부의 요청을 받아들이고 라우팅하는 역할을 하는 핵심 컴포넌트입니다.

API 게이트웨이는 인증 및 인가, 요청 및 응답 변환, 서비스 디스커버리 통합, 부하 분산 등의 기능을 제공하여 마이크로서비스의 복잡성을 추상화하고 외부에 간소화된 API를 제공합니다.

Spring Cloud에서는 Netflix Zuul과 Spring Cloud Gateway라는 두 가지 API 게이트웨이 솔루션을 제공합니다.

 

Netflix Zuul

Zuul은 Netflix에서 개발한 API 게이트웨이이자 서비스 프록시입니다. Zuul은 다음과 같은 주요 기능을 제공합니다.

  1. 동적 라우팅
  • Eureka와 연동하여 동적으로 서비스 위치를 파악하고 요청을 라우팅합니다.
  1. 부하 분산
  • Ribbon과 연동하여 클라이언트 측 부하 분산을 수행합니다.
  1. 인증 및 인가
  • Spring Security와 연동하여 인증 및 인가 기능을 제공합니다.
  1. 필터
  • 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는 다음과 같은 주요 기능을 제공합니다.

  1. 라우팅
  • Java 8의 함수형 프로그래밍 스타일로 라우팅을 정의할 수 있습니다.
  1. 서비스 디스커버리
  • Eureka, Consul과 같은 서비스 디스커버리 도구와 통합할 수 있습니다.
  1. 필터
  • 요청과 응답을 변경하거나 인증, 인가, 속도 제한 등의 기능을 추가할 수 있습니다.
  1. 웹소켓 지원
  • 웹소켓 요청을 처리하고 라우팅할 수 있습니다.

 

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

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다