[MSA] API Gateway 이해하기 - Spring Cloud Gateway (2)
지난 글에서는 Monolithic Architecture와 MSA에 대해 전반적으로 알아보고 정리하는 시간을 가졌다.
이번 글에서는 그중 MSA에서의 API Gateway에 대해 조금 더 자세히 다뤄보려고 한다.
API Gateway
쉽게 말해 모든 API 요청을 받는 문(통로)으로
요청 들어온 API에 대해 인증/인가, 라우팅, 로깅, 모니터링 등의 기능들을 제공한다.
API Gateway는 간단명료하게 모든 요청에 대한 통로라고 생각하면 될 것 같은데
많은 서비스들을 각각 호출하는 것이 아닌 API Gateway 단일 지점을 호출하면 된다.
예를 들어 API Gateway를 고속도로의 톨게이트에 빗대어 생각해보면 어느 지역을 가든 자동차가 고속도로를 이용하기 위해서는 톨게이트를 지나쳐야 한다. 고속도로의 차량의 출입을 통제하는 톨게이트와 모든 요청을 통제하는 API Gateway를 비교해보면 쉽게 이해될 거라 생각이 된다.
다시 본래의 이야기로 돌아와서 클라이언트는 서비스를 호출하기 위해 API Gateway를 호출하고 API Gateway에서는 해당 서비스가 이용이 가능한지 등을 판단하고 통과되면 요청한 서비스를 호출하게 된다.
그러면 각 서비스를 직접 호출하면 될텐데 '굳이 API Gateway가 필요한가?' 하는 생각이 들었다.
왜 API Gateway를 쓰는 걸까?
API Gateway를 사용했을 때 여러 장점들이 존재하는데 몇 가지만 살펴보면
- 모든 서비스를 API Gateway를 통해 호출할 때 어떤 서비스로 요청을 할지 생각하지 않아도 된다.
- 요청에 대한 모든 처리를 중앙 처리할 수 있다.
- 요청/응답에 대한 로깅 및 모니터링을 할 수 있다.
MSA에서는 서비스가 많기 때문에 클라이언트는 어떤 서비스로 호출할지 고민하지 않을 수 없다. 그런데 모든 요청을 받는 API Gateway가 있다면 모두 동일한 URL로 호출이 가능해진다. 모든 요청이 API Gateway를 통해 들어오기 때문에 요청에 대한 통제가 가능하고 라우팅, 로드밸런싱, 모니터링, 로깅 등에 대한 기능들도 추가할 수 있다.
결론적으로 모든 요청과 응답에 대한 공통 로직이나 기능들을 중앙 처리가 가능해진다는 큰 장점이 있는 것이다.
API Gateway 기능
인증/인가 (Authentication/Authorization)
모든 요청에 대해 클라이언트의 신분을 인증하고, 요청에 대한 권한이 있는지 확인하는 기능이다.
라우팅 (Routing)
동일한 API 요청이더라도 클라이언트, 서비스에 따라 다른 엔드포인트를 요청할 수 있는 기능이다.
로드밸런싱 기능을 지원하기도 한다.
제한 (Api Throttling)
API 요청에 대해 속도나 사용량을 제한하는 기능이다.
로깅 처리
모든 요청이 들어오기 때문에 통합적인 로깅 처리가 가능하다.
그렇다면 단점은?
여러 장점들이 있지만 그럼에도 단점이 꽤 존재한다.
- 병목 현상이 발생할 수 있다.
- 응답 시간이 늘어날 수 있다.
- API Gateway 장애 시 모든 서비스가 동작하지 않을 수 있다.
예를 들어 다른 서비스들에 비해 특정 서비스에 호출이 많이 몰렸다고 한다면 스케일 아웃이 제대로 되지 않으면 병목 현상으로 제대로 서비스를 이용하지 못할 수 있다. 모든 요청이 API Gateway로 들어오게 되면 직접적인 호출보다 한 단계 더 거치기 때문에 응답 시간이 늘어날 수 있다. API Gateway에 장애가 발생할 경우 또한 모든 서비스를 이용하지 못하게 될 가능성이 존재한다. (관리 포인트가 늘어난다는 단점도 있다.)
물론 이런 문제점을 해결하고자 하는 해결책들이 나와 있긴 하다.
Circuit Breaker로 다른 서비스로 장애가 전파되는 걸 방지하거나
API Gateway를 이중화 삼중화로 수를 늘려 장애를 방지한다.
미흡하지만 API Gateway의 기능과 장단점을 알아보았는데 개념 자체는 그렇게 어렵진 않았던 것 같지만,
대신 API Gateway의 필요성에 대해 많은 생각을 했던 것 같다.
MSA라고 해서 꼭 API Gateway를 사용해야 되는지?
현재 운영 중인 시스템에도 필요한지?
대체재는 없는지?
사용했을 때와 사용하지 않았을 때 각각 장단점이 어떤 것들이 있는지?
이런 고민들이 늘어나게 되었고 앞으로도 계속해서 고민해야 될 것 같다.
Netflix Zuul이 Spring에서 더 이상 지원을 하지 않는다 하여 Spring에서 제공하는 Spring Cloud Gateway로 구현을 해봤는데 아래 링크를 통해 예제를 확인하면 된다.
[MSA] Spring Boot로 API Gateway 구축하기 - Spring Cloud Gateway
'개발 이야기 > MSA' 카테고리의 다른 글
[MSA] Service Discovery 구축하기 - Spring Boot + Netflix OSS Eureka Server (0) | 2022.12.02 |
---|---|
[MSA] API Gateway 구축하기 - Spring Boot + Spring Cloud Gateway (0) | 2022.12.02 |
[MSA] Config Server 이해하기 - Spring Cloud Config (4) (0) | 2022.11.22 |
[MSA] Service Discovery Server 이해하기 (3) (0) | 2022.11.22 |
[MSA] MSA 개념 이해하기 (1) (2) | 2022.11.21 |
댓글
이 글 공유하기
다른 글
-
[MSA] API Gateway 구축하기 - Spring Boot + Spring Cloud Gateway
[MSA] API Gateway 구축하기 - Spring Boot + Spring Cloud Gateway
2022.12.02 -
[MSA] Config Server 이해하기 - Spring Cloud Config (4)
[MSA] Config Server 이해하기 - Spring Cloud Config (4)
2022.11.22 -
[MSA] Service Discovery Server 이해하기 (3)
[MSA] Service Discovery Server 이해하기 (3)
2022.11.22 -
[MSA] MSA 개념 이해하기 (1)
[MSA] MSA 개념 이해하기 (1)
2022.11.21