MSA-Sample

Spring Cloud로 개발하는 마이크로서비스 애플리케이션

MicroService Architecture의 줄임말

👉🏻 마이크로서비스 아키텍처에 대한 정확한 정의는 없다.

하지만 마이크로서비스란 작고, 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스로 구성된 프레임워크라고 할 수 있다.

마이크로서비스는 완전히 독립적으로 배포가 가능하고,

다른 기술 스택(개발 언어, 데이터베이스 등)이 사용 가능한 단일 사업 영역에 초점을 둔다.


Monolithic Architecture는 소프트웨어의 모든 구성요소가 한 프로젝트에 통합되어 있는 형태이다.

웹 개발로 예를 들면 웹 프로그램을 개발하기 위해 모듈별로 개발을 하고, 개발이 완료된 웹 어플리케이션을 하나의 결과물로 패키징하여 배포되는 형태를 말한다.

이런 애플리케이션을 모놀리식 어플리케이션이라고 하며, 웹의 경우 WAR 파일로 빌드되어 WAS 에 배포하는 형태를 말한다.

주로 소규모 프로젝트에 서 사용된다.

하지만 일정 규모 이상의 서비스, 혹은 수백명의 개발자가 투입되는 프로젝트에서 Monolithic Architecture는 한계를 보인다.

  • 부분 장애가 전체의 서비스의 장애로 확대될 수 있다.
    • 개발자의 잘못된 코드 배포 또는 갑작스런 트래픽 증가로 인해 성능에 문제가 생겼을 떄, 서비스 전체의 장애로 확대될 수 있다.
  • 부분적인 Scale-Out 이 어렵다. ( Server를 나누어 일을 처리 )
    • Monolithic Architecture에서는 사용되지 않는 다른 모든 서비스가 Scale-Out 되어야 하기 떄문에 부분 Scale-Out 이 어렵다.
  • 서비스의 변경이 어렵고, 수정 시 장애의 영향도 파악하기 힘들다.
    • 여러 컴포넌트가 하나의 서비스에 강하게 결합되어 있기 때문에 수정에 대한 영향도 파악이 힘들다.
  • 배포 시간이 오래 걸린다.
    • 최근 애플리케이션의 개발 방법은 CI/CD 를 통한 개발부터 배포까지 빠르게 반영하는 추세이다. 그러나 규모가 커짐에 따라 작은 변경에도 높은 수준의 테스트 비용이 발생하기도 하며, 많은 사람이 하나의 시스템을 개발하여 배포하기 떄문에 영향을 줄 수 밖에 없다.
  • 한 프레임워크와 언어에 종속적이다.
    • Spring을 쓸 경우 blockChain 연동 모듈을 추가할 때 Node를 쓰는 것이 일반적이며 강세이다. 하지만 Java를 이용하여 해당 모듈을 작성할 수 밖에없다.

MSAAPI 를 통해서만 상호작용 할 수 있다,

즉 마이크로서비스는 서비스의 End-PointAPI 형태로 외부에 노출하고, 실질적인 세부사항은 모두 추상화 한다.

내부의 구현 로직, 아키텍처와 프로그래밍 언어, DB, 품질 유지 체계와 같은 기술적인 사항들은 서비스 API에 의해 철저하게 가려진다.


장점

  1. 각각의 서비스는 모듈화되어 있으며 이러한 모듈끼리는 RPC 또는 Message-Driven API 등을 이용하여 통신한다. 이러한 MSA 는 각각의 개별 서비스 개발을 빠르게하며, 유지보수도 쉽게 할 수 있도록 한다.

  2. 팀 단위로 적절한 수준에서 기술 스택을 다르게 가져갈 수 있다. 회사가 Java 의 Spring 기반이라도 MSA 를 적용하면 Node.js 로 블록체인 개발 모듈을 연동함에 무리가 없다.

  3. 서비스 별로 독립적인 배포가 가능하다. 따라서 지속적인 배포 CD 도 모놀로식에 비해서 가볍게 할 수 있다.

  4. 각각의 서비스의 부하에 따라 개별적으로 Scale-Out 이 가능하다. 메모리, CPU적으로 상당부분 이득이 된다.

단점

  1. 모놀리식에 비해 상대적으로 많이 복잡하다. 서비스가 모두 분산되어있기 때문에 개발자는 내부 시스템의 통신을 어떻게 가져가야 할지 정해야한다. 또한, 통신의 장애와 서버의 부하가 있을 경우 어떻게 트랜잭션을 유지할지 결정하고 구현해야 한다.
  2. 모놀리식에서는 단일 트랜잭션을 유지하면 됐지만, MSA 는 비즈니스에 대한 DB를 가지고 있는 서비스도 각기 다르고, 서비스의 연결을 위해서는 통신이 포함되기 때문에 트랜잭션 을 유지하기 어렵다
  3. 통합 테스트가 어렵다. 개발환경과 실제 운영환경을 동일하게 가져가는 것이 쉽지 않다.
  4. 실제 운영환경에 대해서 배포하는 것이 쉽지 않다.

마이크로 서비스의 경우 서비스 1개를 재배포한다고 가정하면 다른 서비스들과 연계가 정상적으로 이루어지고 있는지도 확인해야 한다.