MSA는 하나의 거대한 애플리케이션(모놀리식)을 기능별로 잘게 쪼개어, 독립적으로 배포하고 확장할 수 있는 작은 서비스들의 집합으로 만드는 아키텍처 스타일입니다.
핵심 목표:
문제점: 클라이언트(웹/앱)가 수십 개의 마이크로서비스 주소를 모두 알고, 각 서비스의 인증 방식이나 프로토콜에 맞춰 직접 통신하는 것은 매우 복잡하고 비효율적입니다.
API 게이트웨이:
문제점: MSA 환경에서는 컨테이너 기반으로 서비스가 배포되므로, 각 서비스 인스턴스의 IP 주소와 포트가 동적으로 계속 변경됩니다. A 서비스가 B 서비스를 호출해야 할 때, B 서비스의 현재 네트워크 위치를 어떻게 알 수 있을까요?
서비스 디스커버리:
문제점: 수십 개의 마이크로서비스가 각각의 설정 파일(application.yml)을 가지고 있다면, 공통된 설정(DB 주소, 외부 API 키 등)을 변경해야 할 때 모든 서비스의 설정 파일을 수정하고 재배포해야 하는 "설정 지옥"에 빠지게 됩니다.
중앙 설정 서버 (Configuration Server):
문제점 (연쇄 장애): MSA 환경에서 A 서비스가 B 서비스를 호출하고, B 서비스가 C 서비스를 호출하는 연쇄적인 의존 관계가 있을 때, 만약 C 서비스 하나에 장애가 발생하면 어떻게 될까요? B 서비스는 C를 기다리다 타임아웃되고, A 서비스도 B를 기다리다 타임아웃되어, 결국 작은 장애 하나가 전체 시스템의 장애로 번지는 "연쇄 장애(Cascading Failures)"가 발생할 수 있습니다.
서킷 브레이커:
Closed로, 실패하면 다시 Open 상태로 전환.