๋ชฉ์ฐจ


Spring Cloud Bus๊ฐ€ ์™œ ํ•„์š”ํ• ๊นŒ?

์•ž์„  ๊ธ€์—์„œ๋Š” ์Šคํ”„๋ง ์„ค์ •์ด ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ๋ฐฐํฌ ์—†์ด ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” Spring Cloud Config๋ฅผ ์ ์šฉํ–ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํด๋ผ์ด์–ธํŠธ์˜ ์„ค์ • ์ •๋ณด ๊ฐฑ์‹ ์ด ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค /actuator/refresh ์™€ ๊ฐ™์€ ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ํ™˜๊ฒฝ๊ณผ ๊ฐ™์€ ๋…๋ฆฝ๋œ ์ˆ˜๋งŽ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ์„ค์ • ์ •๋ณด์˜ ๊ฐฑ์‹ ์„ ์œ„ํ•ด ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋„ ๋ฒ„๊ฑฐ์šธ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์— Spring Cloud Bus๋ฅผ ์ ์šฉํ•˜๋ฉด ์„ค์ • ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•œ ๋ฒˆ์— ๊ฐฑ์‹ ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ์„œ๋ฒ„์— ๋Œ€ํ•ด refresh๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‹จ ํ•œ ๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ์—๋งŒ ํ˜ธ์ถœํ•˜๋ฉด ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐฑ์‹ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

2021๋…„ 1์›” ๋‚ด์šฉ ์ถ”๊ฐ€: ์Šคํ”„๋ง ๋ถ€ํŠธ 2.4 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ์ด ๊ธ€์˜ ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉ๋œ bootstrap.yml ํŒŒ์ผ์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธ€์˜ ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•œ โ€œ์„ค์ •๊ฐ’ ๊ฐฑ์‹ ์„ ์œ„ํ•œ actuator ์—”๋“œํฌ์ธํŠธโ€ bus-refresh๋„ busrefresh๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ๋Š” ์ƒ๋‹จ ๋ชฉ์ฐจ์˜ ๋„ค ๋ฒˆ์งธ ๊ธ€ โ€œSpring Boot 2.4 ๋ฒ„์ „์—์„œ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญโ€์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.



์–ด๋–ค ๊ตฌ์กฐ์ผ๊นŒ?

๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด์ž. ์•ž์„  ๊ธ€์˜ ๊ตฌ์กฐ์™€ ๋™์ผํ•˜๊ฒŒ ์„ค์ • ํŒŒ์ผ์€ Git ์ €์žฅ์†Œ์— ์œ„์น˜ํ•œ๋‹ค. config ์„œ๋ฒ„๋Š” Git ์ €์žฅ์†Œ์—์„œ ์ตœ์‹  ์„ค์ • ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ค‘์•™ ์ง‘์ค‘์‹ ์„œ๋น„์Šค๋กœ์„œ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌ๋™๋  ๋•Œ config ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์„ค์ • ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํด๋ผ์ด์–ธํŠธ๋Š” Spring Cloud Bus๋ฅผ ํ†ตํ•ด ์„œ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค. ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ๋Š” RabbitMQ์™€ Kafka ๊ฐ™์€ ๊ฒฝ๋Ÿ‰ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด๋ฒˆ ์˜ˆ์ œ์—์„œ๋Š” RabbitMQ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ(broadcast) ํ•œ๋‹ค.

spring cloud bus structure


ํ•œํŽธ ์„ค์ • ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•œ ํ›„ Git ์ €์žฅ์†Œ๋กœ push ํ–ˆ๋‹ค๋ฉด, ์„ค์ •๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์˜ actuator/bus-refresh ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ธฐ์กด ๊ตฌ์„ฑ๊ณผ์˜ ์ฐจ์ด๋Š” ๋‹จ ํ•˜๋‚˜์˜ ํด๋ผ์ด์–ธํŠธ๋งŒ ํ˜ธ์ถœํ•ด๋„ RabbitMQ๋กœ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—์„œ ์„ค์ •๊ฐ’์ด ๊ฐฑ์‹ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

config ์„œ๋ฒ„๋Š” Git ์ €์žฅ์†Œ์—์„œ ์ตœ์‹  ์„ค์ • ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ config ์„œ๋ฒ„ ์ž์ฒด๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. ์ดํ›„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ค์ • ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋ฉด ์ตœ์‹ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ์„ค์ • ์ •๋ณด๊ฐ€ ์ œ๊ณต๋œ๋‹ค.

