위 그림으로 간단히 설명 가능하다. Spring Cloud Config 는 여러 서비스들의 설정 정보들을 중앙으로 관리하기 용이하도록 도와주는 것이다.
그렇다면 왜 설정 정보를 외부에 따로 중앙으로 관리할까?
-> 예를 들어 A, B, C 서비스가 있다. 각각의 서비스들은 같은 설정 정보를 사용한다. 만약 각각의 서비스들에 설정 정보를 관리한다면, 설정 정보를 변경할 때 모든 서비스의 설정 정보를 수정해야한다. 그리고 설정 정보를 변경했으므로 모두 재배포를 해야한다. 여간 불편한 일이 아닐 수 없다. 그와중에 한군데의 설정 정보를 잘못 변경하면 장애로 이어질 수 있다.
그러므로 설정 정보의 변경시 관리 용이를 위해 외부에 중앙으로 관리하는 것이 관리적인 측면에서 편하다.
이제 사용하는 이유도 알았으니 자세히 알아보자
즉, Spring Cloud Config Server 는 Client 와 설정 정보 저장소 간의 중간 다리 역할 이라고 볼 수 있다.
앞으로 client, sever, 저장소 라는 말을 사용하여 설명할텐데 그림과 비교해봤을 때 이렇게 생각하면 된다.
- Spring Boot MircroSevice -> Spring Cloud Config Client
- Spring Cloud Config Server
- Git -> 설정 정보 저장소
설정 정보를 저장하는 방법은 다양하게 존재한다. 위 그림은 git
으로 나와있지만, git 이외에도 다음과 같은 저장 방식을 제공하므로 필요에 맞게 저장소를 선택하면 된다.
Spring Cloud Config 의 장점 중 하나가 설정 정보를 변경하여도 재배포가 필요없다는 것이다.
저장소에 변경 사항이 발생하면 Config Sever 에서 이를 탐지할 수 있다. 그러나 Client에 변경 사항이 반영되려면 다음과 같은 별도의 조치가 필요하다.
예시에서는 1번 방법을 사용한다.
이제 본격적으로 구축 방법에 대해 다음과 같은 순서로 알아보자.
- 설정 정보 저장소 구축
- Spring Cloud Config Server 구축
- 기존 서비스(Client)를 Config Sever 와 연동
application.yml // 공통
application-local.yml // 로컬 환경
application-dev.yml // 개발 환경
application-prod.yml // 운영 환경
Client 를 설정할 때 한번 더 설명하지만, 설정한 application name
을 client 쪽에서 맞춰줘야 한다.프로젝트를 생성 후에 spring cloud config server
의존성을 주입한다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
현재 본인이 사용할 spring boot version
에 따라 spring cloud version
이 달라지므로 확인하고 버전을 설정해야 한다.
actuator
의존성을 주입한다.
Client에서 설정 정보를 갱신하는 방법중에 하나인 actuator 를 사용하려면 의존성을 주입해야한다. 갱신 방법 중 다른 것을 사용한다면 이 과정을 패스해도 된다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml
에 다음의 설정을 추가한다.
server:
port: 8888
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://github.com/~
search-paths: config-file/**
default-label: main
username: hyunjee
password: dafsfsfad
저장소 주소를 ssh 나 https 로 설정하면 별도의 인증 값을 더 적어줘야 한다. (privateKey or password)
메인 클래스에 메인 클래스에 @EnableConfigServer
붙이기
@SpringBootApplication
@EnableConfigServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
설정 서버 실행 및 확인
spring cloud config server 의 endpoint
로 config server가 정상 동작하는지 확인한다.
설정 정보 저장소에 존재하는 application-dev.yml
파일 정보를 읽고 싶다면
http://localhost:8888/application/dev
라고 요청을 보내면 된다.
응답값에 설정 정보들이 존재한다면 정상 동작하는 것이다.
Spring Cloud Config Sever Endpoint
application
-> application name
label
-> 설정 정보 저장소 브랜치
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
@Getter
@ConfigurationProperties("com.hyunjee")
@RefreshScope
public class Config {
private String minFileSize;
private String maxFileSize;
}
@RefreshScope
는 설정 정보가 변경되었을 때 설정 정보를 다시 불러오는 역할이며 설정 정보가 저장되어 있는 git repo 에 수정이 발생했을 때 /actuator/refresh
호출하면 변경된 설정 정보가 반영됨 -> actuator API 를 사용하지 않는다면 필요없다.spring:
application:
name: application
profiles:
active: dev
config:
import: optional:configserver:http://localhost:8888
spring.aplication.name
- 설정 정보 저장소에서 지정한 application nameapplication-dev.yml
이와 같은 형식으로 작성했다면 application name은 application 이다! client에서 설정하는 application name
을 보고 설정 정보를 찾기 때문에 반드시 원하는 설정 정보의 application name
을 적어줘야 한다.spring.profiles.active
- 구동 환경 설정, dev라고 할 경우 설정 정보 저장소에서 application-dev
파일을 읽게된다.spring.config.import
설정 config server 주소를 입력, 여러개의 config server를 입력할 수도 있다. 여러개 입력했을 경우 첫번째 서버와 연결이 실패하면 두번째 서버와 연결한다.optional
부분을 제거하면 된다. optional을 붙였는데 통신에 실패한다면 외부의 설정 정보를 읽지 못하므로 내부의 설정 정보를 읽게 된다.이렇게 Spring Cloud Config 의 개념과 구축 방법을 간단히 알아보았다. 사실 실무에서는 예시에 설명된 방식이 아닌 상황에 따른 다양한 방식을 고려하게 될 것이다. 그러므로 다음 편에는 실무에서 Spring Cloud Config 를 적용한 적용기를 올려보려고 한다.
https://mangkyu.tistory.com/253
https://mangkyu.tistory.com/254
https://godekdls.github.io/Spring Cloud Config/contents/