API Gateway와 Service Discovery: 원활한 마이크로서비스 통합

February 7, 2024

Technology

디지털 시대에서 애플리케이션 프로그래밍 인터페이스(API)는 다양한 시스템과 서비스 간의 통신의 핵심 요소가 되었습니다.

마이크로서비스 아키텍처의 확산과 함께 API 게이트웨이와 서비스 디스커버리의 중요성이 점점 더 두드러지고 있습니다. API 게이트웨이는 마이크로서비스 아키텍처의 진입점 역할을 하며, 모든 외부 요청을 처리하고 내부 서비스 간의 통신을 조율합니다. 반면, 서비스 디스커버리는 시스템이 동적으로 올바른 서비스 인스턴스를 찾고 연결할 수 있도록 보장합니다.

이 둘은 함께 효율적이고 유연하며 확장 가능한 분산 시스템을 구축합니다. 이 글에서는 API 게이트웨이와 서비스 디스커버리 간의 연결 및 현대 분산 시스템에서의 중요한 역할에 대해 깊이 있게 다룹니다.

API 게이트웨이와 서비스 디스커버리

마이크로서비스 아키텍처의 진입점으로서 API 게이트웨이는 모든 외부 요청을 처리하고 내부 서비스와의 통신을 원활하게 합니다. 주요 기능은 다음과 같습니다:

  • 요청 라우팅 및 전달: 요청 특성에 따라 해당 서비스로 요청을 라우팅합니다.
  • 접근 제어 및 보안 인증: 승인된 사용자나 시스템만 API에 접근할 수 있도록 보장합니다.
  • 로드 밸런싱 및 캐싱: 요청을 다양한 서비스 인스턴스에 균등하게 분배하여 서비스 성능을 최적화하고, 백엔드 서비스에 대한 요청을 줄이기 위해 캐싱을 제공합니다.
  • 로깅 및 분석: API 사용 데이터를 수집하고 분석하여 비즈니스 의사 결정을 지원합니다.

서비스 디스커버리는 분산 시스템에서 사용 가능한 서비스 인스턴스를 자동으로 찾기 위한 메커니즘입니다. 서비스의 수가 많고 동적으로 변경되는 경우, 서비스 디스커버리는 매우 중요해집니다. 서비스 등록 및 디스커버리의 원리는 다음과 같습니다:

  • 서비스 등록: 서비스가 시작될 때, 서비스 레지스트리에 자신의 정보(예: IP 주소, 포트 번호 등)를 등록합니다.
  • 서비스 디스커버리: 다른 서비스가 이 서비스를 호출해야 할 때, 서비스 레지스트리를 조회하여 사용 가능한 서비스 인스턴스를 찾고, 그 중 하나를 선택하여 통신합니다.

API 게이트웨이와 서비스 디스커버리의 연결

API 게이트웨이는 모든 외부 요청을 처리하는 "게이트키퍼" 역할을 하며, 요청을 올바른 서비스 인스턴스로 지능적으로 라우팅합니다. API 게이트웨이와 서비스 디스커버리는 마이크로서비스 아키텍처에서 상호 의존적이며, 안정성과 확장성을 제공합니다.

서비스 디스커버리를 도입하기 전에는 API 게이트웨이가 업스트림 서비스 주소를 지정하기 위해 수동 구성에 의존했습니다. 서비스 인스턴스 주소가 변경되면(예: 업그레이드, 백업 인스턴스로의 긴급 전환, 트래픽 증가로 인한 더 많은 서비스 인스턴스 확장 등), 관리자는 API 게이트웨이 구성을 수동으로 업데이트해야 했습니다. 이 방법은 비효율적일 뿐만 아니라 정확성과 적시성을 보장하기 어려웠습니다.

서비스 디스커버리 메커니즘을 통해 API 게이트웨이는 서비스 레지스트리에 실시간으로 동적으로 연결하여 모든 업스트림 서비스의 최신 인스턴스 주소를 자동으로 얻고, 요청이 새로운 서비스로 정확하게 라우팅되도록 보장할 수 있습니다.

동시에, 서비스 디스커버리 메커니즘은 API 게이트웨이에 장애 상황을 즉시 알려, 사용 불가능한 서비스로 요청을 라우팅하는 것을 효과적으로 방지할 수 있습니다. 서비스 레지스트리의 주소와 서비스 이름을 구성함으로써, API 게이트웨이는 환경 간 구성 재사용, 구성 작업량 감소, 구성 재사용 및 정확성 향상에 큰 진전을 이루었습니다.

