[Concept] MSA (Micro Service Architecture)
MSA란?
Micro Service Architecture의 약자로 하나의 서비스을 여러 개의 작은 서비스로 분리하여 제공하는 아키텍쳐를 말한다. 즉, 하나의 커다란 서비스를 제공하는데 여러 개의 마이크로 서비스가 상호작용하며 동작하는 것이다.
기존 Monolithic 아키텍처와 다르게 최소한의 중앙집중식 프로그램을 구성하기 때문에 여러가지 장점을 가져온다. 이러한 MSA를 채택해 설계한 기업으로는 대표적으로 Netflix가 있다.
MSA 특징
2002년에 Amazon이 MSA 도입시 작성된 메일의 내용을 보며 특징을 설명한다.
- 모든 팀은 Service Interface를 통해 함수나 데이터를 공개해야 한다.
즉, 외부에서 내부 데이터에 직접접근할 수 없으며 반드시 외부에 공개된 API를 통해 접근해야 한다. - 이러한 인터페이스를 통해서만 통신해야한다.
- 서비스가 어떠한 기술을 사용해 만들어지는지는 중요하지 않다.
- 모든 Service Interface는 외부에 공개될 수 있도록 설계되어야 한다.
여기서 설명하는 Service Interface는 REST API, GraphQL API 등이 있다.
이러한 내용에서 보듯이 MSA에서 구현된 서비스들은 외부에 공개된 API를 통해서만 사용해 연결되며, 내부의 구현 로직, 아키텍처와 프로그래밍 언어, 데이터베이스, 품질 유지 체계와 같은 기술적인 사항들은 반드시 가려져야 한다는 것을 알 수 있다.
MSA 장점
Micro Service Architecture를 통해 서비스를 설계할 경우 다음과 같은 장점이 있을 수 있다.
- 서로다른 서비스는 서로 다른 프로그래밍 언어/DB로 만들 수 있다.
어떤 기능을 하는 서비스냐에 따라서 특화된 프로그래밍 언어가 있을 수 있는데, 이러한 효율을 극대화할 수 있다. - 서비스간의 결합도를 낮춰서 변화에 능동적인 대응을 할 수 있다.
- 하나의 서비스에 문제가 발생해도 전체 서비스에 주는 영향을 최소화할 수 있다.
- 하나의 서비스를 수정했을 때 전체 서비스를 재배포할 필요없이 수정한 서비스만 배포하면 된다.
- 부분적인 서비스의 Scale-out을 할 수 있다.
- 만들어진 하나의 마이크로 서비스는 재사용되어질 수 있다.
물론 이외에도 다양한 장점이 있겠지만 대표적으로 이정도만 기억하면 될 것 같다.
MSA 구성
Micro Service Architecture를 구성하는 컴포넌트에는 어떠한 것들이 있는지 살펴보자.
API Gateway
API Gateway로써 사용할 수 있는 것에는 Amazon API Gateway, Spring Cloud Gateway, Nginx 와 같은 것들이 있다. MSA는 기본적으로 여러 개의 마이크로 서비스가 포함되어 있기 때문에 여러 개의 API가 존재하게 된다. Client나 다른 Service에서 들어오는 요청을 받고 적절한 서비스로 전송하는 역할을 수행한다. (Proxy 역할)
예를 들어, ms1, ms2, ms3 세 개의 마이크로 서비스가 있다고 했을 때 API Gateway가 없다면 End-Point에서 해당 서비스의 주소를 하드코딩 해야한다. 이럴경우 주소가 변경되거나 새로운 마이크로 서비스가 추가되었을 때 End-Point의 코드가 수정 및 배포되어야 한다는 문제가 있다.
뿐만 아니라 API Gateway를 통해 아래와 같은 다양한 작업을 모든 마이크로 서비스에 대해서 공통 수행할 수 있다.
- 인증 및 권한 부여
- 서비스 검색 통합
- 응답 캐싱
- 정책 적용
- 속도 제한
- 부하분산
- 로깅, 추적
- IP 허용 목록
Service Discovery
Service Discovery는 IP:PORT 정보를 서비스 이름으로 매핑해놓은 것을 말한다. 즉, A Service에 대한 요청이 들어오면 Service Router는 Service Discovery에게 A Service에 대한 IP:PORT 정보를 쿼리하고, 그 결과로 요청을 보내게 된다.
뿐만 아니라 Service Discovery에 동일한 여러 개의 서비스를 등록해 Load Balancer의 기능까지 구현해 부하분산을 수행할 수 있다.
이러한 Service Discovery로 사용되는 것에는 Netflix Eureka, Apache Zookeeper 등이 있다.
Configuration Service
IP주소와 같은 설정 값들을 하드코딩하지 않고 외부 관리 시스템으로 관리해야 하는데 이때 사용되는 서비스이다. 이렇게 외부 시스템에 설정 값들을 저장할 경우 설정 값에 변경사항이 생겼을 때 서비스를 다시 배포해야하지 않아도 된다는 장점이 있다.
이 외에도 CI/CD 자동화를 위한 컴포넌트(Jenkins, Maven, Gradle...)들과 서비스 모니터링을 위한 컴포넌트들, 그리고 데이터를 저장하기 위한 컴포넌트들(Redis, Kafka, MongoDB...)이 존재한다.
위에서 소개하지 않는 구성요소들에 대해서는 공부하는대로 추가하도록 한다.