API Gateway 공부

Hoseok Ryu·2021년 9월 14일
0

Micro Service Architecture(MSA)

우리 회사는 서비스 구조로 MSA를 채택했다. 서비스 종류로 authenticator, data server, frontend, image server 등이 있는데, 아직 개발 중인 과정이라 필요한 기능들이 있다. 그 중 첫 번째가 바로 API Gateway 이다. 현재 우리는 MSA임에도 gateway가 존재하지 않다. 이것이 무슨 잠재적인 문제를 가지고 있기 때문에 gateway라는 것이 필요한 것인지부터 시작해보자.

MSA에서 Gateway의 필요성

Gateway가 없는 MSA는 service 하나마다 개별 주소가 필요하다. 예를 들어 service A, B, C가 존재한다. Gateway가 없다면? 3개의 port에 대해 각자 다른 forwarding이 필요하다. 이후에 AWS Route53 등을 통해서 3개의 DNS로 변환시켜줘야 한다. 추후에 10개의 service가 추가될 수 있는 게 MSA의 장점이지만, 동시에 10개의 DNS를 새로이 파줘야 하고, 각각마다 접근 주소를 따로 기억해줘야 한다. 이 과정에서 DNS 주소가 바뀐다면? 전부 바꿔줘야 할 것이다. 결국, 관리가 너무 어렵다는 것이 문제이다! 이외의 필요성들을 정리해보자.

  1. 각 서비스마다 authenticator가 공통된 로직을 구현해야 하기 때문에 코드 중복과 관리 노동이 발생한다.
  2. API 호출을 기록하는 것 또한 서비스별로 구현해줘야 한다.
  3. 클라이언트에서 마이크로서비스별로 다른 호출 프로세스를 번거롭게 반복해야 한다.
  4. 내부의 비즈니스 로직이 드러나서 보안에 취약하다.

이 모든 것들이 모든 서버가 각자에게 직접 접근하는 것만을 허용하기 때문에 생기는 문제이다. 그렇다면 우리는 Gateway를 만들어줌으로써 Client에서 하나의 gateway에만 요청을 보냄으로써 서비스들간에 편안해지는 효과를 기대할 수 있을 것이다.

MSA API Gateway의 주요 기능

인증 및 인가 (Authentication and Authorization)

인증(Authentication) 이란 유저가 누군지 확인하는 절차(회원가입 or 로그인)이며 인가(Authorization) 란 유저의 요청에 대해 허가/거부하는 것이다. Gateway는 MSA 최전방에 위치시켜서 client의 모든 요청을 제일 처음 받는 곳이기 때문에, 모든 인증 및 인가 과정을 처리하기에 안성맞춤이다. 이를 통해 각 서비스에서 필요한 인증 및 인가 과정을 전부 extract할 수 있다!

Request Simplification

같은 요청을 여러 마이크로서비스에 요청해야 한다면, client 쪽에서 매번 모든 마이크로서비스 각각에 대해 요청해야 한다. 만약 gateway가 있다면 request broadcasting을 통해서 단순화가 가능하다.

Routing & Load Balancing

Routing은 물론이고 하위 서비스들을 monitor할 수 있다면 load balancing 또한 가능하다.

Service Orchestration

만약 client에서 처리하고 싶은 단일 작업, J가 다수의 서비스를 통해야 한다면? client 쪽에서 개별 서비스마다 통신해야 하며 에러 처리 등의 코드까지 생각하면 엄청나게 복잡해 질 수 있다. 하지만 Gateway가 있다면 다수의 서비스에 접근이 가능한 gateway 내부에 단일 작업 J에 해당하는 단일 api를 만들 수 있다. 단, orchestration은 gateway에 부담을 주는 작업이기 때문에 높은 이해도가 필요하다.

Service Discovery

MSA는 cloud 환경에서 빛을 발한다. 이 때 cloud 환경에서 동적인 IP나 Port 변동을 파악하고 서비스를 찾는 것을 Serivce Discovery 라고 한다. Gateway에서는 이를 구현할 수 있다.

Is Gateway always good for MSA?

듣기만 하면 "꽤 좋아 보이는데?" 라는 생각이 든다. 하지만 진짜...? 언제나 좋을까? 단점이 무엇인지 확인해보자.

Scale out 필요

100개의 마이크로 서비스가 존재했었는데, 이걸 하나의 gateway로 묶었다고 상상해보자. 그렇다면 client들에서 100개로 분산되던 요청이 전부 gateway를 통과하게 된다. 이 때 충분한 네트워킹 능력이 없다면 gateway는 병목을 발생시키게 됩니다. 따라서 scale out을 통해 병목을 방지해줘야 한다.

Network Latency 증가

아무래도 한 계층이 추가되는 것이기 때문에 병목을 방지시켰다고 하더라도 network latency가 증가하는 것은 자명하다. gateway가 굳이 필요 없을 정도로 소규모의 정적인 구조를 갖는 MSA라면 gateway가 손해일 수도 있다.

profile
Research Engineer

0개의 댓글