Spring Cloud Config 는 분산 시스템 환경에서 환경설정을 외부로 분리시켜 관리하는 기능을 제공함.
Config Server 를 사용하게 되면 개발, 테스트, 프로덕션 등에 대한 App 의 속성을 한 장소에서 관리하게 됨.
장점
- 설정 관리가 분산되지 않는다.
- 추가 설정으로 운영 중 서버를 빌드하거나 배포하지 않고 환경설정 변경가능함.
기능
Spring Cloud Config Server => 설정파일 배달
- properties , yml 파일 을 위한 HTTP Resource 기반 API
- 속성 값 암호화와 복호화
- @EnableConfigServer 로 Boot App 에 적용가능
Config Client => 설정파일 사용
- Config Server 에 묶여 원격 속성 소스로 Spring 환경 초기화
- 속성 값 암호화, 복호화
구성
- 필요의존 : org.springframework.cloud:spring-cloud-config-server
plugins {
id 'org.springframework.boot' version '2.3.7.RELEASE'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}
group = 'com.study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "Hoxton.SR9")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-config-server'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
test {
useJUnitPlatform()
}
- application.yml
- 기본 브랜치 이름은 master 로 잡혀있으니 리포지토리 생성시 Root Branch 이름은 반드시 master 로 잡아야 검색된다.
spring:
application:
name: {configServiceId}
cloud:
config:
server:
git:
uri: {remote.property.source.uri} # git repository 주소
username: {username}
password: {password}
server:
port: 8888
# Eureka(service discovery)를 사용할 경우 아래 설정 추가
eureka:
client:
serviceUrl:
defaultZone: {eurekaServerUrl}
enabled: true
- @EnableConfigServer 추가
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
호출 양식은 /ServiceID/profile 로 호출되며 json 형태를 가진다.
Spring Cloud Config Client
- 필요의존 : org.springframework.cloud:spring-cloud-starter-actuator / o.s.c:spring-clould-starter-config
plugins {
id 'org.springframework.boot' version '2.3.7.RELEASE'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}
group = 'com.study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "Hoxton.SR9")
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-config'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
test {
useJUnitPlatform()
}
- actuator 는 /refresh 엔드포인트를 위해 사용된다.
- Spring Cloud Config Client 의 환경설정 파일은 원격 설정 저장소(GitHub) 으로 이동시킨다.
Client 의 application.yml 은 삭제, bootstrap.yml 파일을 생성하여 기본 값들을 기록한다.
application.yml => 유심히 보자.
spring:
application:
name: config-client
cloud:
config:
discovery:
enabled: true
service-id: CONFIG-SERVER
# profiles:
# active: test 해당 프로파일을 엑티브 시키면 Git Repository 에 있는 config-client-test.yml이 실행
server:
port: 8771
eureka:
client:
service-url:
defaultZone: ${EUREKA_SERVER_LIST:http://localhost:8761/eureka/}
# /refresh 엔드포인트 설정
management:
endpoint:
env:
enabled: true
web:
endpoints:
web:
exposure:
include: "refresh"
설정 파일을 사용하는 모든 메서드에 @RefreshScope 를 추가한다.
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
@RefreshScope
@GetMapping("/default")
public String defaultTest(@Value("${soomin.name}") String name,@Value("${soomin.said}")String said){
return name + ", said : "+said;
}
}
읽어 들였다면 해당 요청을 보내 확인한다.
수정할 점이 생겼다면 다시 Git Repository 에 Push 하고, Config Client 의 /refresh 엔드포인트를 POST 로 호출한다.
로그 찍히는 기록으로 보아, /refresh 란 외부 설정 저장소에 내용을 다시 끌어오는 것으로 보인다.
이후 서버 중단 없이 다시 확인해보면 설정사항 변경이 먹힌것을 볼 수 있다.
'Cloud' 카테고리의 다른 글
Spring Cloud Bus (0) | 2020.12.15 |
---|---|
Sleuth & ZipKin (0) | 2020.12.14 |
Hystrix (0) | 2020.12.08 |
Feign (0) | 2020.12.08 |
Ribbon (0) | 2020.12.08 |