지난 글 Spring Cloud Config 에서 설정파일을 수정했을 때 변경 사항이 반영 되지 않았던 문제는 해결했지만 여러개의 서버의 설정 파일들의 변경 사항을 동시에 반영하는 문제는 해결 하지 못했었습니다.
이 문제를 Spring Cloud Bus를 이용하여 문제를 해결해보겠습니다.
- 분산 시스템의 노드(Application)를 경량 메시지 브로커와 연결 시켜줍니다.
- 상태 및 구성에 대한 병경 사항을 연결된 노드에게 전달해줍니다.
아래 그림 처럼 AMQP 를 이용하여 변경 사항들을 일괄적으로 각 Config Client에 적용시켜보겠습니다.
메시지 브로커에는 크게 두가지가 있는데 다음과 같음 특징들이 있습니다.
- Advanced Message Queuing Protocol 이라고 하여, 메시지 지향 미들웨어를 위한 개방형 표준 응용 프로토콜
- 메시지 지향, 큐잉, 라우팅(P2P, Publisher-Subcriber), 신뢰성 보안
- Erlang, RabbitMQ 에서 사용
- Apache Software Foundation이 Scalar 언어로 개발한 오픈 소스 메시지 브로커 프로젝트
- 분산형 스트리밍 플랫폼
- 대용량 데이터를 처리 가능한 메시징 시스템
저는 이번에 RabbitMQ 를 이용하여 각 서버에 변경 사항을 한번에 적용시켜보겠습니다.
저는 MacOs 로 작업을 하고 있기 때문에 MacOs 기준으로 진행하겠습니다.
brew 를 이용하여 아래와 같이 명령어를 입력하여 설치해줍니다.
$ brew update
$ brew install rabbitmq
아래 명령어를 입력하여 rabbitMQ 를 실행시켜 줍니다.
$ export PATH=$PATH:/usr/local/sbin
$ rabbitmq-server
http://localhost:15672 로 접속하시면 다음과 같이 로그인 페이지가 나오고 username 과 password 에 guest 를 입력하여 로그인 할 수 있습니다.
RabbitMQ 를 적용하기 앞서 설정 파일의 변경사항이 여러 서버에 동시에 적용되는지 확인을 하기위해 하나의 Config Client 을 더 생성해줍니다.
저는 간단하게 Apigateway 라는 프로젝트를 생성하였습니다.
다른 Config Clinet 처럼 의존성을 추가해줍니다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
Config Server 를 설정해주고 가져올 설정파일을 작성해줍니다.
spring:
cloud:
config:
uri: http://localhost:8888
name: ecommerce
다른 서버와 마찬가지로 환경설정 파일을 확인할 수 있는 Controller 를 생성해줍니다.
이제 RabbitMQ 를 사용하는 모든 Application 에 공통적으로 해당 의존성을 추가해줍니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
모든 Application의 application.yml 파일에 해당 정보를 작성해줍니다.
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: refresh, health, beans, busrefresh
Git Repository를 다음과 같이 구성해줍니다.
새로 추가한 Config Client 에는 http://localhost:8000/health_check (Apigateway Service) 기존에 있던 Config Client 에는 http://localhost:8811/health_check (User Service) 요청을 각각 보내면 다음과 같은 화면이 나옵니다.
아래 처럼 설정 파일들을 변경해줍니다.
변경사항을 적용 하기위해 http://localhost:8000/actuator/busrefresh 로 post 요청을 보내보겠습니다. (post로 요청을 보내야하기 때문에 Postman을 이용하였습니다.)
Actuator 로 변경사항을 업데이트 해주고 http://localhost:8000/health_check (Apigateway Service) 로 요청을 보내면 다음과 같이 변경사항이 적용 됬음을 알 수 있습니다.
다른 Config Client 에 Actuator 로 변경사항을 업데이트 해주지 않아도 http://localhost:8811/health_check (User Service) 로 요청을 보내면 다음과 같이 변경사항이 적용 됬음을 알 수 있습니다.
이전글에서 Config Sever 를 이용하는 Application 들의 변경사항이 일괄적으로 적용되지 않았던 문제를 Spring Cloud Bus 를 이용하여 해결하였습니다.