서비스 단일 진입을 위한 API 게이트웨이(gateway) 패턴

Updated:

서비스 단일 진입을 위한 API 게이트웨이(gateway) 패턴

여러 개의 클라이언트가 여러 개의 서버 서비스를 각각 호출하게 된다면 매우 복잡한 호출 관계가 생성될 것이다. 이런 복잡성을 통제하기 위한 방법이 필요하다.

이를 위한 해결 방법은 API 게이트웨이다. 아래 그림과 같이 다양한 클라이언트가 다양한 서비스에 액세스하기 위해서는 단일 진입점을 만들어 놓으면 여러모로 효율적이다. 다른 유형의 클라이언트에게 서로 다른 API조합을 제공할 수도 있고 각 서비스 접근 시 필요한 인증/인가 기능을 한 번에 처리할 수도 있다. 또 정상적으로 동작하던 서비스에 문제가 발생하여 서비스 요청에 대한 응답 지연이 발생하면 정상적인 다른 서비스로 요청 경로를 변경하는 기능이 작동되게 할 수도 있다.

API GW 개념도

이런 서비스 흐름 제어를 을 위한 서비스 라우팅 기능은 L4 같은 하드웨어 장비로 구현할 수도 있고 이렇게 소프트웨어로 구현할 수도 있는데 API 게이트웨이가 어플리케이션 레벨의 라우팅 기능을 수행한다. 또한 여러 인스턴스로 부하를 분산하는 로드 밸런싱 처리도 수행한다. 또 라우팅 처리 시 필터를 두어서 라우팅 전에 선행 처리하든지 후행 처리, 에러 처리 등을 쉽게 구현할 수 있다.

정리하면 API 게이트웨이는 다른 서비스와 연계하여 다음과 같은 기능을 제공한다.

  • 레지스터리 서비스와 연계한 라우팅, 로드 밴런싱 기능
  • 권한서비스와 연계한 인증/인가 기능
  • 로그 집계 서비스와 연계한 로깅 기능
  • 트레이싱 서비스와 연계한 서비스 추적 기능
  • 모니터링 서비스와 연계한 장애 격리 기능 (서킷 브레이크)

이런 API 게이트웨이 패턴은 스프링 클라우드의 스프링 API 게이트웨이 서비스(Spring API Gateway Service)라는 제품으로 구축 할 수 있다. 이 스프링 게이트웨이 서비스는 스프링 사이트(spring .io) 에서 다운 받아 간단한 스프링 어노테이션(Annotation) 설정만으로 쉽게 구축할 수 있다.

쿠버네이트도 이런 API 게이트웨이 기능을 자체 기능인 쿠버네티스 서비스(Kubernetes Service) 와 잉글레스 리소스(Ingress resources) 로 제공한다. 또한 API 게이트웨이는 프론트 엔드가 백엔드를 호출할 때만 아니라 외부 레거시 시스템과 단일지점에서 서로 다른 형태의API를 연계하는 용도로도 사용된다. ㄷ

BFF(Backend For Frontend) 패턴

최근에는 기존 PC뿐만 아니라 다양한 모바일 장비들을 사용하기 때문에 다양한 클라이언트를 고려해야 한다. 이런 특화 클라이언트을 위해서는 특화된 처리를 위한 API조합이나 처리가 필요하다. 이를 위한 해결 방법은 BFF(Backend For Frontend) 패턴 이다.

BFF패턴은 API 게이트웨이와 같은 진입점을 하나로 두지 않고 프런트엔드의 유형에 따라 각각 두는 패턴이다. 프론트 엔드를 위한 백 엔드라는 의미로 BFF (Backend For Frontend) 라고 부른다. 아래 그림과 같이 웹을 위한 API 게이트웨이, 모바일을 위한 API 게이트웨이 등 클라이언트 종류에 따라 최적화된 처리를 수행할 수 있게 구성할 수 있다. 이로써 모바일을 위한 API만을 선택하여 제공하거나 웹을 위한 API만을 적절하게 제공할 수 있다.

아래 그림과 같이 각 프로트엔드 에 관한 처리 만을 위한 BFF를 두고 이후에 통합적인 API GW를 둠으로써 공통적인 인증/인가,로깅 등의 처리를 통제하는 구조로 구성 할 수도 있다.

BFF 흐름도