Spring Cloud Bus (RabbitMQ)

최준호·2022년 3월 9일
0

Microservice Architecture

목록 보기
22/32
post-thumbnail

Spring Config를 이용하면서 장점은 모든 서비스의 설정을 하나의 서버에서 관리할 수 있다. 였지만 단점으로는 서버의 설정 값이 변경되면 모든 서버를 재부팅하거나 모든 서버의 refresh를 주어야 설정을 변경할 수 있었다. 그런 귀찮은 점을 개선하기 위한 기술이 Spring Cloud Bus인데 또 이 기술을 사용하기 위해서는 AMQP(Advanced Message Queuing Protocol)이라는 메세지 큐잉 프로토콜을 사용하여야한다. 유명한 프로젝트로는 RabbitMQ, Kafka 등이 있지만 대용량 처리나 속도보다는 정확성이 더 중요한 설정이니 RabbitMQ를 사용하여 진행해보려고 한다.

참고로 Mac이 아닌 Window에서 진행하는 것이므로 Mac의 경우 다른 사용법을 검색해서 사용하는 걸 추천한다.

🔨Erlang 설치

RabbitMQ는 Erlang이란 언어로 실행되는 프로젝트이기 때문에 Erlang을 설치해주어야한다.

Erlang 설치 페이지에 접근하여

windows installer를 눌러 설치를 한다.

Erlang 23.1 버전은 현재 rabbitmq와 버전이 맞지 않아서 사용할 수 없다 23.2버전 이상으로 사용하는 것을 추천한다.

설치 완료 후 환경변수로 설치된 폴더를 추가해준다.

참고로 환경변수를 Path에 넣어줘야한다. 나처럼 아무 생각 없이 Intellij나 다른 변수에 추가하지말길 바란다...

🔨RabbitMQ 설치

RabbitMQ 설치 페이지에 접근하여

window용으로 설치를 진행한다.

이해가 어렵다면 여기 클릭하여 exe 파일 설치

설치가 완료되면 서비스에서

실행중인것을 확인할 수 있다.

Erlang 버전을 잘못 설치하여 RabbitMQ설치 후 오류가 난다면 Erlang을 버전업하여 설치한 뒤 RabbitMQ를 재설치하는 것을 추천한다.

RabbitMQ 또한 환경 변수로 추가해준다.

마지막으로 Management Plugin을 설치해주면 더 편하게 사용 가능한데

powershell을 열고

rabbitmq-plugins enable rabbitmq_management

명령어를 입력해주면 자동으로 설치된다.

http://127.0.0.1:15672 로 접속하면

다음 화면을 확인할 수 있고 아이디와 비밀번호는 guest로 기본 제공한다.

이 화면을 확인했다면 성공했다!

프로젝트에 적용하기

config server

<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>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

config server에 각 actuator, bus amqp, bootstrap의 의존성을 추가한다.

user-service gateway

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

두 서비스에도 amqp를 추가해준다

config server

server:
  port: 8888

spring:
  application:
    name: config-service
  rabbitmq: #rabbitmq 설정 추가
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
  cloud:
    config:
      server:
        git:
          uri: file://C:/2022/msa-config

management: #actuator 설정
  endpoint:
    web:
      exposure:
        include: health, busrefresh

config server의 yml설정 다음과 같이 수정해준다.

user-service gateway에도

  rabbitmq: #rabbitmq 설정 추가
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    
management: #actuator 설정
  endpoints:
    web:
      exposure:
        include: refresh, health, beans, busrefresh

설정을 위치에 알맞게 설정해주면 된다.

이제 서버들을 모두 실행해주면

다음과 같이 rabbitmq를 사용하며 서버가 실행되는 것을 확인할 수 있다.

token:
  expiration_time: 86400000
  secret: application_token

테스트를 위해 application.yml설정 파일을 하나 추가해준다. 그리고

spring:
  cloud:
    config:
      uri: http://127.0.0.1:8888
      name: config-service
#  profiles:
#    active: dev

기존의 bootstrap.yml의 내용을 gatewayuser-service 모두 다음과 같이 변경한 후 서버를 재실행해준다.

그 후에 기존에 만들어 두었던 health_check를 사용하면

변경된 내용을 확인할 수 있다.

그리고 새로 생성했던 application.yml의 내용을

token:
  expiration_time: 86400000
  secret: application_token_change_1

다음과 같이 수정하고

http://127.0.0.1:8888/config-service/default 접근시

변경된 내용이 바로 반영된것을 확인할 수 있다. 그 후 gateway token 유효성 체크에 브레이크 포인트를 걸어서 확인해보면

실제 서비스에는 변경된 토큰 값이 반영되지 않은 것을 확인할 수 있다.

이제 busrefresh를 통해 업데이트를 해보자 http 상태코드는 204로 반환되면 정상 실행된것이다.

user-service

user-service에서 정상적으로 실행된 로그를 확인할 수 있고

gateway

gateway에서도 정상 실행 로그를 확인할 수 있다.

이 로그들을 통해 user-service에만 전달한 busrefresh를 통해 모든 서비스에 자동으로 refresh가 전달되었음을 확인할 수 있다.

서비스들을 다시 실행해보자.

user-service에서 사용되는 로그인 요청이 token 값이 변경된 값으로 변경되었고

gateway에서 사용되는 token 값도 변경된 값을 확인할 수 있다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글