[โ๏ธ Spring Cloud] Spring Cloud Config ๊ฐ๋ ๋ฐ ์ ์ฉ ๋ฐฉ๋ฒ
๊ฐ๊ฐ์ 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
- Microservice ์ฌ๊ธฐ๋ : ๊ฐ์ฅ ๋จ์ํ์ง๋ง ์ฌ์ฉ X
- Actuator Refresh : /actuator/refresh ์๋ํฌ์ธํธ ์ฌ์ฉ โ ํด๋น ์์ ์์๋ ์ด ๋ฐฉ๋ฒ ์ฌ์ฉ ์์ !
- 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/