전통적인 폭포수 개발 방법론은 프로젝트의 소프트웨어 산출물이 가진 세분화 정도에 따라 다음 단점이 발생한다.
비즈니스 로직 호추링 SOAP 이나 REST 같은 중립적인 프로토콜이 아닌 프로그래밍 언어 수준에서 이루어진다. 따라서 애플리케이션 컴포넌트를 조금만 수정해도 애플리케이션의 다른 부분에 문제가 생길 수 있다.
대부분의 대규모 소프트웨어 애플리케이션은 다양한 유형의 데이터를 취급한다. 예를 들어 CRM은 고객, 판매, 제품 정보를 관리하는데 전통적 모델에선 이러한 데이터는 같은 레포지터리 안에서 같은 모델을 유지한다. 따라서 한 영역에 속한 팀이 다른 팀의 데이터에 직접적으로 접근하고 싶은 유혹을 받는다. 이렇게 되면 보이지 않는 의존성이 생겨나고 컴포넌트 내부 데이터 구조에 대한 세부 구현이 애플리케이션 전체에 유출될 수 있다. DB 테이블 하나만 수정해도 엄청난 코드 수정과 회귀 테스팅이 필요하다.
전통적인 애플리케이션에선 대부분의 컴포넌트를 여러 팀에서 공유되는 단일 코드 베이스에 저장하므로 코드를 변경할 때마다 전체 애플리케이션을 재컴파일하고, 통합 테스팅을 수행하고 배포해야 한다.
이러한 단점을 극복하기 위해 마이크로서비스 기반 아키텍처는 기증을 제공하는 데 다음과 같이 접근한다.
마이크로서비스는 하나의 책임 집합을 가지며 범위가 좁다.
마이크로서비스 기반 애플리케이션은 작은 서비스 집합이며, HTTP와 REST처럼 비독점적 호출 프로토콜을 사용하는 구현 기술에 중립적인 인터페이스로 소통한다.
마이크로서비스는 자신의 데이터 구조와 데이터 소스를 완전히 소유한다. 일반적으로 마이크로서비스의 데이터를 보관하는 DB는 해당 서비스에서만 접근하기 때문이다.
마이크로서비스 애플리케이션의 모든 마이크로서비스는 서로 독립적으로 컴파일하고 배포할 수 있다.
마이크로서비스는 작은 범위를 담당하고, 명확히 정의된 인터페이스를 통해 접근하므로 기능을 신속히 제공할 수 있다.
마이크로서비스는 애플리케이션 전체를 중단하지 않고도 고장과 문제를 격리할 수 있다.
마이크로서비스는 독립적으로 배포가 가능한 작은 컴포넌트로 분리되어 있기 때문에 부하를 받는 컴포넌트를 조명하고 여러 서버에 수평 확장하기 수월하다.