[MSA] Spring Cloud (Cloud bus,RabbitMQ 이용한 Config 정보 반영)

이민우·2024년 1월 24일
1

Spring Boot

목록 보기
19/20

참고 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

해당 포스팅은 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의를 듣고 정리한 글입니다. 실습 환경을 따라하시려면 이전 글에 나온 실습을 진행하시고 해당 포스팅을 읽는 것을 추천드립니다.

외부 Config 정보 바꾸기는 3가지가 있다.

  • 서비스 재기동
  • Actuator refresh
  • Spring cloud bus

이전 포스트는 Actuator refresh까지 설명하였다.
Actuator refresh는 어플리케이션 서버가 1~2개면 문제가 되지 않지만 수백개의 서비스가 있을경우 각각의 어플리케이션마다 다 refresh를 수동으로 해줘야 하기 때문에 번거롭고 매우 귀찮은 일이다

이점을 보완하기 위해서는 Spring cloud bus를 사용하면 된다. 이 방법은 한쪽에서 refresh를 config와 연결된 모든 서비스를 refresh를 해주는 방법이다.

상태 및 구성에 대한 변경사항을 연결된 노드에게 전달한다. (Broadcast)

Spring Cloud Bus란?

Spring Cloud Bus 는 분산 시스템 환경, 마이크로서비스 환경에서 각각의 노드나 서비스를 연결시켜주는 경량 메시지 브로커이다.

Spring Cloud Bus 를 이용한다면 Configuration 들을 Broadcast 하게 변경 사항을 적용시킬 수 있다.

Spring Cloud Bus 는 SpringBoot Application 에 부착되어 설정 정보를 지속적으로 반영할 수 있게 한다.

더 쉽게 이해하기 위해서 아래 설정 정보 적용 과정을 함께 따라가보자.

설정 정보 적용 과정

설정 정보가 적용되는 과정은 다음과 같다.

참고 : https://wonit.tistory.com/512
  • 개발자는 configuration file 을 remote repository 에 push 한다.
  • Spring Cloud Bus 가 Message Broker 로 변경된 설정 정보에 대한 Message 를 발행한다.
  • Message Broker는 설정 정보를 저장하고 있는다.
  • 개발자가 설정 정보가 변경되었음을 Config Server 에게 알려준다.
  • Message Broker 가 해당 메시지를 Subscribing 하고 있는 Application 들 에게 Broadcasting 한다.
  • 각각의 Application 은 Spring Cloud Bus 가 받은 설정 정보를 반영한다.

구현방법

  • AMQP : 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜
    메시지 지향, 큐잉, 라우팅, 신롸성, 보안
    Erlang, RabbitMQ에서 사용

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

메시지 큐잉서비스

  • RabbitMQ ( 적은 수의 데이터 안전 )

    • 메시지 브로커

    • 초당 20+ 메시지를 소비자에게 전달

    • 메시지 전달 보장, 시스템 간 메시지 전달

    • 브로커, 소비자 중심

  • Kafka ( 대용량 )

    • 초당 100k+ 이상의 이벤트 처리

    • pub/sub, Topic에 메시지 전달

    • Ack를 기다리지 않고 전달 가능

    • 생산자 중심

결과로 HTTP POST/busrefresh 를 통해 연결된 모든 노드들을 refresh한다.

만약 user-service의 설정정보가 바꼈다고하면 아무서버에서 /busfresh를 하면 연결된 모든 노드를 refresh를 한다.

🐰 RabbitMQ를 통한 구현

설치 방법(mac os 기준)

brew install rabbitmq

설치가 되면 (보통 설치 경로: /usr/local/sbin)
나는 /opt/homebrew/opt/rabbitmq/sbin

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

설치된 경로에서

rabbitmq-server

실행시키고 접속하게 되면 아래화면이 뜬다.

초기

  • id : guest
  • pw : guest

모든 서비스에는 해당 디펜던시를 추가한다. (config, gateway, user등등)
Maven 기준

     <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

또한 연결된 모든 노드에 rabbitmq 설정정보를 추가합니다.

  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

추가로 actuator 의 end point에 busrefresh를 추가해준다.

management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans, http, busrefresh, info, metrics, prometheus

모든 설정을 마쳤으면 마이크로 서비스를 유레카에 올리고
테스트를 해보자!

Spring Cloud Bus 테스트(busrefresh)

기존 유저서비스의 config 파일 내용은 아래 사진과 같다

테스트를 위해 token.secret의 값을 변경해보자

  • 변경


Postman을 통해 요청을 보낸뒤에 확인해면

변경된것을 확인 할 수있다.

profile
백엔드 공부중입니다!

0개의 댓글

관련 채용 정보