[Spring Boot] Spring Cloud Config(4) Spring cloud bus - MSA(6)

모지리 개발자·2022년 9월 28일
0

MSA

목록 보기
9/9
post-thumbnail

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
를 수강하면서 작성한 글입니다.

Intro


이전 글(Actuator)에서는 Config server에 어떤 값을 변경했을 때 각각의 서비스가 갱신 된 설정 정보를 가져가기 위해서 Actuator를 사용하여 변경된 정보를 반영 할 수 있도록 하였습니다. 이번 글에서는 Spring Cloud Bus를 이용하여 변경된 설정정보를 각각의 서비스들이 반영할 수 있도록 해보겠습니다.

Spring cloud Bus란?

Spring cloud bus는 동적으로 config 변경을 적용하기 위한 MQ(Message Queue) Handler 입니다.
이번 글에는 rabbitMQ를 통해 설정값을 반영하도록 하겠습니다.

Spring cloud bus는 다음과 같은 기능을 합니다.

  • MQ(Message Queue)에 Publisher(=config server)와 Subscriber를 등록
  • config 변경 정보를 MQ에 전송
  • 각 마이크로서비스에서 config 동적 반영

동작방식

Spring cloud bus는 상태 및 구성에 대한 변경사항을 연결된 노드들(마이크로 서비스)에게 전달하는 역할을 합니다.
그리고 각각의 노드(마이크로서비스)들은 경량 메시지 브로커와 연결되어 있는 상태여야합니다.

  • POST 방식으로 /busrefresh 를 호출
    - 근데 어디에 호출해야할까?
    어떤 서비스든 상관없다. Spring Cloud Bus에 연결된 누구에게라도 호출을 하게되면 다른 서비스에게 까지 전달이 된다.
    예를 들어 위의 사진을 바탕으로
    ex) USER SERVICE에 /busrefresh를 호출하게 되면 ORDER SERVICE, CATALOG 서비스에도 반영이 된다.

Rabbit MQ 설치

mac 기준
우선 homebrew를 설치합니다. 그 후 아래 명령어를 입력해줍니다.

$ brew update
$ brew install rabbitmq
$ rabbitmq-server

rabbitMQ local에 접속합니다.

위와 같은 화면이 잘 나왔다면 정상적으로 실행 된 것 입니다.
default username, password는 둘다 guest 입니다.

Code

Config Server, Micro service(user service, Api gateway service...) - build.gradle
의존성 추가

implementation "org.springframework.cloud:spring-cloud-starter-bootstrap"
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'

AMQP(Advanced Message Queuing Protocol)란?

메세지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜

  • 메시지 지향, 큐잉, 라우팅, 신뢰성, 보안
  • Erlang, RabbitMQ에서 사용

config server, microservice - application.yml

server:
  port: 8888

spring:
  application:
    name: config-service
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
  cloud:
    config:
      server:
        git:
          uri: file:///Users/{파일경로}

management:
  endpoints:
    web:
      exposure:
        include: health, busrefresh

Test 해보기

  1. 기존 데이터 확인해보기
  2. user-service/health_check 호출

    기존데이터 잘 출력되고 있습니다.

데이터 변경해보기

test 방법
1. apigateway 서버에 busrefresh 호출

  1. user-service health_check를 통해 user-service에도 변경된 값이 적용되었는지 확인

apigateway 서버에서 actuator/busrefresh를 호출했지만 user-service에서도 변경된 값이 잘 적용된 것을 볼 수 있습니다.

결론

Spring Cloud Bus를 통해 각각의 서비스를 개별적으로 호출하여 refresh시켜줘야했던 actuator의 단점을 보완하여 Message Queue를 통해 값이 변경되고 변경된 것을 하나의 서비스에만 적용해도 다른 서비스에 모두 적용된 것을 알 수 있습니다. 이렇게 Message Queue 방식을 이용해서 서비스를 구축한다면 유지보수에 큰 장점이 있을 것 같습니다.
하지만 한편으로는 너무 자동화..? 되어있어서 어떤 서비스에 반영되는지 정확히 알고싶을 때에는 문서화 혹은 모니터링 툴이 필요하다는 생각이 들었습니다.

profile
항상 부족하다 생각하며 발전하겠습니다.

0개의 댓글