ํด๋น ๊ธ์ Spring Cloud Config ์์ ๋ณ๊ฒฝ๋ ์ ๋ณด๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค ์ธ์คํด์ค์์ Spring Boot Actuator ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ํ๊ธฐ์ ์์กดํ๋ ๊ธ์ ๋๋ค. ์ค์ต ํ๊ฒฝ์ ๋ฐ๋ผํ์๋ ค๋ฉด ์ด์ ๊ธ์ ๋์จ ์ค์ต์ ๋ฐ๋ผํ์๊ธธ ๊ถ๊ณ ๋๋ฆฝ๋๋ค.
๋ชฉ์ฐจ
- ์ง๋ ์๊ฐ์ ์ค์ ์ ๋ณด ๋ฐ์ ๋ฐฉ๋ฒ
- Spring Boot Actuator ๋ฅผ ์ด์ฉํ ์ค์ ์ ๋ณด ๋ฐ์
- Spring Cloud Bus๋?
- RabbitMQ๋?
- Spring Cloud Bus ์ค์ตํ๊ธฐ
- RabbitMQ ๋ฑ๋ก
- Config, Gateway, User
- Cloud Bus ๋ฑ๋ก
- RabbitMQ ๋ฑ๋ก
์ง๋ ์๊ฐ์ ์ค์ ์ ๋ณด ๋ฐ์ ๋ฐฉ๋ฒ
์ง๋ ์๊ฐ ์ฐ๋ฆฌ๋ ์ค์ ์ ๋ณด๋ฅผ ์ธ๋ถ Repository ๋ก ๋ถ๋ฆฌํ๊ณ , ๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค๋ค์ด ํด๋น ์ค์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ๊ฐ๋ ์ค์ต์ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ์ ํ์๋ค.
- Spring Cloud Config๋ฅผ ์ด์ฉํด์ Github Repository ์ ์ฐ๋ํ์๋ค.
- Spring Boot Actuator ๋ฅผ ์ด์ฉํด์ http Endpoint ๋ก ์ค์ ์ ๋ณด๋ฅผ ๋ฐ์์์ผฐ๋ค.
๊ฐ๋จํ๊ฒ ์ง๋ ์๊ฐ์ ๋์ง์ด๋ณด์.
Config ์๋ฒ ์ธํ
์ง๋ ์๊ฐ๊น์ง ํ๋ ์์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- Service Mesh ์ธํ
- User & Team Microservices ๊ตฌํ
- ์ค์ ์ ๋ณด๋ฅผ ์ ์ฅํ Github Repository ์ค์
- Config Server ๊ตฌํ
Service Mesh ์ธํ
Config ์๋ฒ์ ์ค์ต ํ๊ฒฝ์ ์ํด์ ์ฐ๋ฆฌ๋ Service Mesh ๋ก Spring Cloud Gateway์ Spring Cloud Netflix Eureka ๋ฅผ ๊ฐ๊ฐ ๊ธฐ๋ํ์ฌ Service Discovery์ Gateway ๋ฅผ ๊ตฌํํ์๋ค.
์ด์ ๋ํด์ ๊ถ๊ธํ ์ฌํญ์ Spring Cloud Gateway ๋ฅผ ์ด์ฉํด API Gateway ๊ตฌ์ฑํ๊ธฐ์ Service Discover Server๋ก Netflix Eureka ์ด์ฉํ๊ธฐ ์์ ํ์ธํ ์ ์์ต๋๋ค.
Github Repository ์ธํ
์ฐ์ Github Repository์ Configuration ํ์ผ์ธ application.yml ํ์ผ์ ์ฌ๋ ค Config ์๋ฒ๊ฐ ํด๋น ๋ ํฌ์งํ ๋ฆฌ์ ์ ๋ณด๋ฅผ ๋ฐ์์ฌ ์ ์๊ฒ ์ธํ ํ์๋ค.
Config Server ์ธํ
Spring Cloud Config ๋ฅผ ์ด์ฉํด์ Configuration ์๋ฒ์์ ์ค์ ํ์ผ๋ค์ด ์๋ github ์ ์ฐ๋์์ผฐ๋ค.
User & Team Microservices ์ธํ
๊ทธ๋ฆฌ๊ณ User Service์ Team Servie ์์ Config ์๋ฒ์ ์ฐ๊ฒฐ์์ผ Config ์๋ฒ๊ฐ Github ์์ ๊ฐ์ ธ์จ ์ค์ ํ์ผ๋ค์ ๊ฐ๊ฐ์ ์๋น์ค์์ ๋ฐ์ ์ ์๋๋ก bootstrap.yml
ํ์ผ์ ์ ์ฉํ์๋ค.
์ด์ ๋ํด์ ๊ถ๊ธํ ์ฌํญ์ ์๋น์ค๋ฅผ ๋ง๋ค๋ฉฐ OpenFeign ๊ณผ RestTemplate ๋น๊ตํ๊ธฐ ์์ ํ์ธํ ์ ์์ต๋๋ค.
์ค์ ์ ๋ณด ๋ณ๊ฒฝํ๊ธฐ ๋ฐ ๋ฐ์ํ๊ธฐ
์ค์ ์ ๋ณด ๋ณ๊ฒฝํ๊ธฐ
์์ ์ธํ ์ ๋ชจ๋ ์ ์ฉํ๋ฉฐ ๊ฐ๊ฐ ์๋น์ค๋ค๊ณผ mesh ๋ฅผ ์คํ์์ผ๋ณด์.
๊ทธ๋ฆฌ๊ณ ์ค์ ํ์ผ ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊ฐ?
- ๋ณ๊ฒฝ ์ฌํญ :
test.message: this is version 1
->test.message: this is version 2
์ค์ ์ ๋ณด ๋ฐ์ํ๊ธฐ
์ด์ ๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค์์ ์ค์ ์ ๋ณด๋ฅผ ๋ฐ์ํ๊ธฐ ์ํด์ Spring Boot Actuator์ refresh ๊ธฐ๋ฅ์ ์ํด Postman ์ ๋ค์ด๊ฐ์
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค์ ์ฃผ์๋ก https://my-service/actuator/refresh
๋ช
๋ น์ ๋ณด๋ด๋ฉด ๋๋ค.
๊ทธ๋ผ ์ค์ ์ ๋ณด๊ฐ ๋ฐ์๋๋ค.
๋ฌธ์ ์
๊ทธ๋ผ ๊ธฐ์กด์ ๋ฐฉ์์ ๋ฌธ์ ์ ์ด๋ผ๋ฉด ๋ญ๊ฐ ์์๊น?
์๋ง ์ค์ ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ชจ๋ ์๋ฒ์์ actuator refresh ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ง๊ธ์ ์๋น์ค๊ฐ 2๊ฐ๋ฐ์ ์์ง๋ง ๋ง์ฝ ์๋น์ค๊ฐ 100๊ฐ ๋ผ๋ฉด? 1000๊ฐ๋ผ๋ฉด?? ๊ทธ๋ผ ์ผ์ผ์ด ํด๋น ์๋น์ค๋ค์ actuator๋ฅผ refresh ํด์ผ ํ๋ค.
Container Orchestration ์ด ๋์ ๋์ด Auto Scaling ๋๋ค๋ฉด ์ด ๋ฌธ์ ์ ์ ๋ ์ฌ๊ฐํด์ง๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ Spring Cloud Bus ๋์ ์ ๊ณ ๋ฏผํ ์ ์๋ค.
Spring Cloud Bus๋?
Spring Cloud Bus ๋ ๋ถ์ฐ ์์คํ ํ๊ฒฝ, ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์์ ๊ฐ๊ฐ์ ๋ ธ๋๋ ์๋น์ค๋ฅผ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ๊ฒฝ๋ ๋ฉ์์ง ๋ธ๋ก์ปค์ด๋ค.
Spring Cloud Bus ๋ฅผ ์ด์ฉํ๋ค๋ฉด Configuration ๋ค์ Broadcast ํ๊ฒ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉ์ํฌ ์ ์๋ค.
Spring Cloud Bus ๋ SpringBoot Application ์ ๋ถ์ฐฉ๋์ด ์ค์ ์ ๋ณด๋ฅผ ์ง์์ ์ผ๋ก ๋ฐ์ํ ์ ์๊ฒ ํ๋ค.
๋ ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ํด์ ์๋ ์ค์ ์ ๋ณด ์ ์ฉ ๊ณผ์ ์ ํจ๊ป ๋ฐ๋ผ๊ฐ๋ณด์.
์ค์ ์ ๋ณด ์ ์ฉ ๊ณผ์
์ค์ ์ ๋ณด๊ฐ ์ ์ฉ๋๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ๋ฐ์๋ configuration file ์ remote repository ์ push ํ๋ค.
- Spring Cloud Bus ๊ฐ Message Broker ๋ก ๋ณ๊ฒฝ๋ ์ค์ ์ ๋ณด์ ๋ํ Message ๋ฅผ ๋ฐํํ๋ค.
- Message Broker๋ ์ค์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์๋๋ค.
- ๊ฐ๋ฐ์๊ฐ ์ค์ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์์์ Config Server ์๊ฒ ์๋ ค์ค๋ค.
- Message Broker ๊ฐ ํด๋น ๋ฉ์์ง๋ฅผ Subscribing ํ๊ณ ์๋ Application ๋ค ์๊ฒ Broadcasting ํ๋ค.
- ๊ฐ๊ฐ์ Application ์ Spring Cloud Bus ๊ฐ ๋ฐ์ ์ค์ ์ ๋ณด๋ฅผ ๋ฐ์ํ๋ค.
์ฌ๊ธฐ์ Message Broker ๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅธ๋ค๋ฉด ํด๋น ๋ธ๋ก๊ทธ์ Message Oriented Middleware๊ณผ Message Broker์ ์ฐจ์ด ๋ฐ ์๋ฆฌ ์์ ํ์ธํ ์ ์๋ค.
ํ์ฌ ๋ค์ํ Message Broker ๊ฐ ์กด์ฌํ๋ค.
์ฐ์ ์ด๋ค ๋ฉ์์ง ๋ธ๋ก์ปค๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง๋ฅผ ์ ํํด๋ณด์
Message Broker ์ ํํ๊ธฐ
์ฐ๋ฆฌ์๊ฒ๋ ์ ํ์ง๊ฐ 2๊ฐ์ง๊ฐ ์๋ค.
- RabbitMQ
- Kafka
RabbitMQ
์ด๋น 20๊ฐ ์ด์์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ง ์คํ์์ค ๋ฉ์์ง ๋ธ๋ก์ปค์ด๋ค.
Point To Point Message Model์ Pub/Sub Message Model ๋ชจ๋๋ฅผ ์ง์ํ์ง๋ง Point To Point Message Model ์ด ๊ฐ์ฅ ์ ํฉํ๋ฉฐ ์ค์ ์ ๋ณด์ ๊ฐ์ ๊ฐ๋ณ๊ณ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ ์ ํฉํ๋ค.
Kafka
์ด๋น 10๋ง๊ฐ ์ด์์ด ๋ฉ์์ง, ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ง ์คํ์์ค ๋ฉ์์ง ๋ธ๋ก์ปค์ด๋ค.
Publisher๊ฐ Topic ์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๊ณ ํด๋น Topic์ ๊ตฌ๋
ํ๋ Subscriber ๊ฐ ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ ํํ๊ฐ ๋๋ค.
Kafka๋ ๋์ฉ๋ ์ด๋ฒคํธ๋ฅผ ๋ค๋ฃจ๊ธฐ์ ์ ํฉํ๊ธฐ ๋๋ฌธ์ ๋ณดํต Spring Cloud Bus ์์๋ RabbitMQ๋ฅผ ์ฌ์ฉํ๋ค.
์ ํ์ ๊ฒฝ๋ ๋ฉ์์ง ๋ธ๋ก์ปค์ธ RabbitMQ์ด๋ค!
RabbitMQ ์ค์นํ๊ธฐ
Rabbit MQ๋ฅผ ์ค์นํด๋ณด์.
ํ์ฌ ์ค์ต ์ด์์ฒด์ ๋ MacOS ์ด๋ฏ๋ก homebrew๋ฅผ ์ฌ์ฉํ๋ค.
$ brew update
$ brew install rabbitmq
$ export PATH=$PATH:/usr/local/sbin
$ rabbitmq-server
๋ง์ฝ RabbitMQ๋ฅผ ์ ์์ ์ผ๋ก ์คํํ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ด ํฐ๋ฏธ๋์ ๋์ค๊ฒ ๋๋ค.
์ค์ตํ๊ธฐ
์ด์ ์๊น ์์์ ๊ตฌ์ฑํ ๋ง์ดํฌ๋ก์๋น์ค ๊ตฌ์กฐ์์ ์ค์ ๋ก Configuration Server์ ๊ฐ๊ฐ Application ๋ค์ด Spring Cloud Bus๋ฅผ ์ด์ฉํด์ ์ค์ ์ ๋ณด๋ฅผ ๋ฐ์ํ๋ ์ค์ต์ ํด๋ณด์.
์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค์์ Spring Boot actuator์ Spring Cloud Bus ์์กด์ฑ์ ์ถ๊ฐํ๋ค.
- application.yml ํ์ผ์์ Spring Cloud Bus๊ณผ actuator ์ ๋ณด ์ถ๊ฐํ๊ธฐ
- Rabbit MQ -> Config Service -> Microservices ๋ฅผ ์ฐจ๋ก๋ก ์คํ์ํค๊ธฐ
- ์ค์ ํ์ผ ์์ ํ๊ณ github๋ก push ํ๊ธฐ
- Config Server์ Bus Refresh ํ๊ธฐ
- ํ ์คํธ
๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค์์ Spring Boot actuator์ Spring Cloud Bus ์์กด์ฑ ์ถ๊ฐํ๊ธฐ
Config ์๋ฒ์ Gateway ๋ฅผ ํฌํจํ ๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก ์๋น์ค์ 2๊ฐ์ ์์กด์ฑ์ ์ถ๊ฐ์์ผ์ฃผ์.
// Spring Cloud Bus + RabbitMQ
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'
// Spring Boot actuator
implementation 'org.springframework.boot:spring-boot-starter-actuator'
๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค์์ application.yml ํ์ผ์ ์์ ํด์ Spring Cloud Bus ๋ฅผ ์ฐ๊ฒฐ์์ผ์ค๋ค.
Config ์๋ฒ๊ฐ Github๋ก ๋ถํฐ ๋ฐ์ ์ค์ ์ ๋ณด๋ฅผ RabbitMQ์ push ํ๊ณ ๊ฐ๊ฐ์ ์๋ฒ๊ฐ ํด๋น Message๋ฅผ ์์ ํ๊ธฐ ์ํด์ ๋ชจ๋ ๋ง์ดํฌ๋ก์๋น์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด์ ๋ค์๊ณผ ๊ฐ์ ์ค์ ์ ๋ณด๋ฅผ application.yml ์ ์ถ๊ฐํ๋ค.
๋ํ actuator๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์ endpoint์ busrefresh๋ฅผ ์ด์ด์ฃผ์.
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: busrefresh
์์๋๋ก ์คํ์ํค๊ธฐ
RabbitMQ, Config Server, User, Team MSA ์์๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋์์ผ์ฃผ์.
์ค์ ํ์ผ ์์ ํ๊ณ github๋ก push ํ๊ธฐ
๊ธฐ์กด์ ์ฐ๊ฒฐ๋์ด์๋ github ์ ์ค์ ํ์ผ์ ์์ ํ์.
test:
message: this is version 3 update by using ampq-rabbitmq with spring cloud bus
๊ทธ๋ฆฌ๊ณ github๋ก push๋ฅผ ๋ณด๋ด์ฃผ์.
Config Server์ Bus Refresh ํ๊ธฐ
๋ง์ฝ Spring Cloud Bus ๋ฅผ ์ฌ์ฉํ์ง ์์๋๋ผ๋ฉด Config Server, User Server, Team Server ๋ฑ๋ฑ ๋ชจ๋ ์๋ฒ์๊ฒ actuator๋ก refresh ๋ช ๋ น์ ๋ณด๋ด์ผ ํ์ง๋ง, Spring Cloud Bus์ amqp๋ฅผ ์ฌ์ฉํ๋ฏ๋ก Config ์๋ฒ์๊ฒ๋ง busrefresh ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ชจ๋ ์๋ฒ๊ฐ consume ํ๊ฒ ๋์ด ์ค์ ์ ๋ณด๋ฅผ ๋ฐ์ํ ์ ์๊ฒ ๋๋ค.
์์ฒญ์ localhost:8888/actuator/busrefresh
๋ก ๋ณด๋ด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ผ ์์ ๊ฐ์ด 204 No Content ๋ก ์๋ต์ ๋ฐ๊ฒ ๋๊ณ ๊ฐ๊ฐ์ ์๋ฒ๋ ๋ฉ์์ง ๋ธ๋ก์ปค์ Broadcast์ ์ํด์ ์ค์ ์ ๋ณด๋ฅผ ๋ฐ์ ์ ์๊ฒ ๋๋ค.
์ค์ ๋ก๋ ์ ์ ์ฉ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋๊ธ