마이크로서비스 앱은 기존의 모놀리식 앱과 다른 개발 방식으로 비지니스 관점으로 보면 독깁적인 서비스 변경과 확장이 유용하고 의존성이 감소된다. 단점은 아키텍처 설곙와 비지니스 분석이 선행되어야 하며 설계의 난이도가 증가한다. 레거시 시스템과 연계에 어려움이 있을 수 있다.
기술적 관점에서는 신속하고 독립적인 변경, 배포 및 확장에 효율적이며 Polyglot(다양한 언어) 개발이 가능하다. 단점으로는 분산시스템 인프라 구성, 확장 및 운영에 어려움이 따른다. 실제로 마이크로서비스 구성 및 개발 도구가 부재하고 수 많은 앱의 연결되기 때문에 복잡한 네트워크 및 환경 설정을 위해 자동화는 필수이다.
기존의 모놀리식 앱을 마이크로서비스 단위로 전환 개발하는 프로젝트도 수행하지만 신규 개발에 적용하는 것이 더 적합하다.
“마이크로서비스는 한가지 기능(비지니스 관련 기능/역할)을 수행하는 초점을 맞춘 서비스를 독립적이고 배포 가능한 가장 작은 단위의 서비스(=atom)로 분리하고 API를 통해 다른 서비스와 연계하며 각각 자율적으로 개발, 운영 즉, 독립적인 팀이 각 서비스의 개발과 운영을 담당하는 것이다”
- 업무상의 기능 또는 역할을 하나의 기능 묶음으로 개발된 컴포넌트 → 한 가지의 역할만 수행
- REST API 등을 통하여 서비스들의 기능을 제공하고 사용
- 데이터를 공유하지 않고 서비스 별로 독립적으로 가공하고 저장함
- 서비스간의 인터페이스 규약 사용 - REST, Thrift, Protocolbuffer, AMQ
마이크로서비스 아키텍처를 구성하는 핵심 요소는 크게 4가지로 구성된다. 서비스, DevOps, 데이터 분리, API Gateway 로 구성할 수 있다.
서비스
각 컴포넌트는 서비스라는 형태로 구현되고 API를 이용하여 타 서비스와 통신
서비스 경계는 구문 또는 도메인(업무)의 경계를 따름
예) 사용자 관리, 상품 관리, 주문 관리와 같은 각 업무 별로 서비스를 나눠서 정의
REST API에서 /users, /products와 같이 주요 URI도 하나의 서비스
DevOps
데이터 분리
API Gateway
Technology Heterogeneity
요구사항을 구현하기 위해 최적화된 언어와 아키텍처의 선택 : 다른 프로그래밍언어, 다른 도구를 사용하여 개발 가능
Resilience
오류 발생 시 복구될 때까지 요청 가능 서비스에서 제외 (Circuit Breaker와 로드밸런서가 담당)
Scaling
서비스들은 서로 독립적이므로 타 서비스에 영향을 주지 않고 서비스 단위로 확장 가능 →API(특히 REST API)를 통해 서비스 간 통신
X축 확장으로 불리는 멀티 애플리케이션(또는 서버)의 확장과 Z축 확장(Partitioning 또는 Sharding)으로 불리는 확장을 독립적으로 수행
Ease of Deployment
DevOps와 결합된 각각의 마이크로서비스는 단순한 구조 → 개발속도와 개선에 높은 효용성
자동화된 단위 테스트와 시나리오 테스트는 빠른 배포주기에도 불구하고 뛰어난 품질을 유지할 수 있도록 함
Organizational Alignment
각각의 마이크로서비스는 개별 팀에서 독립적으로 개발/배포가 가능.
시스템의 규모가 커짐에 따라 추가로 발생하게 되는 오버헤드가 일정수준으로 관리가 가능
Composability
개별 비즈니스 요구사항에 특화된 단순한 서비스 → 개발자의 관리 범위 명확 → 소프트웨어의 복잡성을 제어(UI와 컨트롤, 도메인 로직이 별도의 마이크로서비스로 구성되어 완전히 독립적으로 개발)
각 서비스는 다른 데이터 저장소를 사용할 수 있으며 서로 느슨하게 연결
Replaceability
서비스를 나누는 규칙, 즉 서비스를 모듈화하는 규칙으로 동일한 기능을 하는 서비스는 하나의 서비스로 대체 가능
마이크로서비스 구성을 위해서는 다양한 패턴들을 적용해야 하는데 창업 플랫폼에서는 기본적으로 Spring cloud, Spring boot 기반의 마이크로서비스 패턴이 적용되어 있다.
Micorservices Concern | Spring Cloud & Netflix OSS |
---|---|
Configuration Management | Config Server |
Service Discovery | Netflix Eureka |
Load Balancing | Netflix Ribbon |
API Gateway | Netflix Zuul |
Service Security | Spring Cloud Security |
Resilience & Fault Tolerance | Netflix Hystrix, Turbine & Ribbon |
Configuration Management
Spring Cloud Config Server
Service Discovery
클라이언트나 API 게이트웨이가 호출할 서비스를 찾는 매커니즘이 필요하고 이를 서비스 디스커버리(Service Discovery)라고 한다.
Load Balancing
Spring cloud의 ribbon은 Client에 탑재되어 있는 로드밸런서로 서버 사이드에서 필요했던 H/W 부담이 사라지고, 서버 목록 변경이 쉽고, 로드밸런싱 방식도 다양하게 설정하는 기능을 제공한다.
API Gateway
Circuit Breaker
원격 접속의 성공/실패를 카운트하여 에러율(failure rate)이 임계치를 넘어섰을 때 자동적으로 접속을 차단하는 시스템이다.
Circuit Breaker는 상태 머신(State Machine)으로 나타낼 수 있다. 접속 성공과 실패 이벤트가 발생할 때마다 내부 상태를 업데이트하여 자동적으로 장애를 검출하고 복구 여부를 판단한다.
Hystrix
Hystrix는 대기 시간 허용 오차 및 결함 허용 논리를 추가하여 이러한 분산 서비스 간의 상호 작용을 제어하는 데 도움이되는 라이브러리이다. Hystrix는 서비스 간 액세스 지점을 격리하고 이를 통해 계단식 오류를 중지하고 대체 옵션을 제공함으로써 시스템의 전반적인 복원력을 향상시킨다.
마이크로서비스 아키텍처에서 가장 많이 등장하는 API는 애플리케이션 간의 표준화된 통신 방식 중의 하나이다. REST API는 다음과 같이 정의할 수 있다.
마이크로서비스 아키텍처 기반 개발은 상세한 유저스토리를 바탕으로 프론트엔드와 백엔드를 각각 개발하여 검증한다. 프론트엔드 개발자는 프론트엔드 개발 –> Mock Test –> API 연동과 같은 순서로 진행하고 백엔드 개발자는 개발 이후에 단위테스트 단계에서 프론트엔드의 API 연동 테스트를 수행한다.
마이크로서비스 애플리케이션 간의 호출 처리는 API를 통해 호출한다.
PaaS에서 마이크로서비스 실행 시 솔루션 취약성, 운영 부담을 줄이고 개발자의 생산성 향상을 기대할 수 있다. 마이크로서비스 아키텍처는 기존 모놀리식 아키텍처 개발 대비 수많은 애플리케이션이 조합되어 실행되기 때문에 빈번한 배포가 발생하고 주기가 굉장히 짧아진다. PaaS를 활용하면 개발환경 구성부터 운영 시 서비스 상태 관리 인스턴스 관리가 매우 쉬워진다.
클라우드 컴퓨팅은 자신이 소유해던 방식에서 공유 개념으로 전환한 형태로 자동차를 예를들면, 일반 자가용에서 리스 및 공유차와 같은 형태와 유사하다. 특히, PaaS는 IaaS(Infrastruture as a Service) 환경에서 실행되는 클라우드 플랫폼으로 택시처럼 비용지불만으로 운전도 대신해주는 서비스로 이해할 수 있다.
<출처 : https://rubygarage.org/blog/iaas-vs-paas-vs-saas >
PaaS 에서 일반적으로 제공하는 주요 기능 및 서비스는 다음과 같다.