실무에 바로 쓰는 DDD기반으로 유연성과 확정성 있게 MSA 설계하기
Spring Cloud Gateway 구현
Spring Cloud Gateway 구현
- Spring Cloud Gateway 구현
Spring Cloud Gateway란?
MSA 환경에서는 여러 개의 마이크로서비스가 독립적으로 동작한다. 이때 클라이언트가 각 서비스의 주소를 직접 호출하도록 구성하면 다음과 같은 문제가 발생할 수 있다.
- 서비스 주소 변경 시 클라이언트 수정 필요
- 인증 로직 중복
- 공통 처리 로직 분산
- 서비스 구조 외부 노출
- 라우팅 관리 복잡도 증가
이 문제를 해결하기 위해 사용하는 것이 바로 API Gateway이다.
강의 자료에서는 Spring Cloud Gateway를 사용하여 클라이언트 요청을 각 마이크로서비스로 라우팅하는 구조를 설명한다.
Spring Cloud Gateway의 역할
Spring Cloud Gateway는 클라이언트 요청의 진입점 역할을 수행한다.
즉:
- 모든 요청은 Gateway를 먼저 통과
- Gateway가 적절한 서비스로 전달
- 공통 로직을 중앙에서 처리
하는 구조이다.
API Gateway가 필요한 이유
MSA 환경에서는 서비스가 계속 증가한다.
예를 들어:
- 주문 서비스
- 메뉴 서비스
- 회원 서비스
- 결제 서비스
각 서비스가 서로 다른 포트와 주소로 실행된다면 클라이언트는 모든 주소를 알아야 한다.
예시:
http://localhost:8081/orders/200
http://localhost:8082/menus/10
http://localhost:8083/users/5
이 방식은 서비스 변경에 매우 취약하다.
Gateway를 사용하면:
http://localhost:8080/orders/200
http://localhost:8080/menus/10
처럼 단일 진입점으로 통합할 수 있다.
Spring Cloud Gateway 구조
전체 흐름은 다음과 같다.
flowchart LR
Client[Client]
Gateway[Spring Cloud Gateway :8080]
Order[Order Service :8081]
Menu[Menu Service :8082]
Client --> Gateway
Gateway --> Order
Gateway --> Menu
이 구조에서 핵심은:
- 클라이언트는 Gateway만 호출
- Gateway가 내부 서비스로 라우팅
- 내부 서비스 구조를 외부에 숨김
이라는 점이다.
Spring Cloud Gateway 특징
강의 자료에서도 Spring Cloud Gateway를 고성능 API Gateway 솔루션으로 설명한다.
주요 특징은 다음과 같다.
요청 라우팅
요청 URL 기반으로 서비스 분기
필터 처리
공통 로직 처리 가능
예시:
- 인증
- 로깅
- 헤더 추가
- 요청 검증
비동기 처리
Spring WebFlux 기반의 Reactive 구조 지원
보안 강화
외부 요청을 Gateway에서 제어 가능
Gateway 라우팅 구조
강의 자료에서는 다음과 같은 routing 설정을 사용한다.
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: order-service
uri: http://localhost:8081
predicates:
- Path=/orders/**
- id: menu-service
uri: http://localhost:8082
predicates:
- Path=/menus/**
routes란?
Gateway가 어떤 요청을 어디로 보낼지 정의하는 설정이다.
order-service
- id: order-service
라우팅 이름이다.
uri
uri: http://localhost:8081
실제 요청을 전달할 대상 서비스 주소이다.
즉:
/orders/**
요청이 들어오면:
http://localhost:8081
로 전달된다.
predicates
predicates:
- Path=/orders/**
라우팅 조건을 의미한다.
즉:
/orders/**
패턴과 일치하는 요청만 해당 서비스로 전달된다.
Gateway 요청 흐름
전체 요청 흐름은 다음과 같다.
sequenceDiagram
participant Client
participant Gateway
participant OrderService
participant MenuService
Client->>Gateway: /orders/200
Gateway->>OrderService: Forward Request
OrderService-->>Gateway: Response
Gateway-->>Client: Response
Client->>Gateway: /menus/10
Gateway->>MenuService: Forward Request
MenuService-->>Gateway: Response
Gateway-->>Client: Response
실제 실행 구조
강의 자료 실행 화면에서는 다음 서비스들이 함께 실행되는 것을 확인할 수 있다.
gateway-service : 8080
Menus : 8081
Orders : 8082
ConfigServer : 8888
EurekaServer : 8761
즉, Gateway가 가장 앞단에서 요청을 받고 내부 서비스로 전달하는 구조이다.
Gateway를 통한 요청 처리
강의 자료 실행 예시에서는 다음 요청을 확인할 수 있다.
http://localhost:8080/orders/200
여기서 중요한 점은:
- 실제 Order Service는 8081 또는 8082에서 실행
- 클라이언트는 내부 포트를 알 필요 없음
- Gateway가 요청을 대신 전달
이라는 점이다.
Gateway와 MSA 관계
Gateway는 단순 프록시 서버가 아니다.
MSA 환경에서 다음 역할을 수행한다.
단일 진입점 제공
클라이언트는 Gateway만 호출
내부 구조 은닉
서비스 주소 직접 노출 제거
공통 기능 중앙화
- 인증
- 로깅
- 요청 검증
- Rate Limiting
라우팅 관리
서비스별 요청 분기 처리
Gateway + Eureka 구조
실제 운영 환경에서는 Eureka와 함께 사용하는 경우가 많다.
전체 구조는 다음과 같이 확장될 수 있다.
flowchart TD
Client[Client]
Gateway[Spring Cloud Gateway]
Eureka[Eureka Server]
Order1[Order Service Instance 1]
Order2[Order Service Instance 2]
Menu1[Menu Service Instance 1]
Client --> Gateway
Gateway --> Eureka
Order1 --> Eureka
Order2 --> Eureka
Menu1 --> Eureka
Gateway --> Order1
Gateway --> Order2
Gateway --> Menu1
이 구조에서는 Gateway가 Eureka를 통해 동적으로 서비스 위치를 조회할 수 있다.
Spring Cloud Gateway의 장점
정리하면 다음과 같다.
서비스 주소 추상화
클라이언트가 내부 주소를 몰라도 된다
중앙 집중 처리
공통 로직을 Gateway에서 처리 가능
보안 강화
외부 요청 제어 가능
확장성 향상
서비스 추가 및 변경 유연
MSA 구조 단순화
클라이언트와 내부 서비스를 분리 가능
정리
Spring Cloud Gateway는 MSA 환경에서 클라이언트 요청을 중앙에서 처리하고 각 마이크로서비스로 라우팅하는 API Gateway 역할을 수행한다.
이를 통해 서비스 구조를 외부에 숨기고, 공통 기능을 중앙화하며, 서비스 간 결합도를 낮출 수 있다.
한 줄 요약
Spring Cloud Gateway는 MSA 환경에서 클라이언트 요청의 단일 진입점 역할을 수행하며, 라우팅, 공통 필터 처리, 보안, 서비스 추상화를 통해 마이크로서비스 간 통신 구조를 효율적으로 관리하는 API Gateway 솔루션이다.