반응형

 

 

 

이전 포스팅에서는 Spring Configuration Server를 구축하여, Microservice들의 설정들을 중앙에서 효율적으로 관리할 수 있도록 만들어 보았었다. 해당 내용과 이어지는 내용이므로, 앞의 포스팅을 보지 못했다면 보고 오는 것을 권장한다.

 

 

 

https://sjh9708.tistory.com/123

 

[Spring Cloud] Microservice(MSA) 구축 : (4) Spring Cloud Config Server 구축

이전 포스팅에서는 여러개의 Microservice를 만들고, Spring Cloud Gateway와 Registry Server를 구축하여보았었다. 이번 포스팅에서는 Spring Configuration Server를 구축하여, Microservice들의 설정들을 중앙에서 효

sjh9708.tistory.com

 

 

 

 

Config Server의 설정 구성요소가 변경되었을 때  actuator의 refresh를 통해서, 동적으로 구성 요소들을 로드할 수 있고, 이 때 Configuration Server의 내용을 다시 가져오게 된다. 따라서 Actuator를 이용한 동기화가 가능하다고 언급하였었다. 

 

하지만 Config Server의 구성 내용이 변할 때 마다 Microservice들을 일일이 Actuator refresh 해주어야 한다. 즉, Microservice들의 구성원들과 인스턴스들이 매우 많고 복잡한 경우 수동으로 해줄 수 없다는 한계점이 있었다.

 

그래서 이번 포스팅에서는 Microservice들을 경량 메시지 브로커와 연결, 상태 및 구성에 대한 변경 사항을 노드들에게 전달할 수 있도록 Spring Cloud Bus를 사용하여, 경량 메시지 브로커인 RabbitMQ와 연결시켜보도록 하겠다.


 

 

Spring Cloud Bus

 

 

Spring Cloud Bus는 메시징 시스템을 사용하여 분산 환경에서 애플리케이션들 간에 이벤트를 전달하도록 지원하는 모듈이다. 주로 AMQP(Advanced Message Queuing Protocol) 기반의 메시지 브로커(예: RabbitMQ)를 통해 메시지를 전송한다.

 

  • Spring Cloud Bus는 분산 시스템에서 마이크로서비스 간에 이벤트를 전파하고 메시지를 브로드캐스트하는 역할을 하며.
  • 각 서비스 및 구성 서버가 Spring Cloud Bus를 사용하려면 메시지 브로커(예: RabbitMQ, Kafka 등)에 연결되어 있어야 한다.

 

RabbitMQ

 

 

  • 메시지 브로커로서 메시지를 전송하고 수신하는 역할을 한다.
  • AMQP(Advanced Message Queuing Protocol)를 기반으로 하며, 다양한 프로토콜과 통합되어 있어 유연하게 사용될 수 있다.
  • AMQP : 메시지 지향 미들웨어를 위한 개방형 표준 응용계층 프로토콜. 메시지 지향, 큐잉, 라우팅(P2P, Pub-Sub), 신뢰성, 보안

 

이벤트 기반 아키텍처 : RabbitMQ는 이벤트 기반 아키텍처를 지원하여 시스템 간의 이벤트 전달을 효과적으로 처리할 수 있습니다. 이벤트 기반 아키텍처는 시스템의 다양한 구성 요소 간에 발생하는 이벤트를 통해 통신하고, 느슨하게 결합된 시스템을 구축할 수 있게 한다.

 

메시지 큐 : RabbitMQ는 메시지 큐 시스템으로 사용된다. 메시지 큐는 Producer & Consumer 간의 통신을 중개하고 비동기적으로 작업을 처리할 수 있도록 한다.

 

Pub/Sub (Publish/Subscribe):  Consumer가 특정 이벤트 또는 메시지에 대해 동시에 Subscribe(구독)할 수 있도록 한다. 이를 통해 발생한 메시지를 여러 Consumer에게 전달할 수 있다.

 

 

 

 

메시지 브로커로서 RabbitMQ는 현재도 상위권의 수요율을 가지고 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 


Spring Cloud Bus 파이프라인

다음은 나름대로 정리해 본 Spring Cloud Bus의 작동 과정이다.

 

