설정 서버 (Config Server)란 ?
설정 서버는 각 Config Client들이 사용할 수 있는 설정 정보를 한 곳에 모아 저장한 Server이다.
Spring Cloud Server의 역할
- 깃에 설정된 profile의 정보가 바뀌게 되어도 마이크로서비스의 재기동 없이 적용이 가능하다.
- Spring Config Client들에게 설정 정보를 뿌려서, Application의 외부 속성을 중앙 집중식 관리가 가능하도록 한다.
- 서버는 주로 마이크로서비스를 개발하는 개발서버와 운영 서버, 스테이지 서버, 테스트 서버로 분리된다. 이런 서버들의 포트와 IP주소는 각기 다른데, 환경 설정 정보를 소스로부터 분리하여 소스코드와의 결합도를 낮추는 역할을 하는 것이 설정 서버의 역할이다.
그렇다면 설정 서버에서 설정 정보를 어떻게 관리할까?
Spring Cloud에서는 git을 이용한 설정 서버 내에 등록된 깃 주소를 이용해 시스템에서 사용할 profile 정보를 로드한다. 이 profile 정보를 이용해 마이크로서비스가 필요할 때 사용할 수 있도록 서비스를 제공한다.
Spring Cloud Server은 git과 같은 형상관리 툴을 이용해서 application 설정을 관리해주고, Spring Cloud Config Client가 이 설정을 기반으로 애플리케이션이 Config Server에 접근할 수 있도록 도와준다.
Spring Cloud Config Server 구축하기
먼저 build.gradle
에 아래 라이브러리를 추가해준다.
implementation 'org.springframework.cloud:spring-cloud-config-server:3.1.1'
설정 서버는 application.yml
에 등록된 깃허브 주소를 참조하여 프로파일 정보를 메모리로 읽어들인다.
server:
port: 8888
spring:
application:
name: msa-architecture-config-server
cloud:
config:
server:
git:
uri: https://github.com/Mingyum-Kim/spring-cloud-config-repository.git
defaultLabel: master
위와 같이 깃 소스 저장소를 지정해주면, 설정 서버가 깃허브에 있는 설정 파일을 찾아 프로파일을 저장한다. 나같은 경우에는 spring-cloud-config-repository
의 주 브랜치가 master
이었기 때문에 defaultLabel
을 설정해주었다.
만일 깃에 있는 프로파일 정보가 바뀌었다면, http://<설정 서버 주소>/<프로파일 명>/refresh
를 실행해서 갱신해준다.
그리고 생성한 애플리케이션에 @EnableConfigServer
어노테이션을 추가해주면 설정 서버가 생성된다.
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
참고로, build.gradle
에 의존성 추가 시 spring-cloud-config-server
가 아닌 spring-cloud-starter-config
를 사용해주면 @EnableConfigServer
어노테이션을 사용하지 않아도 된다.
아래 글을 참고해서 github에 profile 설정까지 해준다. 그 다음 서버를 실행하면 8888포트에서 서버가 켜진 것을 확인할 수 있다.
설정 파일 생성하기
Spring profiles란, 애플리케이션의 설정 정보를 분리하고, 각각의 애플리케이션이 특정 환경에서만 이용 가능하도록 하는 것이다.
예를 들어, 개발 환경에서는 대체로 로컬 서버, 개발 서버, 테스트 서버, 운영 서버, 스테이지 서버로 나누어서 운영하는 것이 일반적이다. 각 서버에 대해서 설정값이 모두 다르기 때문에, 각 설정 환경을 profiles
로 구분하여 각각 다른 값으로 한 번에 설정할 수 있는 것이다.
Spring Cloud Config Server가 이 Spring profiles를 사용하는 원리는 다음과 같다.
(1) 사용자에 의해 각 profiles에 대한 설정 정보가 Git에 저장된다.
(2) 클라이언트가 URL의 형태로 서버에게 특정 profiles의 설정값을 요청한다.
(3) Config Server은 Git에 저장되어있는 설정 파일 (.yml)을 불러와 최신 설정값을 클라이언트에게 전달해주게 된다.
추가로, 설정값을 변경하기 위해서는 사용자가 Git 내부의 설정 파일을 변경 후 반영해주면 된다.
나는 개인 프로젝트 단계이기 때문에 로컬 서버, 개발 서버, 운영 서버로만 나뉘어 운영하도록 한다
.
(1) Spring Cloud Config Repository 생성
이렇게 깃허브에 설정 파일을 업로드하기 위한 spring-cloud-config-repository를 생성한다. 그 다음, config-server-local.yml
config-server-dev.yml
과 config-server-prod.yml
파일을 만들어 업로드한다.
이때 config-server
은 아래 엔드포인트에서 application을 의미하고, 그 뒤에 붙은 local
, dev
, prod
는 profiles를 의미한다.
GET /{application}/{profile}[/{label}]
GET /{application}-{profile}.yml
GET /{label}/{application}-{profile}.yml
GET /{application}-{profile}.properties
GET /{label}/{application}-{profile}.properties
application
: Config 정보를 받을 Client의 애플리케이션의 이름을 나타낸다.
profile
: Client 측의 spring.profiles.active에 대한 정보이다.
label
: 버전을 매긴 설정파일을 지정하는 Config Server 측의 기능이다.
(2) Server가 정상적으로 구동되는 지 확인
위에서 github에 올린 파일명을 토대로, localhost:8888/{application}/{profiles} 와 같은 형태로 URL을 입력하였더니 설정값이 뜨는 것을 확인할 수 있었다.