์ด์ œ ์ง์ ‘ ์ฝ”๋“œ ์ž‘์„ฑํ•ด๋ณด๋ฉฐ Spring Cloud Bus๋ฅผ ํŒŒ์•…ํ•ด๋ณด์ž.

์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ๋ชจ๋‘ github์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธ€ ํ•˜๋‹จ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.



RabbitMQ ๊ตฌ์ถ•๊ณผ ์‹คํ–‰

RabbitMQ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์€ Docker๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰ํ•œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ํ•˜๋ฉด ๋˜๋Š”๋ฐ ์˜ต์…˜์„ ์‚ดํŽด๋ณด์ž. ์šฐ์„  RabbitMQ ์—ฐ๋™์€ 5672๋ฒˆ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ด์šฉํ•˜๋Š” ์–ด๋“œ๋ฏผ ํŽ˜์ด์ง€๋Š” 8087๋ฒˆ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์ธ์— ์‚ฌ์šฉ๋˜๋Š” ์•„์ด๋””๋Š” madplay์ด๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋™์ผํ•˜๋‹ค.

$ docker run -d --name rabbitmq \
    -p 5672:5672 -p 8087:15672 \
    -e RABBITMQ_DEFAULT_USER=madplay \
    -e RABBITMQ_DEFAULT_PASS=madplay \
    rabbitmq:management

์ •์ƒ์ ์œผ๋กœ ๊ตฌ๋™๋˜์—ˆ๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  http://localhost:8087๋กœ ์ ‘์†ํ•ด๋ณด์ž. ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋ณด์ผ ํ…๋ฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์šธ ๋•Œ ์‚ฌ์šฉํ•œ ๊ณ„์ • ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์„œ ๋กœ๊ทธ์ธํ•˜๋ฉด ๋œ๋‹ค.

rabbitmq admin page



Spring Cloud Config Client ์ˆ˜์ •

ํด๋ผ์ด์–ธํŠธ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด pom.xml์— ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. Spring Cloud Bus๋ฅผ ์œ„ํ•œ ์˜์กด์„ฑ์ด๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  application.yml ํŒŒ์ผ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค. ๋ฌผ๋ก  ์•ž์„  ์˜ˆ์ œ์ฒ˜๋Ÿผ bootstrap.yml๋กœ ์‚ฌ์šฉํ•ด๋„ ์‹คํ–‰๋˜์ง€๋งŒ ๊ธฐ๋Šฅ๊ณผ ํ•„์š”์— ๋”ฐ๋ผ ๊ตฌ๋ถ„ํ•ด๋ณด์ž. ๋”ฐ๋ผ์„œ ์ด๋ฒˆ ์˜ˆ์ œ์—์„œ๋Š” ์„ค์ •๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” ์—”๋“œ ํฌ์ธํŠธ ์„ค์ •์€ application.yml ์— ์ž‘์„ฑํ•œ๋‹ค.

server:
  port: 8089
spring:
  rabbitmq: # RabbitMQ ๊ด€๋ จ ์„ค์ •
    host: localhost
    port: 5672
    username: madplay
    password: madplay

management:
  endpoints:
    web:
      exposure:
        include: bus-refresh

๋‹ค์Œ์œผ๋กœ bootstrap.yml ํŒŒ์ผ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

spring:
  profiles: # ์—ฌ๊ธฐ์— ์ง€์ •ํ•ด๋„ ๋˜๊ณ , ์‹คํ–‰ํ•  ๋•Œ ์ง€์ •ํ•ด๋„ ๋œ๋‹ค.
      active: dev
  application:
    name: config
  cloud:
    config:
      uri: http://localhost:8088

์ˆ˜์ •์€ ๋๋‚ฌ๋‹ค. config ์„œ๋ฒ„๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.



ํ™•์ธํ•ด๋ณด๊ธฐ

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ค€๋น„๋Š” ๋ชจ๋‘ ๋๋‚ฌ๋‹ค. RabbitMQ์™€ Config ์„œ๋ฒ„ ๊ทธ๋ฆฌ๊ณ  Config ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž. bootstrap.yml์— active profiles์„ ์ง€์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋‹ค๋ฅธ ์˜ต์…˜์—†์ด ์‹คํ–‰ํ•ด๋„ ๋œ๋‹ค. ์ง์ ‘ ์ง€์ •ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” -Dspring.profiles.active=dev ์ฒ˜๋Ÿผ ๊ฐ’์„ ์ฃผ๋ฉด ๋œ๋‹ค. ๋˜๋Š” Intellij IDE๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด Run/Debug Configuration์˜ Active Profiles์— ์ง€์ •ํ•  ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

