Spring Framework/โ˜๏ธ Spring Cloud

[โ˜๏ธ Spring Cloud] Spring Cloud Config ๊ฐœ๋… ๋ฐ ์ ์šฉ ๋ฐฉ๋ฒ•

soogoori 2023. 11. 27. 01:33

 

๊ฐ๊ฐ์˜ Microservice๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ตฌ์„ฑ์ •๋ณด ํŒŒ์ผ(.yml)๋“ค์ด ์ˆ˜์ •๋œ๋‹ค๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•ด์•ผํ•œ๋‹ค. 

 

์ด์™€ ๊ฐ™์€ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ๋œ์–ด๋‚ด๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ์ •๋ณด ํŒŒ์ผ์„ ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌ์‹œํ‚จ๋‹ค๋ฉด ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๊นŒ์ง€ ๋ชจ๋“  ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์„ค์ •์„ ์œ„ํ•œ ์„œ๋ฒ„๋ฅผ ๋ณ„๋„๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ์‹คํ–‰ ์ค‘์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„œ๋ฒ„์—์„œ ์„ค์ • ์ •๋ณด๋ฅผ ํŒŒ์•…ํ•ด ๊ฐฑ์‹ ์‹œํ‚ค๋ฉด ๋นŒ๋“œ์™€ ๋ฐฐํฌ ์—†์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค !

 

โ“ Spring Cloud Config ๋ž€?

Spring Cloud Config๋Š” ๋ถ„์‚ฐ์‹œ์Šคํ…œ์—์„œ ์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ์— ํ•„์š”ํ•œ ์„ค์ •์ •๋ณด(application.yml)๋ฅผ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ด์ฃผ๋Š” ์‹œ์Šคํ…œ์ด๋‹ค. 

 

์ค‘์•™ํ™”๋œ ์ €์žฅ์†Œ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ์„ค์ •์„ ์ผ๊ด„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ ํ™˜๊ฒฝ๋งˆ๋‹ค DB ๋˜๋Š” Gateway IP ์ฃผ์†Œ ๋“ฑ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— DEV-UAT-PROD ํ™˜๊ฒฝ์— ๋งž๋Š” ๊ตฌ์„ฑ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

๐Ÿ”น ๊ตฌ์„ฑ์ •๋ณด Storage ์†”๋ฃจ์…˜

  • Private/Public Git Repository (remote / local) โž” ์˜ˆ์ œ์—์„œ๋Š” ์ด ๋ฐฉ๋ฒ• ์‚ฌ์šฉ ์˜ˆ์ • !
  • Secure Vault
  • Secure File Storage

 

 

์˜ˆ์ œ๋ฅผ ํ™œ์šฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ˆˆ์— ๋ณด์ž๋ฉด ์œ„์™€ ๊ฐ™๋‹ค.

 

์›๋ž˜ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋˜ application.yml์—์„œ ํŠน์ •ํ•œ ๋ถ€๋ถ„์„ ๋–ผ์–ด๋‚ด์–ด ๋ณ„๋„์˜ ๊ณต์šฉ ์„œ๋ฒ„ ๊ฐ™์€ ์—ญํ• ์„ ํ•ด์ฃผ๋Š” Spring Cloud Config Server๋ฅผ ์ด์šฉํ•ด ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค. 

 

์˜ˆ์ œ์—์„œ๋Š” Authentication/Authorization(JWT ๋ฐฉ์‹)์—์„œ ์‚ฌ์šฉ๋˜๋Š” token.secret์„ ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌํ•˜์—ฌ ๋‹ค๋ฅธ microservices์—์„œ๋„  ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ๋ณผ ๊ฒƒ์ด๋‹ค. 

 

 

 

Spring Cloud Config ์—ฐ๋™ํ•˜๊ธฐ

 

โ˜๏ธ config-service ํ”„๋กœ์ ํŠธ

 

1๏ธโƒฃ Dependencies ์ถ”๊ฐ€

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

 

2๏ธโƒฃ @EnableConfigServer ์ถ”๊ฐ€

๐Ÿ‘‰ ํ˜„์žฌ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” Spring Boot ํ”„๋กœ์ ํŠธ๊ฐ€ Configuration Server ์—ญํ• ๋กœ ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ช…์‹œ

@SpringBootApplication
@EnableConfigServer
public class ConfigServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServiceApplication.class, args);
    }
}

 

3๏ธโƒฃ application.yml ์ถ”๊ฐ€ 

๐Ÿ‘‰ ๋ชจ๋“  ์„œ๋น„์Šค์—์„œ config ์ •๋ณด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก yml ํŒŒ์ผ ์ž‘์„ฑํ•˜๊ธฐ 

server:
  port: 8888

spring:
  application:
    name: config-service
  cloud:
    config:
      server:
        git:
          uri: https://github.com/soogoori/spring-cloud-config
#          ๋งŒ์•ฝ private์œผ๋กœ repository ์ƒ์„ฑํ•  ์‹œ username, password ์ž‘์„ฑ
#          username: [my_username]
#          password: [my_pwd]

 

 

ecommerce๋กœ ์‹œ์ž‘ํ•˜๋Š” yaml ํŒŒ์ผ๋“ค์€ application.yml ์—์„œ ๋–ผ์–ด๋‚ธ ํŠน์ •ํ•œ ์ •๋ณด๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 

