728x90
반응형




👉이전글(헥사고날 아키텍처와 MSA전환)에서 살펴본 것처럼 MSA 전환 시에는 API Gateway 모듈이 활용될 수 있습니다.


이러한 API Gateway는 MSA 전환 시, 레거시와 Micro Service간의 통합을 도와주는 역할 뿐만 아니라
Micro Service중 하나로서 다양한 역할을 수행합니다.


이번글에서는 API Gateway 개요와 다양한 역할, 구현 방법에 대해 소개하고
Rest API를 통한 요청-응답 시에 전체모듈로 장애확산을 방지하는 Circuit Breaker 기능에 대해서도 알아볼 것입니다.


API Gateway

API Gateway란? API Gateway는 백엔드 서비스 앞단에서 모든 API 서버들의 엔드포인트를 단일화하여 요청에 대한 라우팅 기능을 수행하고, 인증/인가 기능과 API 호출 로깅(logging) 기능 등 각 벡엔드 서버의 공통 기능을 수행하는 단일 모듈입니다. 이를 통해 뒷단의 각 백엔드 서버는 공통 기능을 별도로 구현하지 않아도 됩니다.



위 언급된 API Gateway의 많은 기능 중 본 글에서는 단일 진입점으로서의 라우팅 기능과 인증/인가 기능을 살펴볼 것입니다.


Routing

Routing 기능은 API Gateway의 대표적인 기능중 하나로서,
client에서 특정 Rule기반으로 API Gateway를 호출하기만 하면
해당 Rule에 맞게 뒷단의 백엔드 서버를 찾아서 요청을 전달해줍니다.


라우팅 Rule 유형은 다양하지만 일반적으로 Path 기반으로 라우팅하게 됩니다.
예를들어, http://{GATEWAY_IP}/order uri로 요청한다면 order micro service로 routing하고,
http://{GATEWAY_IP}/inventory uri로 요청한다면 inventory micro service로 요청을 routing하는 방식입니다.


MSA 환경에서 Gateway를 구현하는 방식은 다양합니다.
대표적으로 java언어 기반의 SpringCloud 프레임워크를 활용하는 방식이 있고,
kubernetes 인프라의 Ingress 모듈을 활용하는 방식이 있습니다.


SpringCloud vs Ingress

요약하자면,
SpringCloud는 Java 기반의 프레임워크이기 때문에 Java 기반의 application과 호환이 잘되고,
Java/SpringBoot의 편리한 기능을 모두 활용할 수 있기 때문에 Java 개발자에게 편리할 수 있습니다.
하지만, JVM을 지원하지 않은 다양한 스택의 application과 연동해야할 때, 다양한 기술스택 활용을 장려하는 MSA 환경 특성상 SpringCloud 활용이 부적절할 수 있습니다.


Kubernetes Ingress는 특정 언어 기반으로 구현해야하는 application이 아니고,
Kubernetes의 type중 하나로 실행되는 Gateway 템플릿이기 때문에 특정 환경에 종속되지 않아서
다양한 기술스택을 수용해야 하는 MSA 환경에 적합할 수 있습니다. (실제 Routing 기능을 수행할 nginx와 같은 app을 Ingress Controller로서 별도 설치 필요) 또한, programming 기반이 아닌 Menifest 파일 기반으로 routing rule을 설정할 수 있습니다.


요약만 보면 Ingress를 선택해야하는 것이 아닌가 생각이 들겠지만,
Spring기반으로 Filter를 커스터마이징할 수 있고, Path rewriting 등과 같은 기능을 활용할 수 있어
Gateway로 SpringCloud를 선택하는 경우도 있다고 합니다.


구현방법 (SpringCloud Gateway)

  1. Gateway로 활용할 SpringBoot 프로젝트를 생성합니다.


  2. 해당 프로젝트에 아래 dependency를 추가합니다

    <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>



  3. 프로젝트 resources의 application.yml에 아래 routing rule을 설정합니다.

    spring:
    profiles: default
    cloud:
     gateway:
       routes:
         - id: monolith
           uri: http://localhost:8082
           predicates:
             - Path=/orders/**, 
         - id: inventory
           uri: http://localhost:8083
           predicates:
             - Path=/inventories/**, 
         - id: frontend
           uri: http://localhost:8080
           predicates:
             - Path=/**



위와 같이 설정을 완료하고 특정 호스트에 맞는 path를 Gateway url에 붙여 http 요청한다면,
해당 호스트로 요청이 routing 됩니다.
위 설정 기반으로 예를들면, http://{GATEWAY_IP}/orders에 요청했을 때 http://localhost:8082의 monolith 호스트로 routing 됩니다.


위 application.yml의 predicates 속성을 잘 활용한다면,
path 기반 rule 뿐만 아니라 다양한 요청 rule 기반으로 요청이 routing될 수 있도록 설정할 수 있습니다.

반응형

'개발 > MSA' 카테고리의 다른 글

[MSA] Kafka  (0) 2024.12.14
[MSA] 헥사고날 아키텍처와 MSA 전환  (0) 2024.11.03
DDD와 Event Storming  (3) 2024.11.02
[k8s] kubernetes 클러스터  (1) 2024.04.06
[k8s] kubernetes란?  (0) 2024.02.29

+ Recent posts