[마이크로서비스 패턴 쉽게 개발 2] 실습환경 준비
마이크로서비스 서비스를 개발하기 위해서는 알아야 할 4가지가 있습니다.
마이크로서비스 설계 방법론인 DDD(Domain Driven Design), 마이크로 서비스를 개발 / 운영하기 위한 아키텍처인 MSA(Micro Service Architecture), 마이크로서비스와 MSA가 갖춰야 할 8가지 특성(MSA Features)과 12가지 요소(12 Factors), 그리고 마이크로서비스의 문제를 해결하기 위한 Best Practice인 마이크로서비스 패턴입니다.
패턴 실습을 위해 이 모든 것을 먼저 알 필요는 없지만 마이크로서비스를 개발/운영하는 분들이라면 꼭 알아야 할 것들입니다.
제 이전 블로그 글에 DDD와 MSA Features & 12 Factors를 정리한 것이 있으니 참고 하세요.
https://happycloud-lee.tistory.com/94
https://happycloud-lee.tistory.com/188
DDD 전략 설계를 통해 우리는 Bounded Context와 Context Map을 도출할 수 있습니다.
Bounded Context는 유사한 비즈니스 목적별로 Actor, Command, Event, Data를 그룹핑한 것으로 1개의 Bounded Context를 여러개의 마이크로서비스로 분해할 수 있습니다. 보통은 Bounded Context가 그대로 마이크로서비스가 되는 경우가 많습니다.
Context Map은 Bounded Context간에 관계를 그린 Map입니다.
우리가 실습할 마이크로서비스의 Context Map은 아래와 같습니다. 각 Bounded Context를 마이크로서비스로 생각하시면 됩니다.
Order, Payment, Delivery, Inventory, Report의 5개 마이크로서비스로 구성되어 있습니다.
각 마이크로서비스는 자기 자신의 Database를 가지며 실습에서는 모두 MySQL을 사용합니다.
Axon Server는 Event Store와 MQ(Message Queue)의 역할을 합니다. Axon Server는 마이크로서비스 패턴 개발 프레임워크인 Axon Frmework을 제공하는 AxonIQ라는 회사에서 제공하는 제품입니다.
'Shared' 서비스인 'common' 서비스는 Axon Server와 마이크로서비스간에 유통되는 메시지 구조를 정의하며 각 마이크로서비스가 공유 합니다.
MySQL 설치
MySQL은 작업하는 머신에 직접 설치, Container로 설치, Kubernetes에 Pod로 설치할 수 있습니다.
실제 운영에서는 머신(VM 또는 Baremetal)에 직접 설치하거나 Kubernetes 환경에 Pod로 설치합니다.
실습에서는 PC에 Docker Container로 설치하겠습니다.
주의) PC에 직접 설치하거나 minikube를 PC에 실행하고 Pod로 배포하지 마세요 실습을 하다 이상하게 동작하여 MySQL을 지우고 다시 설치해야 할 경우가 있습니다. 직접 설치한 경우 PC의 어느 파일이 변경되었는지 찾기 어렵기 때문에 깨끗하게 재설치가 힘듭니다. 그래서 Container나 Pod로 설치하는게 좋습니다. minikube를 PC에서 동작시키면 자원 부족이 발생하여 MySQL Pod가 자꾸 재시작할 수 있습니다. |
1) Docker 설치
Container를 실행할 Docker 를 먼저 설치 합니다. 사용하시는 OS에 따라 아래와 같이 설치 하세요.
- Docker설치
- Mac:
- brew install docker
- open -a docker
- Window: https://happycloud-lee.tistory.com/14
2) MySQL Container 실행
- PC에 Volume Directory 작성
MySQL Database에 저장되는 Data들이 Container 내부 Volume에 저장되면 Container를 재시작했을 때 Data가 모두 사라집니다.
그래서 PC에 Volume Directory를 만들고 Data가 그 디렉토리에 쌓이도록 하는 것이 좋습니다.
사용자홈 디렉토리 밑에 'data/mysql'이라는 디렉토리를 작성합니다.
- Mac
mkdir -p ~/data/mysql
- Window
cd %userprofile%
mkdir data
cd data
mkdir mysql
- Container 실행: MYSQL_ROOT_PASSWORD는 적절하게 변경 하세요.
- Mac
docker run -d --rm --name mysql \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=P@ssw0rd$ \
-v ~/data/mysql:/var/lib/mysql \
mysql
- Windows
docker run -d --rm --name mysql \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=P@ssw0rd$ \
-v "%userprofile%\data\mysql":/var/lib/mysql \
mysql
* Windows에서는 안 해봐서 잘 안될 수 있습니다. 만약 안되는데 해결하셨으면 댓글로 솔루션을 알려주세요.
TIP) Docker run 옵션 -d : background로 실행. 이 옵션을 안 주면 Prompt가 바로 안 떨어지고 실행 console화면이 나타남. CTRL-C하면 중지됨 --rm: 'docker stop mysql'로 중지 시 Container바로 삭제. 이 옵션 안 주면 중지 시 Container상태만 중지 상태가 됨 --name: Container 이름. Container 중지나 로그 볼 때 이 이름을 사용하게 됨 -p: 포트 바인딩. 앞에 숫자가 Container 외부에서 접근할 포트번호이고 뒤에 숫자가 Container 내부에서 수신하는 포트임 -e: Container 내부에 생성할 환경변수. 암호 변수를 지정해 주면 Container 실행 시 이 암호로 접근하게 설치됨 -v: Volume Directory 연결. 앞에 디렉토리는 Container 외부의 볼륨이고 뒤에 디렉토리는 Contaienr 내부 디렉토리임 마지막 'mysql'은 Container image의 이름임. Fullname은 docker.io/library/mysql:latest임 |
3) DBeaver설치와 연결 확인
DBeaver는 무료 SQL Client입니다. 아래 링크에서 설치하십시오.
설치 후 실행하면 Connection을 만드는 다이알로그가 뜰 것입니다. 'MySQL'을 선택 하세요.
- Server Host, Port, Database, username, Password를 입력합니다.
바꿀 것은 Database와 Password입니다. 나머지는 기본값 그대로 쓰시면 됩니다.
- 만약 연결이 안되는 경우 (로컬이 아닌 별도 서버에 설치한 경우) 'Dirver Properties'탭에서 'allowPublicKeyRetrieval'값을 'true'로 변경 하세요.
4) Database 작성
각 마이크로서비스에서 사용할 Database를 만듭니다. 테이블은 어플리케이션 실행 시 자동으로 만들어집니다.
아래 5개 데이터베이스를 만들면 됩니다.
orderDB, paymentDB, deliveryDB, inventoryDB, reportDB
Axon Server 설치
Event Store와 MQ역할을 하는 Axon Server를 설치합니다.
역시 Docker Container로 설치 합니다.
docker run -d --rm --name axonserver \
-p 18024:8024 -p 18124:8124 \
-e axoniq.axonserver.devmode.enabled=true \
axoniq/axonserver
TIP) Container 실행 옵션 -p 18024:8024 : 웹으로 접근할 포트 바인딩 -p 18124:8124 : 마이크로서비스와 Axon 서버와 통신할 포트 바인딩 -e axoniq.axonserver.devmode.enabled=true: 개발모드로 설치하는 옵션 |
설치 후 몇분정도 기다린 후 웹브라우저에서 http://localhost:18024로 접근합니다.
그리고 [Finish]버튼을 누릅니다.
실행 시 'axoniq.axonserver.devmode.enabled=true'로 했기 때문에 아래 [Reset Event Store]버튼이 보입니다.
이 버튼의 기능에 대해서는 뒤에 설명 하겠습니다.
IntellJ IDEA 설치
IntelliJ 는 Eclipse, STS(Spring Tool Suite), Visual Studio Code와 더불어 대표적인 개발 IDE(Integrated Development Environment)툴입니다.
실습에 IntelliJ를 쓰는 이유는 Gradle로 Multi Module 프로젝트를 개발하는것을 가장 잘 지원하기 때문입니다.
TIP) Grade 이란 ? Java의 실행파일 Builder와 구동엔진의 한 종류입니다. Maven과 Gradle이 있습니다. 보통 Maven 프로젝트, Gradle 프로젝트라고 부릅니다. 주요 차이는 실행파일(WAR 또는 JAR)을 Build하는 방법, 어플리케이션 명세를 관리하는 방법, 실행 엔진이 다릅니다. 어플리케이션 명세에는 이름, 버전, 사용하는 라이브러리(=Dependency)등이 정의됩니다. - Maven: Build명령은 mvn, 어플리케이션 명세는 pom.xml - Gradle: Build명령은 gradle, 어플리케이션 명세는 build.gradle Builder가 달라진다고 어플리케이션 소스가 달라지는 건 아닙니다. 동일한 소스에 대해 Build하고 어플리케이션 명세를 관리하는 방법만 다른 겁니다. 따라서 Maven프로젝트를 Gradle프로젝트가 바꾸거나 그 반대로 바꿀 수 있습니다. Maven보다는 Gradle을 점점 더 많이 사용하는 추세입니다. 왜냐하면 어플리케이션 명세 관리가 좀 더 간결하고 어플리케이션 구동 속도가 빠르기 때문입니다. |
Multi Module 프로젝트는 메인 어플리케이션을 구성하는 서브 어플리케이션을 한 프로젝트로 관리하는 프로젝트를 말합니다.
실습에서는 5개의 마이크로서비스와 'common' 어플리케이션을 1개의 프로젝트로 개발하기 때문에 Multi module 프로젝트가 필요 합니다.
IntelliJ는 유료제품인 IntelliJ IDEA Ultimate와 무료제품인 IntelliJ IDEA CE(Community Edition)가 있습니다.
Ultimate를 갖고 계신 분들은 그걸 쓰시면 됩니다. 저는 무료버전인 IntelliJ IDEA CE를 이용하겠습니다.
CE버전은 Spring Boot를 지원하지 않기 때문에 실행 프로파일을 수동으로 만들어야 합니다.
TIP) Spring vs Spring Boot Spring은 Java 개발 프레임워크이고 Spring Boot는 Spring을 좀 더 쉽게 사용할 수 있게 만든 또 다른 개발 프레임워크입니다. 개발을 쉽게 해주는 여러 기능들이 있기 때문에 Spring Boot를 점점 더 많이 사용하는 추세입니다. Spring Boot는 Tomcat이나 Jetty와 같은 자체 WAS(Web Application Server)를 제공하기 때문에 웹 기반 어플리케이션을 제작하는데 좀 더 편리 합니다. |
아래 사이트에 접속하여 IntelliJ IDEA CE를 설치 합니다. 스크롤을 밑으로 내리면 CE버전 다운로드 버튼이 있습니다.
https://www.jetbrains.com/idea/download
이상으로 실습에 필요한 MySQL, Axon Server, IntelliJ IDEA CE를 설치 하였습니다.
다음 장에서는 우리가 개발할 주문 서비스 완성본을 테스트 해 보겠습니다.
마이크로서비스 패턴 쉽게 개발하기 목차
- 마이크로서비스 패턴 이해: Saga, Event Sourcing, API Composition, CQRS 이해
- 실습환경 준비
- 주문 서비스 테스트
- Axon Framework 이해
아래 주제들은 '마이크로서비스패턴 쉽게 개발하기'라는 제 책에서 만나실 수 있습니다.
- 멀티 모듈 프로젝트 작성
- 신규 주문 정상처리 프로세스 구현
- 배송 상태 변경 및 재고 증감 처리
- 신규 주문 보상처리 프로세스 구현
- 주문 수정 정상처리 프로세스 구현
- 주문 수정 보상처리 프로세스 구현
- 주문 삭제 정상처리 프로세스 구현
- 주문 삭제 보상처리 프로세스 구현
- API Composition 패턴과 CQRS 패턴
책 한번 내겠다는 평소의 꿈을 실현하기 위해 이번에 전자책을 내게 되었습니다.
제 꿈을 응원하신다는 마음으로 전체 내용을 공유하지 않는것을 양해해 주시고
구매까지 해 주시면 더욱 감사하겠습니다.
https://happycloud-lee.tistory.com/notice/291