Spring Cloud Config Server를 등록해서 외부에서 환경 설정을 설정하고 그것을 적용하는 방법들 3가지에 대하여 알아보았다. 그중에 마지막에 적어놨던 Spring Cloud Bus 에 대하여 알아보자
👄 Spring Cloud Bus
기존에 사용하던 actuator는 각각의 서비스가 공통된 환경설정을 가지고 있다면 환경 설정을 변경한 후에 모든 서비스에 actuator/refresh라는 요청을 전달해서 서비스의 환경 설정을 해주는 것으로 이해했습니다. 하지만 이것은 서비스가 늘어나면 늘어날수록 굉장히 비효율적인 것을 확인 할 수 있다.
그래서 MSA 구조에서micro 서비스를 메세지 브로커와 연결해주는 역할과 상태 및 구성에 대한 변경사항을 연결된 모든 microservice에게 전달해주는 프레임워크인 Spring Cloud Bus 가 나타났다
메세지 브로커
publisher로부터 전달받은 메세지를 consumer에게 전달해주는 중간 역할이며 응용 소프트웨어 간에 메세지를 교환할 수 있게 만들어준다. 이떄, 메세지가 저장되는 공간을 메세지 큐(Message Queue)라고 하며, 메세지의 그룹을 topic 이라고 부른다. 이떄 메세지를 교환 할 때 HTTP를 사용하지 않고 AMQP라는 메세지 지향 프로토콜을 사용하게 된다.
- 언어 설명
- publisher : 메세지를 보내는 곳
- Exchange : publisher로부터 메세지를 수신한다. 그리고 이용할 메세지 큐에 특정한 조건으로 전달한다.
- direct : 정해진 이름에 정확한 큐에 메세지를 전달 ( 유니캐스트 )
- topic : 일정한 패턴을 통해 원하는 큐에 메세지를 전달 ( 멀티 캐스트 )
- fanout : 들어온 요청을 전부 큐에 전달 ( 브로드 캐스트 )
- headers : 값을 key 와 value로 저장하여 x-match를 통해 전부 맞게 할지 부분만 맞게 할지 설정 가능
- Queue : 메세지를 저장하고 Consumer 에게 메세지를 전달한다.
AMQP
메세지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜이다. 메세지 지향 미들웨어느 응용 소프트웨어간의 데이터 통신을 위한 소프트웨어이다. 많은 메세지 지향 미들웨어가 메세지 큐 시스템을 기반으로 구현되어 있다.
즉, 메세지 지향 미들웨어를 사용하여 데이터 통신을 하기 위해 사용되는 프로토콜이다. 해당 프로토콜을 RabbitMQ와 Erlang이 있다.
RabbitMQ
이번 과정에서는 RabbitMQ를 사용해본다. 설치는 방법을 다루는 글은 아니다. 대신 아주 잘 정리된 글을 남겨둔다
https://oingdaddy.tistory.com/165
Windows10에 RabbitMQ 빠르게 설치하기 (with Erlang), 그리고 RabbitMQ management 띄우기
MSA 프로젝트를 준비하며 여러가지 준비사항이 있지만 느슨한 결합을 위해 MQ (Message Queue) 가 필요하다. 여러가지 이런 메세징 기능이 있는 툴이 있지만 RabbitMQ를 일단 사용해보려한다. 어떻게 설
oingdaddy.tistory.com
설치 완료 후 localhost:15672 화면
이렇게 화면이 진행되고 username과 password는 기본적으로 guest 로 설정되어 있기 때문에 들어가면된다. 로그인까지 완료된 화면은 이렇게 표현되어 있다.
👄 Kafka VS RabbitMQ
RabbitMQ
- 작은 데이터를 안전하게 전달한다.
- 메세지 브로커를 이용한다
- 초당 20+ 메세지를 소비자에게 전달한다
- 메세지 전달을 보장하고 시스템 간 메세지를 전달한다
- 브로커와 소비자가 중심이 된다.
kafka
- 대용량의 데이터를 빠른 시간내에 처리하기 위한 솔루션이다
- 초당 100K+ 이상의 이벤트를 처리한다
- public/sub, Topic(저장소)에게 메세지 전달
- Ack을 기다리지 않고 전달이 가능하다
- 보낸 사람이 중심이다.
👄 Config 설정
- Config, apigateway, 각 서비스들의 라이브러리에 추가
- amqp
- config 서버에는 actuator 의존성을 넣어주어야 한다.
- config, apigateway, 각 서비스들에게 설정한 RabbitMQ를 application.yml파일에 등록해주어야 한다.
spring:
application:
name: 서버 or 서비스 이름
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
...
management:
endpoint:
web:
exposure:
include: refresh, health, beans, httptrace, busrefresh
- 웹 브라우저의 RabbitMQ 접속 초트 번호는 15672 지만 시스템에서 접근하는 포트값은 5672이다.
👄 Test 해보기
● 기본 설정 확인
- 우선 로그인을 진행하고 토큰값을 받아온다
- 해당 토큰값을 통해 health_check를 하면 정상적으로 받아오는 것을 확인 할 수 있다.
● 설정 변경 (with. busrefresh)
- config 서버에 등록된 파일의 application.yml 파일에서 토큰값을 변경해주고 config 설정 파일을 열면 변경된것을 확인 할 수 있다. Native 설정을 쓰고 있기 떄문에 따로 해주지 않아도 자동으로 잡는다.
- 하지만 중요한 것은 정작 다른 서비스들에겐 등록이 되지 않았다는 것이다. 때문에 토큰값이 반영이 안된 것을 알 수 있다.
- 그래서 actuator의 busrefresh 기능을 이용해 POST 방식으로 전달을 하게하여 설정 정보를 변경해보자
- 이렇게 잠시 기다리면 204 라는 No Content 라는 반환값을 가진 내용으로 반환되는 것을 알 수 있다.
- 다시 토큰을 확인해보면 변경이 되었는지 안되었는지 확인 할 수 있다.
● 변경된 설정 확인
- 위에 사진을 보면 오로지 userservice 내용만 busrefresh 를 통해 전달한 것을 확인 할 수 있다. 하지만 RabbitMQ로 인해 다른 서비스에도 모두 적용되었다면 로그인과 health-check가 모두 정상적으로 작동 할 것이고 또한 토큰이 변경되어 있어야 한다.
- 이렇게 변경된 모습을 볼 수 있다. 즉, actuator 를 통해 userservice 의 설정 정보를 변환하면 RabbitMQ가 해당 요청을 전달받아 메세지 큐에 담아 연결된 다른 모든 서비스에도 전달하는 것을 볼 수 있다.
'MSA' 카테고리의 다른 글
👨👧👦 micrometer 와 metric (0) | 2024.04.12 |
---|---|
👨👧👦 Kafka 와 JDBC Connect 설치 및 환경 확인 (0) | 2024.04.09 |
👨👧👦 MSA에 대해.. (0) | 2024.03.25 |
👨👧👦 AntiFragile 과 Cloud Native(feat. 12Factors) (0) | 2024.03.25 |