Spring Cloud Bus (with RabbitMQ)

정권호·2022년 3월 12일
0

Spring-MSA

목록 보기
2/2
post-thumbnail

지난 문제점

지난 글 Spring Cloud Config 에서 설정파일을 수정했을 때 변경 사항이 반영 되지 않았던 문제는 해결했지만 여러개의 서버의 설정 파일들의 변경 사항을 동시에 반영하는 문제는 해결 하지 못했었습니다.

이 문제를 Spring Cloud Bus를 이용하여 문제를 해결해보겠습니다.


Spring Cloud Bus란?

  • 분산 시스템의 노드(Application)를 경량 메시지 브로커와 연결 시켜줍니다.
  • 상태 및 구성에 대한 병경 사항을 연결된 노드에게 전달해줍니다.

아래 그림 처럼 AMQP 를 이용하여 변경 사항들을 일괄적으로 각 Config Client에 적용시켜보겠습니다.

Message Boker

메시지 브로커에는 크게 두가지가 있는데 다음과 같음 특징들이 있습니다.

AMQP

  • Advanced Message Queuing Protocol 이라고 하여, 메시지 지향 미들웨어를 위한 개방형 표준 응용 프로토콜
  • 메시지 지향, 큐잉, 라우팅(P2P, Publisher-Subcriber), 신뢰성 보안
  • Erlang, RabbitMQ 에서 사용

Kafka 프로젝트

  • Apache Software Foundation이 Scalar 언어로 개발한 오픈 소스 메시지 브로커 프로젝트
  • 분산형 스트리밍 플랫폼
  • 대용량 데이터를 처리 가능한 메시징 시스템

RabbitMQ vs Kafka

RabbitMQ

저는 이번에 RabbitMQ 를 이용하여 각 서버에 변경 사항을 한번에 적용시켜보겠습니다.

설치

저는 MacOs 로 작업을 하고 있기 때문에 MacOs 기준으로 진행하겠습니다.
brew 를 이용하여 아래와 같이 명령어를 입력하여 설치해줍니다.

$ brew update
$ brew install rabbitmq

실행

아래 명령어를 입력하여 rabbitMQ 를 실행시켜 줍니다.

$ export PATH=$PATH:/usr/local/sbin

$ rabbitmq-server

http://localhost:15672 로 접속하시면 다음과 같이 로그인 페이지가 나오고 usernamepasswordguest 를 입력하여 로그인 할 수 있습니다.

RabbitMQ 적용

RabbitMQ 를 적용하기 앞서 설정 파일의 변경사항이 여러 서버에 동시에 적용되는지 확인을 하기위해 하나의 Config Client 을 더 생성해줍니다.

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>

bootstrap.yaml 작성

Config Server 를 설정해주고 가져올 설정파일을 작성해줍니다.

spring:
  cloud:
    config:
      uri: http://localhost:8888
      name: ecommerce

Controller 작성

다른 서버와 마찬가지로 환경설정 파일을 확인할 수 있는 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.yml 작성

모든 Applicationapplication.yml 파일에 해당 정보를 작성해줍니다.

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    
management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans, busrefresh

Spring Cloud Bus 테스트

Git Repository

Git Repository를 다음과 같이 구성해줍니다.

ecommerce.yml

설정 파일 변경전

새로 추가한 Config Client 에는 http://localhost:8000/health_check (Apigateway Service) 기존에 있던 Config Client 에는 http://localhost:8811/health_check (User Service) 요청을 각각 보내면 다음과 같은 화면이 나옵니다.

Apigateway Service

User Service

설정 변경 테스트

아래 처럼 설정 파일들을 변경해줍니다.

ecoomerce.yml

user-service.yml

변경사항 적용

변경사항을 적용 하기위해 http://localhost:8000/actuator/busrefresh 로 post 요청을 보내보겠습니다. (post로 요청을 보내야하기 때문에 Postman을 이용하였습니다.)

Actuator 로 변경사항을 업데이트 해주고 http://localhost:8000/health_check (Apigateway Service) 로 요청을 보내면 다음과 같이 변경사항이 적용 됬음을 알 수 있습니다.

다른 Config ClientActuator 로 변경사항을 업데이트 해주지 않아도 http://localhost:8811/health_check (User Service) 로 요청을 보내면 다음과 같이 변경사항이 적용 됬음을 알 수 있습니다.

마치며

이전글에서 Config Sever 를 이용하는 Application 들의 변경사항이 일괄적으로 적용되지 않았던 문제를 Spring Cloud Bus 를 이용하여 해결하였습니다.

profile
머라도 해봐요

0개의 댓글