Spring Cloud Config 튜토리얼
개요
"Spring Cloud Config란?" 글에 이어서 Spring Cloud Config 튜토리얼을 통하여 직접 Spring Cloud Config를 제공하는 Server와 Client를 구축하고 설정을 받아보고자 합니다.
모든 코드는 github에서 확인할 수 있습니다.
Spring Cloud Config Server 구성하기
dependencies {
implementation(enforcedPlatform("org.springframework.cloud:spring-cloud-dependencies:2022.0.4"))
implementation("org.springframework.cloud:spring-cloud-config-server")
}
spring-cloud-server 의존성을 추가합니다.
@SpringBootApplication
@EnableConfigServer
class SpringCloudConfigServerApplication
fun main(args: Array<String>) {
runApplication<SpringCloudConfigServerApplication>(*args)
}
@EnableConfigServer 어노테이션을 선언합니다.
server:
port: 8088
spring:
cloud:
config:
server:
git:
uri: https://github.com/Junuu/spring-study
application.yml에 github 주소를 입력합니다.
만약 Git Repository가 private라면 추가적으로 ssh 발급에 대한 설정과 구성이 추가됩니다.
Git Repository에 설정파일들 구성하기
application.yml에 명시한 Git Repository의 최상단에 파일 이름을 {애플리케이션 이름}-{환경}.yml 형태로 구성합니다.
testapplication-local, testapplication-dev 라는 파일명을 통하여 각각 설정정보를 넣어주어 보았습니다.
Git Repository의 최상단에 파일들이 올라간 모습을 확인할 수 있습니다.
Spring Cloud Config Server 호출해 보기
Spring Application을 실행하고 postman을 활용하여 GET localhost:{port}/{application-name}/{profile} 를 활용하여 요청을 보내보았습니다.
정상적으로 설정한 config를 확인할 수 있습니다.
Spring Cloud Server는 설정을 제공하기 위해서 다양한 endpoint들을 제공합니다.
GET /{application}/{profile}[/{label}]
GET /{application}-{profile}.yml
GET /{label}/{application}-{profile}.yml
GET /{application}-{profile}.properties
GET /{label}/{application}-{profile}.properties
application은 application의 이름, profile은 환경을 뜻합니다.
여기서의 label은 git 저장소의 branch를 뜻하며 기본적으로 master입니다.
Spring Cloud Config Client 구성하기
dependencies {
implementation(enforcedPlatform("org.springframework.cloud:spring-cloud-dependencies:2022.0.4"))
implementation("org.springframework.cloud:spring-cloud-config-client")
implementation("org.springframework.boot:spring-boot-starter-actuator")
}
spring-cloud-client 의존성을 추가합니다.
actuator 의존성을 추가합니다
actuator는 추후에 config 설정을 갱신할 때 사용됩니다.
spring:
application:
name: testapplication # 어플리케이션 이름 = Github 레포지토리에서 관리하는 파일 애플리케이션 이름
profiles:
active: local # 애플리케이션 환경 = local, dev
config:
import: optional:configserver:http://localhost:8088 # import:optional:configserver사용 -> Spring cloud config server 주소
server:
port: 9001 # Spring Cloud Config Client 주소
# 클라이언트 코드에서 Actuator 설정
management:
endpoints:
web:
exposure:
include: "*"
application.yml에 config 설정을 조회할 주소, 활성화할 profile, application 이름을 적어줍니다.
@RefreshScope // 설정 변경된 내용을 actuator를 통해 변경값을 갱신
@Component
class LocalConfig {
@Value("\${test.secret}")
val secret: String? = null
@Value("\${test.name}")
val name: String? = null
}
config 변수를 담고 있는 Spring Bean을 하나 만든 후 @RefreshScope 어노테이션으로 설정이 변경될 경우 actuator를 통해 변경된 설정값을 갱신할 수 있습니다.
@RestController
class ConfigController(
private val localConfig: LocalConfig
) {
@GetMapping("/config")
fun loadLocalConfig(): ResponseEntity<Unit> {
logger.info { localConfig.secret }
logger.info { localConfig.name }
return ResponseEntity.ok().build()
}
}
localConfig를 확인해 볼 수 있도록 endpoint를 하나 구성하였습니다.
해당 경로로 호출해 보면 Git Repository에서 설정했던 값을 확인해 볼 수 있습니다.
Application 기동 중 중간에 Git Repository의 설정 바꾸기
Git Repository에 password-local-change, junwoo-local-change로 설정을 변경하여 push 하였습니다.
Application은 초기 설정을 받아와서 기동 중인 상태입니다.
이제 자동으로 설정이 반영될까요?
설정 값을 확인하기 위해 호출했던 /config endpoint로 호출해 보면 값이 바뀌지 않았습니다.
POST http://localhost:9001/actuator/refresh endpoint를 호출하고 다시 /config endpoint를 호출하면 새로운 git 정보를 가져오고 그 정보를 기반으로 설정이 바뀐 것을 확인할 수 있습니다.
참고자료
https://madplay.github.io/post/introduction-to-spring-cloud-config