만약 개발자들이 만든 웹앱을 각 Local에서 개발 후 서버에 배포한다고 해보자.
-> 최초 상용 배포 시 (Tomcat 1대, DB 1대)
-> SCP를 통해 Clean 배포 (stop -> delivery -> start)
-> DNS(12st.com) -> Tomcat
-> 이 경우 무중단 배포
가 불가능하다.
-> 그래서 Load Balancer를 도입한다.
-> 1번 Tomcat 내리고 -> 배포 -> 1번 재시작
-> 2번 Tomcat 내리고 -> 배포 -> 2번 재시작
그런데 여기서 서비스가 흥행해서 서버를 증설했다. 그래서 LoadBalancer 설정을 변경하고 배포 방식을 변경했다.
-> Jenkins 도입, Ansible 등
이제 회사가 커지고 부서가 늘어났다고 해보자. 부서는 상품팀, 주문팀 등 특정 기능으로 세분화되었다. 그런데 아직 이 회사는 단일 Repository로 소스를 관리 중이다. 이 경우 나타날 수 있는 이슈는
결국 이 회사는 여러가지 문제로 두 가지 서버군을 쓰기로 결정했다.
-> 각 부서는 도메인을 나눠 정해진 도메인으로만 요청할 수 있게한다.
-> 이 경우, 주문 시 상품 정보를 바꿀 수가 없음 (재고라든가..)
-> 그래서 공통의 소스 Repository를 두어 접근할 수 있게할 것이다.
-> 그러면 각 팀끼리 서로 필요한 기능이 생기면 공통 Repository 소스에 그 기능을 추가해 공통 Repo의 어떤 메소드를 호출하시면 됩니다~ 라고만 전달하면 된다.
-> 근데 이렇게 하면 대부분의 개발이 Share Repo에서만 이루어지기 때문에 활용성이 부족하다.
테스트성
이 부족하면 결국 버그가 발생할 가능성도 높다. 그러면 메모리 누수가 발생할 가능성도 높아 전체 애플리케이션 인스턴스가 내려가는 경우도 발생할 수 있다시스템을 여러 개의 독립된 서비스로 나눠서 이 서비스를 조합함으로서 기능을 제공하는 아키텍처 디자인 패턴이다.
(확장의 기술)에 나온 확장큐브
의 개념으로 마이크로 서비스를 살펴보자. 확장큐브는 애플리케이션을 확장하는 세 가지 방법을 정의한다.
첫째, X축 확장은 동일한 다중 인스턴스에 들어온 요청을 부하분산
둘째, Z축 확장은 요청의 속성에 따라 요청을 라우팅한다
셋째, Y축 확장은 애플리케이션을 기능에 따라 서비스로 분해한다.
X축 확장 : 다중 인스턴스에 고루 요청 분산
X축 확장은 일반적인 모놀리식 애플리케이션의 확장 수단이다. 부하분산기(Load Balancer) 뒷면에 애플리케이션 인스턴스를 N개 띄워놓고 부하 분산기는 들어온 요청을 이들 인스턴스에 고루 분배한다. ]
애플리케이션 능력과 가용성을 개선하기 위해 사용한다.
Z축 확장 : 요청 속성별 라우팅
모놀리식 애플리케이션의 다중 인스턴스를 실행하는 것은 X축 확장과 같지만, 인스턴스별로 주어진 데이터 하위 집합만 처리하도록 하는 방법이다. 라우터는 요청의 속성에 알맞은 인스턴스로 요청을 라우팅한다.
각 애플리케이션 인스턴스는 자신에게 배정된 사용자 하위집단만 처리한다. 라우터는 요청헤더 Authorization에 포함된 userId를 보고 N개의 동일한 애플리케이션 인스턴스 중 하나를 선택한다.
Z축 확장은 애플리케이션을 확장해서 증가하는 트랜잭션 및 데이터 볼륨을 처리하기 좋은 수단이다.
Y축 확장 : 기능에 따라 애플리케이션을 서비스로 분해
X축/Z축 확장을 하면 애플리케이션 능력과 가용성은 개선되지만, 애플리케이션이 점점 더 복잡해진다. 따라서 여러 서비스로 쪼개기로 한다.
서비스는 주문 관리, 고객 관리 등 지엽적 기능이 구현된 미니 애플리케이션이다. 서비스에 따라 X축/Z축 확장도 가능한다. 예를 들어, 주문 서비스는 여러 서비스 인스턴스를 부하 분산하는 형태로 구성할 수 있다.
각 서비스 간에 HTTP 네트워크를 통해 데이터를 주고 받음
독립된 배포 단위
각 서비스는 쉽게 교체 가능
각 서비스는 기능 중심으로 구성
각 서비스에 적합한 프로그래밍 언어, DB 환경으로 개발할 수 있음
-> 마이크로서비스는 서로 느슨하게 결합되어있고 오직 API를 통해서만 통신한다. 근데 이 서비스는들은 각각 자체 DB를 가지고 있다. 때문에 개발 단계에서 다른 서비스 개발자와 일일이 협의하지 않고 개발자 본인이 담당한 서비스 스키마를 변경할 수 있다. 런타임 서비스에서는 완전히 분리되어 있기 때문에 다른 서비스가 DB락을 획득해 내 서비스를 블로킹 하는 일 같은건 일어나지 않을 것이다.
서비스는 크기가 작고 상황에 따라 경계를 정하고, 자율적으로 개발되고, 독립적으로 배포되고, 분산되고, 자동화 된 프로세스로 구축되고 배포된다.
-> 마이크로 서비스 아키텍처는 서비스를 모듈성의 단위로 사용한다. 각 서비스는 다른 서비스가 함부로 규칙을 어기고 침투하지 못하게 API라는 경계선을 갖고 있어 다른 서비스 API를 우회하여 내부 클래스에 마음대로 들어올 수 없다.
하나의 서비스를 3~9명의 사람들이 개발할 수 있어야 함
아직까진 아이디어 수준에 가깝다
지속적 전달/배포
는 소프트웨어를 빠르게, 자주, 확실하게 전달하는 것이다.지속적 전달/배포
를 실현한다.사가
라는 기술로 서비스 간 데이터 일관성을 유지한다. 또, 단순 쿼리로 여러 서비스에 있는 데이터를 조회할 수 없으므로 AP를 조합하거나 CQRS 뷰로 쿼리한다.