본문 바로가기
Study/Cloud Computing

[Cloud] 마이크로서비스 간의 통신 (2)

by sumping 2024. 3. 29.

 

*본 포스트는 성신여자대학교 [클라우드 컴퓨팅] 강의 기반으로 작성됨을 알립니다.

 
 

목차

1. 마이크로서비스 데이터 관리 - (1)
2. 마이크로서비스 간의 통신 - (1) 
3. HTTP를 사용한 직접 메시징 
4. 레빗MQ를 사용한 간접 메시징 


3️⃣ HTTP를 사용한 직접 메시징

 

Chapter-5/example-2 - HTTP POST 메시지 수신

예제 repository : https://github.com/bootstrapping-microservices/chapter-5.git
 
HTTP POST 요청을 만든 코드이다. http.post에 대한 필요한 헤더/바디 부분을 설정하고 videoPath라는 변수에 매개변수를 받아서 history 마이크로서비스에 viewed 메시지를 post 요청으로 보낸다. 이때 요청을 보낼 URL은 http://history/viewed로, 대상 마이크로서비스를 특정한다.

chapter-5/example-2/video-streaming/src/index.js

 
video-streaming 마이크로서비스에서 POST 요청이 오면 body-parser를 통해 자동으로 JSON 형태를 인식하여 요청이 들어오면 insert를 하여 POST 요청을 처리한다.

chapter-5/example-2/history/src/index.js

 
위에서 업데이트한 application을 테스트한다.

  • docker-composer 빌드로 application을 실행시킨다. (마이크로서비스 online 상태 확인)
  • http에서 실제로 잘 동작하는지 확인한다. (http://<ip주소>:3001/video)
  • DB에 접속해서 history 마이크로서비스의 데이터를 확인한다. (우측 사진을 보면 2개에서 4개로 늘어났는데 한 번 영상을 streaming할 때마다 해당경로에 대한 request와 파비콘 request 2개이기 때문에 2개씩 생성)
//application 실행
docker compose up --build

//history 데이터 확인
$ docker exec -it db bash
# mongo
> use history
> db.videos.find({})
두 개의 터미널로 build를 하고 컨테이너 내부에 접속해서 조회한다.

 

  • http://<IP주소>:3001/video → http에서 실제로 잘 동작하는지 확인

 


4️⃣ 레빗MQ를 사용한 간접 메시징

 
간접 메시징은 마이크로서비스 간의 "느슨한 연결"을 지원한다. 간접 메시징은 video-streaming과 history가 직접 통신하는 것이 아니라 RabbitMQ를 통해 viewed 메시지를 queue에 publish하고 hisory가 queue에서 viewed 메시지를 pull한다.

RabbitMQ를 사용한 간접 메시징

 
간접 메시징의 전체 flow는 아래 이미지와 같다.

  • 송신 : DNS를 통해 RabbitMQ 서버의 특정 queue에 전송
  • 수신 : History 마이크로서비스는 특정 queue로부터 viewed 메시지를 가져온다.
    • 간접 메시징은 수신하는 마이크로서비스에게 더 나은 제어권을 부여한다. (과부하 상황에서 메시지를 loss하지 않고 queue에서 꺼내갈 수 있다.)
간접 메시지의 대상 마이크로서비스 찾기

 
 
실습 repository : https://github.com/bootstrapping-microservices/chapter-5.git
 
1) RabbitMQ 서버 만들기
docker-compose.yml 파일에서 rabbit 도커 이미지를 활용하여 컨테이너를 만든다. 5672포트는 송수신에 사용할 포트이고 15672는 관리 대시보드 접근용 포트이다.

chapter-5/example-3/docker-compose.yml

 
2) RabbitMQ 대시보드 살펴보기
대시보드 로그인 : guest / guest
대시보드에는 queue에 얼마나 많은 메시지가 쌓여있는지 얼마나 빠르게 전송되는지 등 상태를 확인할 수 있다. 대시보드 접근은 위 도커 컴포즈 파일에 대시보드 접근용 포트인 15672의 외부 포트인 300번 포트로 접근하면 된다.

$ cd example-3
$ docker compose up --build
RabbitMQ 대시보드

 
3) 마이크로서비스의 message queue 연결
Histrory 마이크로서비스에서 Rabbit 환경변수를 활용해서 RabbitMQ에 접근한다.

chapter-5/example-3/history/src/index.js

 
4) history 마이크로서비스를 위해 docker-compose.yml 설정
docker-compose.yml 파일에서 rabbit 연결을 위해 amap라이브러리와 대시보드를 연결하고 db와 rabbit이 실행되기 전까지 history 마이크로서비스가 실행되지 못하도록 한다. (depends_on)
 
또한 RabbitMQ 서버가 준비가 안 된 상태에서 마이크로서비스가 연결을 하려고 하면 오류가 발생하기 때문에 RabbitMQ 서버가 준비가 됐는지 기다리는 명령어를 dockerfile에 추가한다. (wait-port 추가)
 
지금까지 RabbitMQ 서버와 환경변수, 에러처리 등을 설정해주었다면 queue를 어떻게 처리할지 뒤에서 두 가지 방식으로 설명한다. (단일 수신자 / 다중 수신자)

(좌) docker-compose.yml (우) dockerifle

✅ 단일 수신자를 위한 간접 메시징

오직 하나의 마이크로서비스만이 메시지를 수신할 수 있는 방식이다. 작업을 마이크로서비스 풀에 "분배"할 때 유용하며 처리할 수 있는 첫 번째 마이크로서비스만이 처리한다.
 
 
1) 단일 수신자 메시지 받는 history의 코드

  1. 메시지를 가져올 때, Queue를 확보하기 (assert)
  2. 확보된 queue에서 메시지를 소비 (consume) - viewed에서 consumeViewedMessage를 꺼내서 소비
chapter-5/example-3/history/src/index.js

 
2) 단일 수신자 메시지를 보내는 video-streaming의 코드
이름이 viewed인 queue를 지정해서 json으로 변환한 jsonMsg를 버퍼에 넣어 publish 호출

video-streaming/src/index.js

 
단일 수신자 메시지 테스트 & RadditMQ를 통해 메시지 송수신이 잘 이루어졌는지 확인

 


 다중 수신 메시지

 
하나의 마이크로서비스가 메시지를 보내면 다수의 마이크로서비스가 수신

 
 
1) 다중 수신자로 전송된 메시지 받기 (history)

  1. 단일 수신자와 다르게 queue를 확보하는 것이 아니라 Exchange(교환기)를 확보한다.
  2. anonymous(익명) queue를 확보한다.
  3. viewed 메시지와 익명 queue를 바인드하고 queue로부터 메시지를 읽어온다.

 
 
2) 다중 수신용 메시지 보내기 (video-streaming)

  1. viewed 큐 대신에 viewed exchange를 확보한다.
  2. viewed 큐 대신에 viewed exchange를 지정해 메시지를 publish한다. (첫 번째 인자가 exchange)
exchange 확보
exchange에 publish

 

http://&lt;IP주소&gt;:3001/video