마이크로서비스란
모놀리식
마이크로서비스와 반대되는 개념으로 단일 단위로 개발/배포되며 애플리케이션 일부를 업데이트하기 위해 전체 애플리케이션을 재배포해야한다.
SOA와 ESB
SOA(서비스 지향 아키텍쳐)는 모놀리식 애플리케이션의 기능을 서비스라 부르는 재사용 가능하고 결합이 느슨한 엔티티로 분리한 아키텍쳐이다.
- 잘 정의된 비즈니스 기능을 서비스 단위에서 자체적으로 동작/네트워크를 통한 접근 가능한 형태로 구현
- 소비자는 서비스 인터페이스만 염려하고 구현에는 신경쓰지 않음
- 서비스는 자체적으로 동작되며 (독립성을 위해) 느슨하게 결합
SOA 패러다임을 통해 각 비즈니스 기능은 여러 하위 기능을 포함하는 큰 덩어리의 서비스(주로 웹 서비스)로 구축되며 애플리케이션 서버 내에 배포된다. 비즈니스 기능을 사용하기 위해서는 다른 여러 시스템을 서로 통합/연계해야 하는데, ESB(엔터프라이즈 서비스 버스)가 데이터/서비스 통합에 사용된다.
API
비즈니스 기능을 관리 서비스나 API로 노출하는 것은 현대 엔터프라이즈 아키텍쳐의 핵심 요구사항이지만, SOA/ESB는 이러한 요구사항을 만족하는 이상적인 솔루션이 아니므로, 기존 SOA 구현 위에 새로운 API 관리/API 게이트웨이 계층(API Facade)을 추가한다. API는 특정 비즈니스 기능에 대한 간단한 API를 제공하고 ESB/웹 서비스 계층의 모든 내부 복잡성을 숨긴다.
마이크로서비스
마이크로서비스 아키텍처는 독자적인 프로세스로 실행되고 독립적으로 개발/배포되는 작은 서비스의 모음으로 단일 애플리케이션을 개발한다. 즉, 모놀리식 애플리케이션의 계층을 독립적인 비즈니스 기능 지향 서비스로 분해해, 중앙 ESB를 없에고 서비스가 서비스 간 통신 및 구성 로직을 관리하게 한다.
비즈니스 기능 지향
주어진 서비스는 오직 한 가지 일에만 집중하고 이를 잘 수행하여야 한다. 참조할 만한 개념은 다음과 같다
- 단일 책임 원칙(SRP, Single Responsibility Principle)
- 콘웨이의 법칙(Conway’s law)
- 12 팩터 앱(12 Factor App)
- 도메인 기반 디자인(DDD, Domain-Driven Design)
자율성: 개발 배포 확장의 독립성
마이크로서비스는 독립적인 개체로 개발, 배포, 확장된다. 즉, 웹 서비스 또는 모놀리식 애플리케이션 아키텍처와 달리 서비스가 동일한 실행 런타임을 공유하지 않으며 대신 서비스가 컨테이너와 같은 기술을 활용해 서로 격리된 런타임으로 배포된다. 참조
- 도커(Docker)
- 쿠버네티스(Kubernetes)
자율적인 서비스는 서비스 분리를 통해 장애를 격리함으로 전체 시스템의 탄력성을 보장하며, 네트워크상에서 메시지를 활용한 서비스 간 통신을 통해 느슨하게 결합된다.
중앙 ESB 부재: 스마트 엔드포인트와 멍청한 파이프(smart endpoint&dumb pipe)
마이크로서비스는 ESB 대신 스마트 엔드포인트와 멍청한 파이프라는 새로운 스타일의 서비스 통합 수단을 도입한다. 기존 모놀리식 아키텍쳐에서의 비즈니스 기능은 기본 서비스 및 시스템의 통합이나 연결을 통해 ESB 수준에서 구현되나, 스마트 엔드포인트와 멍청한 파이프를 사용하면 모든 비즈니스 로직(서비스 간 통신 로직 포함)은 각 마이크로서비스 레벨(스마트 엔드포인트트에 있으며, 이러한 모든 서비스는 비즈니스 로직이 없는 기본 메시징 시스템(멍청한 파이프)에 연결된다.
단 중앙 ESB를 제거하는 것으로 복잡성을 제거하는 것은 불가능하며 ESB의 중앙집중식 기능들이 모든 마이크로서비스에 분산되어, ESB가 제공하는 기능들은 마이크로서비스 수준에서 구현돼야 한다. 특히 네트워크를 통한 서비스 간 통신으로 인해 오히려 오류가 발생하기 쉽다.
실패 내결함성(fault tolerance)
마이크로서비스 아키텍쳐는 세부적으로 분할된 서비스들의 모음이므로 하나 이상의 서비스가 실패할 때 전체 애플리케이션이 중단되면 안 된다. 따라서 마이크로서비스에서 발생한 실패를 적절하게 처리해야 애플리케이션의 비즈니스 기능에 미치는 영향을 최소화할 수 있다. 참조
- 회로 차단기(Circuit Breaker)
- 재해 복구(Disaster Recovery)
- 로드 밸런싱(load-balancing)
- 페일오버(fail-over)
분산화된 데이터 관리
각 마이크로서비스는 자체적인 데이터베이스와 데이터베이스 스키마를 가져야 한다. 분산화된 데이터 관리를 통해 마이크로서비스를 서로 완벽하게 분리할 수 있고, 마이크로서비스 별로 서로 이질적인 데이터 관리 기술을 자유롭게 선택할 수 있다..
Leave a comment