우선 Configuration Server, Microservices, Spring Cloud Gateway 등은 Spring Cloud Bus 사용을 위해 RabbitMQ에 연결되여 Node로서 등록되어 있으며, Event를 수신할 준비가 되어 있다.

 

1. Configuration Server는 Webhook 등을 통해 Config의 변화를 감지했다고 가정한다.

2. 갱신 이벤트를 Spring Cloud Bus를 통해 전달한다. (/actuator/busrefresh 요청을 통해서)

3. 메시지 브로커(RabbitMQ)는 연결된 모든 다른 노드들에게 Refresh Message를 전송시킨다.

4. Message를 받은 노드들은 설정이 변경되었음을 전달받는다.

5. 각각의 노드들은 /actuator/refresh 엔드포인트를 호출하여 Config Server로부터 환경설정 구성요소를 업데이트받는다.

 

 


 

RabbitMQ 설치 및 구동하기

 

brew install rabbitmq
rabbitmq-server

 

 

 

 

 

15672번 포트는 관리자 페이지로서 RabbitMQ의 UI를 제공해준다.

대시보드를 살펴보면 Listening Port에서 AMQP의 포트는 5672번임을 알 수 있고, Microservice들과 Config Server가 해당 포트로 Connection되어야 한다는 것을 확인할 수 있다.

 

 

 

 


ConfigService 재작성

 

pom.xml

<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>

 

1. spring-cloud-starter-bus-amqp : RabbitMQ와 Spring Cloud Bus를 통해 Connection하기 위한 의존성 추가

2. spring-boot-starter-actuator : Configure 서버의 변화가 일어났을 때 Actuator를 통해 다른 노드들에게 메시지를 전송하기 위함

 

 

▶ application.yml

server:
  port: 8887
spring:
  application:
    name: config-service
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
  cloud:
    config:
      server:
        native:
          search-locations: file://${home}/Documents/GitHub/MSA_Native_repo
        git:
          uri: https://github.com/Jaehwi-So/MSA_Study.git
management:
  endpoints:
    web:
      exposure:
        include: health, busrefresh
logging:
  level:
    com.example.configservice: DEBUG

 

1. spring.rabbitmq : RabbitMQ와의 Connection 설정

2. management.endpoints.web.exposure.include : busrefresh를 엔드포인트로 사용할 수 있도록 추가. 해당 액츄에이터의 기능을 사용하면 RabbitMQ에 변화를 통보할 수 있게 된다.

 

 

 

 

 


UserService, ApiGatewayService 재작성

 

 

 pom.xml

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

 

 

 application.yml

#...

spring:
  application:
    name: user-service
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

#...

management:
  endpoints:
    web:
      exposure:
        include: refresh

 

 

 


테스트

 

Actuator Refresh만을 이용하게 되면 Config Server의 구성 내용이 변할 때 마다 Microservice들을 일일이 refresh 해주어야 한다는 한계점이 있었다. 

Spring Cloud Bus와 Message 브로커로서 RabbitMQ를 도입하였던 목적은, 한 곳에서만 변화를 감지하게 된다면, 나머지 Microservice의 구성 요소 서비스들이 모두 새로운 Config 구성 요소들을 Refresh할 수 있도록 하자는 것이었다.

 

 

 

 

 

1, 2번 과정에 해당하는 내용이다. 변화 감지를 했다고 가정하고, Configuration Server에서 actuator/busrefresh 요청을 날리게 되면 Spring Cloud Bus를 통해 RabbitMQ의 메시지 큐에 전달되고 다른 노드들에게 메시지가 발송되게 된다.

 

 

 

 

 요청 시 RabbitMQ의 Message Queue가 변화하는 모습을 확인할 수 있다.

 

 

 

 

 

 

 

3, 4, 5번에 해당되는 내용들이다. Message를 전달받아서, 각각의 노드들은 /actuator/refresh 요청을 Configuration Server로 날리게 된다. 이를 통해 각각의 MSA들은 변경된 설정 구성 요소들을 가져와 반영하게 된다.

 

즉, UserService와 ApiGatewayService는 별 다른 작업을 하지 않았는데도 새로운 Config 설정값을 Configuration server에서 얻어와 반영되었다는 것이다.

 

 

 

 

 

 

 

반응형

BELATED ARTICLES

more