서비스 디스커버리

API 게이트웨이와 Kubernetes 서비스 디스커버리 통합의 실제 적용

Kubernetes 기반의 마이크로서비스 아키텍처 시스템이 있다고 가정해 봅시다. 이 시스템에는 사용자 서비스, 주문 서비스, 결제 서비스 등 여러 서비스가 배포되어 있으며, 각 서비스에는 여러 복제본(Pod)이 있습니다. 이러한 복제본의 IP 주소와 포트 번호는 컨테이너가 생성되고 삭제됨에 따라 동적으로 변경됩니다.

이 시나리오에서 우리는 API 게이트웨이를 사용하여 외부 요청을 처리하고, 이를 올바른 Kubernetes 서비스로 지능적으로 라우팅하려고 합니다. 동시에 Kubernetes의 서비스 디스커버리 메커니즘을 활용하여 서비스 인스턴스를 동적으로 발견하고 관리하려고 합니다.

1단계: 서비스 배포 및 등록

Kubernetes에서 우리는 Deployments 또는 StatefulSets를 사용하여 서비스를 배포하고, 해당 서비스를 추상화하는 Services를 생성합니다. Kubernetes Services는 백엔드 Pod에 대한 로드 밸런싱을 자동으로 제공하고, 서비스 이름을 안정적인 클러스터 내부 IP 주소와 포트 번호로 매핑합니다.

Pod가 생성되거나 삭제될 때, Kubernetes의 Service Controller는 서비스의 Endpoint 객체를 자동으로 업데이트합니다. 이 Endpoint 객체에는 관련된 모든 Pod의 IP 주소와 포트 번호가 포함되어 있습니다. 이러한 Endpoint 객체는 Kubernetes의 API 서버에 저장되어 다른 컴포넌트가 조회할 수 있습니다.

2단계: API 게이트웨이 배포 및 구성

API7 Enterprise를 예로 들면, 게이트웨이 그룹에서 Kubernetes 서비스 레지스트리의 주소에 연결합니다. 게이트웨이 그룹에 서비스를 게시할 때, 수동으로 업스트림 인스턴스 주소를 입력하는 대신 이 Kubernetes 레지스트리를 선택하고 해당 네임스페이스와 내부의 Service를 지정합니다. API7 Enterprise는 Kubernetes의 API 서버에서 해당 서비스의 Endpoint 정보를 자동으로 검색하여 서비스의 업스트림 주소로 사용합니다.

3단계: 요청 처리

API 게이트웨이가 외부 요청을 받으면, 구성된 라우팅 규칙에 따라 요청을 어떤 서비스로 라우팅할지 결정합니다. 그런 다음 Kubernetes의 API 서버를 조회하여 최신 업스트림 정보를 얻습니다. API 게이트웨이는 이 정보에서 인스턴스를 선택하고(다양한 로드 밸런싱 전략에 따라) 요청을 해당 인스턴스로 전달합니다. Endpoint 정보가 동적으로 업데이트되기 때문에, API 게이트웨이는 Pod의 생성, 삭제, 마이그레이션을 자동으로 처리할 수 있으며, 요청이 항상 사용 가능한 업스트림으로 라우팅되도록 보장합니다.

4단계: 서비스 디스커버리 및 업데이트

Kubernetes에서 서비스 디스커버리는 자동으로 수행됩니다. Pod의 상태가 변경되면(예: 생성, 삭제, 마이그레이션), Kubernetes의 Service Controller는 해당 서비스의 Endpoint 객체를 자동으로 업데이트합니다.

API 게이트웨이는 Kubernetes의 API 서버에서 정기적으로 최신 Endpoint 정보를 검색하고, 이를 기반으로 업스트림을 업데이트합니다. 이를 통해 API 게이트웨이는 서비스 상태 변경을 즉시 인지하고, 라우팅 규칙을 자동으로 조정하여 요청이 사용 가능한 서비스 인스턴스로 정확하게 라우팅되도록 보장합니다.

결론

API 게이트웨이와 Kubernetes 서비스 디스커버리의 통합을 통해, 우리의 시스템은 동적 서비스 등록 및 디스커버리, 지능형 라우팅, 로드 밸런싱을 달성할 수 있습니다. 이 접근 방식은 시스템 구성 및 관리를 단순화하고, 시스템의 신뢰성과 확장성을 향상시키며, Kubernetes가 제공하는 강력한 기능을 충분히 활용하여 마이크로서비스 아키텍처의 배포와 운영을 더 간단하고 효율적으로 만듭니다.

Tags: