개념
마이크로서비스
마이크로서비스는 어플리케이션을 느슨히 결합된 서비스의 모임으로 구조화하는 서비스 지향 아키텍처(SOA) 스타일의 일종인 소프트웨어 개발 기법이다. ref. wikipedia
- 서비스 지향 아키텍처 : Srvice Oriented Architecture, SOA. 대규모 컴퓨터 시스템을 구축할 때의 개념으로 업무상의 일 처리에 해당하는 소프트웨어 기능을 서비스로 판단 → 그 서비스를 네트워크상에 연동하여 시스템 전체를 구축해나가는 방법론
- 어플리케이션을 모듈화 → 어플리케이션의 이해, 개발, 테스트를 더 쉽게 해주고 침식에 탄력적으로 만들어 준다.
- 서비스를 독립적으로 개발, 배포, 확장 할 수 있으므로 병렬 개발이 가능하다.
- 지속적 리팩토링을 통해 개개의 서비스 아키텍처를 하나로 병합할 수 있다.
- 마이크로서비스 기반 아키텍처는 지속적 배포와 통합을 가능케 한다.
ref. https://en.wikipedia.org/wiki/Microservices
Introduction
마이크로 서비스는 하나로 정의되지 않는다. 몇몇의 정의된 특징은 다음과 같다.
- 마이크로서비스 아키텍처(MSA) 내 서비스는 전체의 목적을 달성하기위해 HTTP와 같은 프로토콜을 사용함으로써 network을 넘나들며 통신하는 과정이다.
- 마이크로서비스 아키텍처 내 서비스는 독립적으로 배포된다.
- 서비스는 비즈니스 단위에서 조직된다.
- 서비스는 해당 서비스에게 최적인 서로 다른 프로그래밍 언어, 데이터베이스, 하드웨어, 소프트웨어 환경에서 구현될 수 있다.
- 서비스는 작은 규모(각각의 서비스)이고, 메세징을 지원하며, 컨텍스트에 의한 전달이 가능하며, 자율적인 개발, 독립적 배포, 중앙 집중적이지 않은 자동화된 절차로 릴리즈된다.
❗️ message queue
MQ(Message Queue)는 메세지를 발생하는 생산자와 메세지를 받는 소비자 사이에 위치하여 매개체 역할을 수행하는 미들웨어이다. 서비스간 결합도가 낮아야하는 MSA에서는 비동기식 데이터 송수신을 위해 MQ를 사용한다.
마이크로 서비스는 monolithic 어플리케이션에 포함된 하나의 레이어(예를 들면, 웹 컨트롤러나 BE, FE 등)를 의미하는 것이 아니다.
❗️ Monolithic application
사용자 인터페이스 및 데이터 엑세스 코드가 단일 플랫폼에서 단일 프로그램으로 결합되는 단일 계층 소프트웨어 응용 프로그램을 의미한다. 단일 응용 프로그램은 독립적이며 다른 컴퓨팅 응용 프로그램과는 독립적이다.
오히려 그 자체로써 깔끔한 인터페이스와 함께 비즈니스 기능을 하는 컨테이너이다. 또한 레이어로 나뉜 아키텍처를 구현하는 내부 컴포넌트를 가지고 있다. 전략적인 관점에서 마이크로서비스 아키텍처는 "Do one thing and do it well"이라는 유닉스의 이념을 이끈다. Martin Fowler는 마이크로서비스를 기반으로하는 아키텍처에 대해 다음과 같이 설명하고 있다
- 지속적 전달(continuous delivery) 소프트웨어 개발 프로세스를 사용하기 때문에 어플리케이션의 일부만 변경하려면 최소한의 서비스만 재구축하고 재배포하면 된다.
- 독립적으로 배포 가능한 서비스에 대해 세분화된 인터페이스, 비즈니스 중심 개발 (예 : 도메인 중심 설계)과 같은 원칙을 준수한다.
이는 일반적으로 cloud-native applications, serverless computing,가벼운 컨테이너 배포를 사용하는 어플리케이션을 위한 마이크로서비스 아키텍처에 사용된다. Fowler에 따르면 (monolithic 어플리케이션 구현과 비교할 때) 많은 서비스가 필요하기 때문에 중앙 집중적이지 않은 지속적인 전달과 전체론적인 서비스 모니터링 등의 DevOps가 어플리케이션의 개발, 유지보수, 작동에 효과적으로 작용한다.
여기서 더 나아간 (이론적인) 개념은 개개의 마이크로서비스는 각자 확장될 수 있단 것이다. monolithic한 접근 방식에서는 전체 중 하나에만 리소스 제약이 있더라도 세 개의 기능을 지원하는 어플리케이션을 전체적으로 확장해야한다. 반면에 마이크로서비스에서는 오로지 해당 리소스와 관련된 하나의 기능을 지원하는 서비스만 확장하면되므로 리소스와 비용면에서 최적화된 이윤을 제공한다.
Benefits
어플리케이션을 다른 작은 서비스로 분해하면 다음과 같은 이점을 얻을 수 있다.
- 모듈성
어플리케이션을 이해하고 개발하고 테스트하는 것을 쉽게 만들며 아키텍처가 노화되는 것에 유연성을 부여한다. 이러한 이점은 monolithic한 아키텍처의 복잡성과 종종 비교된다.
- 확장성
마이크로서비스는 다른 것들에 독립적으로 개발되고 배포된다. 즉, 독립적인 프로세스에서 실행되므로 독립적으로 모니터링되고 확장된다.
- 이기종과 레거시 시스템의 통합
마이크로서비스는 기존 monolithic 소프트웨어 애플리케이션을 현대화하는 수단으로 간주된다. 사용중인 소프트웨어를 마이크로서비스를 이용해 (일부를) 성공적으로 재배치한 몇몇 회사의 경험적 리포트가 존재한다. 레거시 어플리케이션에서 소프트웨어의 현대화를 위한 과정은 점층적인 접근법이 사용된다.
- 분산 개발
소규모 자율팀이 각자의 서비스를 독립적으로 개발, 배포, 확장 할 수 있도록하여 개발을 병렬화한다. 이는 또한 각각의 서비스의 아키텍처가 지속적인 리펙토링을 통해 나타날 수 있도록 한다. 마이크로서비스 기반의 아키텍처는 지속적 통합, 지속적 전달(배포) 및 개발을 가능하게한다.
Technologies
컴퓨터 마이크로서비스는 서로 다른 프로그래밍 언어와 인프라 스트럭처를 사용하여 구현되었다. 따라서 가장 중요한 기술 선택은 마이크로서비스가 서로 통신하는 방식(동기, 비동기, UI 통합)과 통신에 사용되는 프로토콜(RESTful HTTP, messaging, GraphQL ...)이다. 전통적인 시스템에서 대부분의 기술 선정은 전체 시스템에 영향을 주는 프로그래밍 언어와 같다. 그러므로 기술을 선정하는 접근 방식이 상당히 다르다.
- 분산 추적: 프로세스별 로깅과 메트릭 모니터링은 제위치에 존재하지만 둘 다 트랜잭션이 분산 시스템에 전파될 때 취하는 복잡한 경로를 재구성할 수 없다. 따라서 분산 추적은 마이크로 서비스 플랫폼에 필수적인 도구다.
마이크로서비스 아키텍처
🚨 특징
- 모듈성있는 구조를 강제한다.
- 지속적 배포를 수행하는 소프트웨어 개발 프로세스에 위치시킨다.
- 독립적으로 서비스를 전개
- 비즈니스 주도 개발 (e.g. domain driven design)
- 클라우드 애플리케이션 아키텍처
- Polyglot programming : 다중 프로그래밍 언어로 작성된 컴퓨터 프로그램 또는 스크립트로써 이를 컴파일하거나 해석하는데 사용되는 프로그래밍 언어와 무관하게 동일한 연산과 출력을 수행한다.
- Persistence : 프로세스가 생성했지만 별개로 유지되는 상태
- 전체론적 서비스 모니터링을 갖춘 DevOps : Development + Operation
❗️ DevOps
개발과 운영의 합성어. 하나의 아이디어(새로운 소프트웨어 기능, 개선 요청 또는 버그 수정 등)가 사용자에게 가치를 제공 할 수 있도록 운영 환경에서 개발부터 배포로 진행되는 프로세스의 속도를 높이는 접근 방식을 의미한다.
DevOps의 확립은 셀프 서비스와 자동화를 통한 다양한 이점과 경쟁력을 가져온다.
https://www.redhat.com/ko/topics/devops
👍 읽어보면 좋을 글