์ด๋ฒˆ ํ…Œ์ŠคํŠธ์—์„œ๋Š” RabbitMQ์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐฑ์‹ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด 2๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ๋™ํ•  ๊ฒƒ์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋„์šด ํ›„์— application.yml์˜ server.port ๋ถ€๋ถ„์„ 8086๋ฒˆ ํฌํŠธ๋กœ ์ˆ˜์ •ํ•˜์—ฌ ๋˜ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ๋™์‹œ์ผœ ๋ณด์ž. ์ฆ‰, ์•„๋ž˜์™€ ๊ฐ™์ด ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

  • 8086๋ฒˆ ํฌํŠธ: Config ํด๋ผ์ด์–ธํŠธ 2
  • 8087๋ฒˆ ํฌํŠธ: RabbitMQ
  • 8088๋ฒˆ ํฌํŠธ: Config ์„œ๋ฒ„
  • 8089๋ฒˆ ํฌํŠธ: Config ํด๋ผ์ด์–ธํŠธ 1


2๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ชจ๋‘ ์ •์ƒ์ ์œผ๋กœ ๊ตฌ๋™๋˜๋ฉด RabbitMQ ์–ด๋“œ๋ฏผ ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด์„œ ์ •์ƒ ์—ฐ๊ฒฐ๋๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋จผ์ € Exchanges ํƒญ์—์„œ springCloudBus๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ๊ณผ Connection ํƒญ์—์„œ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

rabbitmq


์„ค์ •๊ฐ’ ๋ณ€๊ฒฝ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์ „์— ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐ๊ฐ ํ˜ธ์ถœํ•ด์„œ ํ˜„์žฌ์˜ ๊ฐ’์„ ํ™•์ธํ•ด๋ณด์ž.

$ curl -X GET "http://localhost:8089/dynamic"

# ๊ฒฐ๊ณผ
{
  "profile": "I'm dev taeng",
  "comment": "Hello! updated dev taeng!!!"
}

$ curl -X GET "http://localhost:8086/dynamic"

# ๊ฒฐ๊ณผ
{
  "profile": "I'm dev taeng",
  "comment": "Hello! updated dev taeng!!!"
}

๋‘ ๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๊ณ  ์žˆ๋‹ค. ๊ฐ’์„ ํ™•์ธํ–ˆ๋‹ค๋ฉด Git Repository์— ์žˆ๋Š” config-dev.yml ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•ด๋ณด์ž. github๋ฅผ ํ†ตํ•ด์„œ ๋ฐ”๋กœ ์ง„ํ–‰ํ•ด๋„ ๋˜๊ณ , ๋กœ์ปฌ์—์„œ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•œ ํ›„์— commit ํ›„ push ํ•ด๋„ ๋œ๋‹ค.

taeng:
  profile: I'm dev taeng
  comment: Hello! updated by Spring Bus.

๊ทธ๋ฆฌ๊ณ  ํด๋ผ์ด์–ธํŠธ ํ•˜๋‚˜์—๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค. ๊ธฐ์กด ๋ฐฉ์‹์ด๋ผ๋ฉด ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์— ๊ฐฑ์‹  ์š”์ฒญ์„ ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด์ œ๋Š” ํ•˜๋‚˜์˜ ํด๋ผ์ด์–ธํŠธ๋งŒ ํ˜ธ์ถœํ•ด๋„ RabbitMQ๋กœ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐฑ์‹ ๋œ๋‹ค.

์—ฌ๋Ÿฌ ๋Œ€๋กœ ๊ตฌ์„ฑ๋œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ชจ๋‘ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค.

$ curl -X POST "http://localhost:8089/actuator/bus-refresh"

์ด์ œ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

$ curl -X GET "http://localhost:8089/dynamic"

# ๊ฒฐ๊ณผ
{
  "profile": "I'm dev taeng",
  "comment": "Hello! updated by Spring Bus."
}

$ curl -X GET "http://localhost:8086/dynamic"

# ๊ฒฐ๊ณผ
{
  "profile": "I'm dev taeng",
  "comment": "Hello! updated by Spring Bus."
}

