[Spring Boot & MSA] Spring Cloud Bus - Dynamic Configuration Updates

원알렉스·2020년 7월 29일
1

Spring Boot MSA

목록 보기
4/12
post-thumbnail

깃허브 소스코드
Udemy 강의

Spring Cloud Bus란?

  • Spring Cloud Bus 는 분산 시스템에 존재하는 노드들을 경량 메시지 브로커(RabbitMQ, Kafka etc)와 연결하는 역할을 합니다.
  • 구성 변경과 같은 상태변경, 기타관리 등을 브로드캐스트하는데 사용이 가능합니다.
  • Private Git Repository에서의 변경 사항들을 마이크로 서비스들이 실행중이면서도 업데이트를 적용시켜 줍니다.

Kakao-Talk-20200729-154542136

사용하는 이유

  • 사용하지 않을 때의 문제점
    • 서비스가 첫 실행 할때에만 프로퍼티들을 가져옵니다.
    • 그래서 각 마이크로 서비스들이 실행 중일 때 Git Repository의 내용을 변경할 경우,
    • 마이크로 서비스들을 재실행 하지 않는 이상 업데이트된 프로퍼티를 가져올 수 없습니다.

Solution

  • Spring Cloud Bus를 사용해서 마이크로 서비스들이 실행 중일 때에도 변경 사항들을 push 할 수 있도록 해줍니다.
  • 각 서비스에 Spring Cloud Bus와 Spring Boot Actuator dependency들을 추가해줘서 listener(subscriber)로 등록을 해줘서 Config Server로부터 업데이트를 전달받을 수 있도록 해줍니다.
  • Messaging 기술로 인해서 업데이트를 listener들한테 브로드캐스팅해줍니다.
  • 이때 사용하는 프로토콜이 AMQP(Advanced Message Queuing Protocol) 입니다.

RabbitMQ

  • 이때 사용할 메시지 브로커는 RabbitMQ입니다.
  • Messaging 과정에서 중재자 역할을 합니다.
  • 애플리케이션에게 메시지를 전송하고 얻을 수 있는 플랫폼을 제공해줍니다.

Spring Boot Actuator

  • /bus-refresh 엔드포인트를 활성화하기 위해 사용해줍니다.

Kakao-Talk-20200729-165800263

전반적인 메시징 과정

  • 원격 저장소의 프로퍼티들을 업데이트한 후에, Spring Cloud Bus한테 subscribe된 마이크로 서비스들에게 업데이트를 브로드캐스트 해줘야 한다고 알려줘야 합니다.
  • 이때 HTTP POST 방식으로 /bus-refresh로 요청을 보내주면 브로드캐스팅을 해주게 됩니다.

Config Server 환경 구축

의존성 설정

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

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

/bus-refresh 엔드포인트 활성화(application.yml)

management:
  endpoints:
    web:
      exposure:
        include: bus-refresh

RabbitMQ 프로퍼티 설정(application.yml)

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

Config Client 환경 구축

의존성 설정

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

RabbitMQ 프로퍼티 설정(원격 저장소 내의 application.yml)

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
profile
Alex's Develog 🤔

0개의 댓글