๊ธฐ์กด application.yml์— ์žˆ๋˜ ์ •๋ณด๋“ค์€ ์ง€์šฐ๊ณ  ecommerce.yml ํŒŒ์ผ์— ๋”ฐ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค. 

ํ•ด๋‹น ํŒŒ์ผ๋“ค์€ git repository์— ๋ณด๊ด€ํ–ˆ๋‹ค.

 

ecommerce.yml

token:
  expiration_time: 86400000
  secret: my_token_default

gateway:
  ip: 192.168.219.105

โ˜๏ธ user-service ํ”„๋กœ์ ํŠธ 

 

1๏ธโƒฃ Dependencies ์ถ”๊ฐ€

 

๐Ÿ‘‰ spring-boot-starter-actuator : application ์ƒํƒœ, ๋ชจ๋‹ˆํ„ฐ๋ง โž” ๋‹ค์–‘ํ•œ ์—”๋“œํฌ์ธํŠธ๋กœ ์ƒํƒœ๊ฐ’ ํ™•์ธ 

 

/actuator/refresh ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด user microservice๋ฅผ ์žฌ๋ถ€ํŒ…ํ•˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝํ•œ ์ •๋ณด ๋ฐ˜์˜ํ•˜๋„๋ก ํ•œ๋‹ค.

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

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

 

 

2๏ธโƒฃ bootstrap.yml ์ถ”๊ฐ€

๐Ÿ‘‰ application.yml ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„ ๋†’๊ณ , ์ฝ์–ด์˜ค๊ณ ์ž ํ•˜๋Š” configuration ์ •๋ณด ์œ„์น˜๋ฅผ ๋ช…์‹œํ•œ๋‹ค.

name์€ configuration server๊ฐ€ ์ฝ์–ด์˜ค๊ณ ์ž ํ•˜๋Š” ๊ตฌ์„ฑํŒŒ์ผ ์ •๋ณด์ด๋‹ค. 

spring:
  cloud:
    config:
      uri: http://127.0.0.1:8888
      name: ecommerce

 


๐Ÿ’ก ์„ค์ • ํŒŒ์ผ ๋‚ด์šฉ ๋ณ€๊ฒฝ ์‹œ Refresh 

  1. Microservice ์žฌ๊ธฐ๋™ : ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜์ง€๋งŒ ์‚ฌ์šฉ X
  2. Actuator Refresh : /actuator/refresh ์—”๋“œํฌ์ธํŠธ ์‚ฌ์šฉ โž” ํ•ด๋‹น ์˜ˆ์ œ์—์„œ๋Š” ์ด ๋ฐฉ๋ฒ• ์‚ฌ์šฉ ์˜ˆ์ • !
  3. Spring Cloud Bus : ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์™€ ์—ฐ๊ฒฐํ•ด์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค์„ ๋…ธ๋“œ์—๊ฒŒ ์ „๋‹ฌ โž” RabbitMQ, Kafka

์šฐ์„  ํ•ด๋‹น ์˜ˆ์ œ์—์„œ๋Š” 2๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๊ณ , ๊ทธ ํ›„ 3๋ฒˆ์งธ๋ฅผ ํ™œ์šฉํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค. 

 

 

 

POST /actuator/refresh ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ๋œ token ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ์‹œ์ผœ ๋ฐ˜์˜ํ•œ๋‹ค. 

 

 

 

Profiles ์‚ฌ์šฉํ•˜์—ฌ Configuration ์ ์šฉํ•˜๊ธฐ

 

application-name ๋’ค์— ๋‹ค์–‘ํ•œ ์„ค์ • ์ •๋ณด (dev, prod ๋“ฑ)์— ํ•ด๋‹นํ•˜๋Š” ์ด๋ฆ„์„ ๋ถ™์—ฌ yaml ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค๊ณ  ์ ์šฉ์‹œ์ผœ๋ณด์ž. 

application-name-<profile>.yml ๋กœ ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค. 

 

 

โ˜๏ธ user-service์—์„œ bootstrap.yml

spring:
  cloud:
    config:
      uri: http://127.0.0.1:8888
      name: ecommerce
  profiles:
    active: dev

 

โ˜๏ธ apigateway-service์—์„œ bootstrap.yml

spring:
  cloud:
    config:
      uri: http://127.0.0.1:8888
      name: ecommerce
  profiles:
    active: prod

 

๐Ÿ‘‰ ์œ„์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•œ ํ›„ ๋กœ๊ทธ์ธ์„ ํ•œ๋‹ค๋ฉด token ์ •๋ณด๋Š” ecommerce-dev.yml์— ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” my_token_dev์— ๋Œ€ํ•œ ํ† ํฐ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ณ , health_check๋ฅผ ํ•œ๋‹ค๋ฉด ecommerce-prod.yml์— ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” my_token_prod์— ๋Œ€ํ•œ ํ† ํฐ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. 

 

1์ฐจ์ ์œผ๋กœ AuthorizationHeaderFilter๋ฅผ ๊ฑฐ์น  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ ์ •๋ณด๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— 401 Unauthorized ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

 

 

 

 

 

์ฐธ๊ณ 

https://docs.spring.io/spring-cloud-config/docs/current/reference/html/ 

https://sergiomartinrubio.com/articles/centralized-configuration-with-spring-cloud-config-server/