๊ทธ๋ ‡๋‹ค! ํ•˜๋‚˜์˜ ํด๋ผ์ด์–ธํŠธ์—๋งŒ ๊ฐฑ์‹  ์š”์ฒญ์„ ํ–ˆ์ง€๋งŒ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๊นŒ์ง€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์„ค์ •๊ฐ’์ด ์ตœ์‹ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€ ๋„์ž…๋ถ€์—์„œ ๋ณด์•˜๋˜ ๊ตฌ์กฐ์ฒ˜๋Ÿผ Spring Cloud Bus์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—์„œ ์„ค์ •๊ฐ’ ๊ฐฑ์‹ ์„ ์œ„ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์œผ๋ฉฐ @RefreshScope ์–ด๋…ธํ…Œ์ด์…˜์ด ๋‹ฌ๋ฆฐ ๋ชจ๋“  ๋นˆ(Bean)์€ ๊ฐฑ์‹  ์ด๋ฒคํŠธ์— ์˜ํ•ด config ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ตœ์‹  ์„ค์ •๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.

์ด ๊ณผ์ •์€ Spring Cloud Bus๋ฅผ ํ†ตํ•ด ์„ค์ •๊ฐ’์ด ๊ฐฑ์‹ ๋  ๋•Œ, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

# Server ๋กœ๊ทธ
Fetched for remote master and found 1 updates
The local repository is dirty or ahead of origin. Resetting it to origin/master.
Reset label master to version AnyObjectId[52c3482316dd84c80f3a29fb7ba899548c7a4b2b]
Adding property source: file:/var/folders/7b/4vlwnfvd5r54h9fdd89qtnqm0000gn/T/config-repo-10779098978969336911/config-dev.yml
Adding property source: file:/var/folders/7b/4vlwnfvd5r54h9fdd89qtnqm0000gn/T/config-repo-10779098978969336911/config-dev.yml

# Client1 ๋กœ๊ทธ
Fetching config from server at : http://localhost:8088
Located environment: name=config, profiles=[dev], label=null, version=52c3482316dd84c80f3a29fb7ba899548c7a4b2b, state=null
Located property source: [BootstrapPropertySource {name='bootstrapProperties-configClient'},
    BootstrapPropertySource {name='bootstrapProperties-https://github.com/madplay/spring-cloud-config-repository/config-dev.yml'}]
The following profiles are active: dev
Started application in 1.982 seconds (JVM running for 316.229)
Received remote refresh request. Keys refreshed [config.client.version, taeng.comment]

# Client2 ๋กœ๊ทธ
Fetching config from server at : http://localhost:8088
Located environment: name=config, profiles=[dev], label=null, version=52c3482316dd84c80f3a29fb7ba899548c7a4b2b, state=null
Located property source: [BootstrapPropertySource {name='bootstrapProperties-configClient'},
    BootstrapPropertySource {name='bootstrapProperties-https://github.com/madplay/spring-cloud-config-repository/config-dev.yml'}]
The following profiles are active: dev
Started application in 1.06 seconds (JVM running for 794.7)
Received remote refresh request. Keys refreshed [config.client.version, taeng.comment]



๋งˆ์น˜๋ฉฐ

์ฒ˜์Œ ๊ธ€์—์„œ๋Š” Spring Cloud Config๋ฅผ ์ด์šฉํ•˜์—ฌ ์„ค์ • ํŒŒ์ผ์„ ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋นŒ๋“œ, ๋ฐฐํฌ ์—†์ด๋„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Spring Cloud Bus๋ฅผ ํ†ตํ•ด ์„ค์ •๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถˆํŽธํ•จ์„ ์—†์• ๋ณด์•˜๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์„ค์ •๊ฐ’์ด ๊ฐฑ์‹ ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ๋ถˆํŽธํ•˜๋‹ค๊ณ  ๋А๋‚„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜ธ์ถœ์กฐ์ฐจ ์—†์•จ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ? ์ด์–ด์ง€๋Š” ๊ธ€์—์„œ ์„ค์ • ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณธ๋‹ค.



์˜ˆ์ œ ์†Œ์Šค ์ฝ”๋“œ

์ด๋ฒˆ ๊ธ€์—์„œ ์‚ฌ์šฉํ•œ ์†Œ์Šค ์ฝ”๋“œ๋Š” ๋ชจ๋‘ ์•„๋ž˜ ์ €์žฅ์†Œ์— ์žˆ์Šต๋‹ˆ๋‹ค.