Spring Config를 이용하면서 장점은 모든 서비스의 설정을 하나의 서버에서 관리할 수 있다. 였지만 단점으로는 서버의 설정 값이 변경되면 모든 서버를 재부팅하거나 모든 서버의 refresh를 주어야 설정을 변경할 수 있었다. 그런 귀찮은 점을 개선하기 위한 기술이 Spring Cloud Bus인데 또 이 기술을 사용하기 위해서는 AMQP(Advanced Message Queuing Protocol)이라는 메세지 큐잉 프로토콜을 사용하여야한다. 유명한 프로젝트로는 RabbitMQ, Kafka 등이 있지만 대용량 처리나 속도보다는 정확성이 더 중요한 설정이니 RabbitMQ를 사용하여 진행해보려고 한다.
참고로 Mac이 아닌 Window에서 진행하는 것이므로 Mac의 경우 다른 사용법을 검색해서 사용하는 걸 추천한다.
RabbitMQ는 Erlang이란 언어로 실행되는 프로젝트이기 때문에 Erlang을 설치해주어야한다.
Erlang 설치 페이지에 접근하여
windows installer를 눌러 설치를 한다.
Erlang 23.1 버전은 현재 rabbitmq와 버전이 맞지 않아서 사용할 수 없다 23.2버전 이상으로 사용하는 것을 추천한다.
설치 완료 후 환경변수로 설치된 폴더를 추가해준다.
참고로 환경변수를 Path에 넣어줘야한다. 나처럼 아무 생각 없이 Intellij나 다른 변수에 추가하지말길 바란다...
RabbitMQ 설치 페이지에 접근하여
window용으로 설치를 진행한다.
설치가 완료되면 서비스에서
실행중인것을 확인할 수 있다.
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
의 내용을 gateway
와 user-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 값도 변경된 값을 확인할 수 있다.