인프런의 "Spring Cloud로 개발하는 마이크로서비스" 강의를 보고 작성되었습니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4
저번 포스팅에서는 microservice에 사용되는 config를 외부에 있는 시스템으로 관리를 했고, 이때 변경 사항을 적용하기 위해 actuator의 refresh를 사용했습니다.
refresh를 사용하면 변경 사항에 대해 각각의 microservice에서 refresh를 호출해줘야 합니다.
따라서 이번에는 효율적으로 변경 사항을 관리하기 위해 Spring Cloud Bus를 사용합니다.
이번 프로젝트에서 RabbitMQ 메시지 브로커를 통해 Spring Cloud Bus를 구현합니다.
- MQ (Message Queue)
메시지 지향 미들웨어 (MOM : Message Oriented Middleware)를 구현한 시스템으로 프로그램, 프로세스 간의 데이터를 교환할 때 사용하는 기술입니다.
- 메시지 지향 미들웨어란?
응용 소프트 웨어 간 비동기 메시지 통신을 위한 소프트웨어로, 메시지 전달 과정에서 라우팅, 보관 등이 가능합니다.모든 요청을 서버로 보내는 것이 아니라 Message Queue에 보내면 서버에서는 큐에서 가져와 처리합니다.
이때, 메시지 지향 미들웨어를 위한 표준 응용 계층 프로토콜인 AMQP(Advanced Message Queuing Protocol)를 사용합니다.
간단하게 AMQP에 대해 살펴보면 Queue, Exchange, Binding으로 구성됩니다.
저번 포스팅에 작성된 것처럼 깃이나 native 파일에서 Config 서버로 저장된 데이터를 가져옵니다.
HTTP POST /busrefresh를 호출하면 해당하는 Cloud Bus에 연결된 microservice에게 변경된 사항을 push 해주는 방식입니다.
RabbitMQ를 사용하기 때문에 로컬 환경에 RabbitMQ 설치를 진행했고, 이에 따른 과정은 이번 포스팅에서 생략했습니다.
Config, User Service, Api Gateway의 각 서버에 Spring Cloud Bus Dependency를 추가해 줬습니다.
yml 파일에 rabbitMq 설정을 추가해 주었고, 밑에 endpoints에 busrefresh를 추가했습니다.
Dependency와 동일하게 Config, User Service, Api Gateway의 각 서버에 변경 사항을 적용했습니다.
서버 실행 시 RabbitMq가 동작하는 모습을 볼 수 있습니다.
Postman으로 먼저 token secret값을 확인한 후 변경 후 busrefresh를 적용해 다시 확인해봅니다.
위와 같이 token secret이 변경된 모습을 볼 수 있습니다.
이러한 변경 사항은 user service 뿐만 아니라 api gateway에도 적용이 됩니다.
- Connection Refuse 에러 발생 시
위와 같은 에러가 발생한다면 5672번 포트에 실행 중인 프로세스가 없다고 나옵니다.
따라서 5672번 포트에 대한 방화벽을 열어주고 다시 5672번 포트의 프로세스가 실행 중인지 다시 확인합니다.