Spring Cloud Config는 분산형 시스템에서 클라이언트, 서버 사이드로 외부화된 configuration을 제공한다.
With the Config Server, you have a central place to manage external properties for applications across all environments.
@EnableConfigServer
어노테이션을 사용하면 된다.
@SpringBootApplication
@EnableConfigServer
public class ConfigServer {
public static void main(String[] args) {
SpringApplication.run(ConfigServer.class, args);
}
}
config 서버에서는 다양한 소스에서 configuration을 땡겨올 수 있다.
Default Strategy for loading property sources is to clone a git repository. at spring.cloud.config.server.git.uri
!
이외 : JDBC 호환 DB, Subversion...
configuration server의 configuration data를 저장하는 전략은 EnvironmentRepository
이다.
This environment is a shallow copy of the domain of the Spring environment. The resources are parametrized by three variables:
{application}, which maps to spring.application.name on the client side.
{profile}, which maps to spring.profiles.active on the client (comma-separated list).
{label}, which is a server side feature labelling a "versioned" set of config files.
독스에서는 예시로 이런 bootstrap config를 가지고 있는 클라이언트 앱을 보여준다.
spring:
application:
name: foo
profiles:
active: dev,mysql
저장소가 파일 기반인 경우, 서버는 Environment을 application.yml (shared between all clients)와 foo.yml.를 가지고 생성한다. 그리고 이 때 foo.yml이 먼저 적용된다.
The default implementation of EnvironmnetRepository usea a Git backend. If you want to use local repository, you can set it with a file:
prefix.
To use HTTP basic authentication on the remote repository, add the username
and password
properties.
깃헙에서는 저장소의 변경 사항을 webhook을 통해 알려준다.
종속성에 spring-cloud-config-monitor
을 추가하고, 구성 서버에서 Spring Cloud Bus를 활성화하면 /monitor 엔드포인트가 활성화된다.
webhook이 작동하면, Config 서버는 RefreshRemoteApplicationEvent
를 applications it thinks might have changed에 보낸다는디 might 뭐여?!
아 기본적으로는 application name가 일치하는 파일의 변경 사항을 김지한다고 한다. 예를 들어 foo.properties는 foo 애플리케이션을 대상으로 하고 application.properties는 모든 애플리케이션을 대상으로 하는 것이다.
A Spring boot application can take innediate advantage of the Spring Config Server.
Config Clients는 bootstrap 내 spring.cloud.config.uri
를 통해 Config Server에 바인딩된다. 그리고 Spring Environment를 remote property sources를 사용해 init한다.
Discovery Client를 사용한다면 config server를 discovery service에 등록할 수 있다. 그러나 기본 설정으로는 클라이언트들이 등록을 활용할 수가 없다.
The Config Service serves property sources from /{name}/{profile}/{label}
, where the default bindings in the client app are as follows:
"name" = ${spring.application.name}
"profile" = ${spring.profiles.active} (actually Environment.getActiveProfiles())
"label" = "master"
이렇게 하면 Config는 끝인데 생각보다 내용이 많지 않은김에 추가적으로 정리를 해보겠다.
Spring에서 제공하는 인터페이스로 설정과 관련된 인터페이스이다.
profiles과 property 설정에 접근할 수 있다.
profiles
은 스프링 애플리케이션을 개발할 때, 환경에 따라 약간씩 변경이 되어야할 설정 값들을 코드의 변경 없이 설정만으로 편리하게 변경할 수 있도록 제공하는 인터페이스이다.
spring:
profiles:
active: prod # 어떤 Profiles를 기준으로 설정값을 활성화시킬건지 설정
---
spring:
profiles: dev # develop 환경일 때 아래 설정을 활성화
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password: password
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create
h2:
console:
enabled: true
---
spring:
profiles: prod # product 환경일 때 아래 설정 활성화
datasource:
url: jdbc:mysql://111.222.0.111:3306/office?serverTimezone=UTC&characterEncoding=UTF-8
driver-class-name: com.mysql.cj.jdbc.Driver
username: jdk
password: jeongpro
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate:
ddl-auto: update
멋진 선생님이 예제로 적어주신 걸 가져왔다.
개발 환경에서는 h2 메모리 데이터 베이스..prod 환경에서는 mysql 쓰겠다!
.properties 파일이나 .yml 파일로 profiles를 설정할 수 있다.
++ VM Option으로도 설정할 수 있다.
DSpring.profiles.active=local,test
Profiles 값은 여러개가 활성화될 수 있다.
기본 적용이 된 profiles - defaultProfiles
현재 활성화된 profiles - activePrifiles
Environment 인터페이스의 부모 인터페이스 PropertyResolver!에서 접근 가능하게 해주는 것이다.
profiles 값은 여러개가 활성화될 수 있는데, 이 때 나중에 오는 profiles이 우선된다. (덮어씌워짐)
environment
에서도 값을 가져올 수 있고
@PropertySource
로도 가져올 수 있고
(@PropertySource는 프로퍼티 파일을 직접 로드하고, 그 값을 어노테이션을 통해 필드에 할당함. 이 방식은 일반적으로 타입 안전성이 부족하며, 설정 값이 여러 클래스에 흩어져 있어 가독성과 유지보수성이 떨어질 수 있어 권장 X)
@ConfigurationProperties
로도 가져올 수 있다.
사실 이 것들의 궁금증의 첫 시작은 config 서버와 기본적으로 있는 yml 파일들과...bootstrap 까지 수많은 파일들로 인해 불러와질때 대체 어떤 값이 사용되는가 하는 혼란이였다.
이건 아직 더 찾아봐야하는데 나의 고민과 챗선생과 함께 한 답변은 아래와 같다.
- 외부 저장소의 프로퍼티 파일 (예: Git 레포지토리 또는 파일 시스템): Spring Cloud Config를 사용하면 외부 저장소의 프로퍼티 파일이 가장 먼저 로드됩니다.
2.프로젝트의 bootstrap.yml 또는 bootstrap.properties: 애플리케이션이 시작될 때, bootstrap.yml 또는 bootstrap.properties 파일이 classpath에서 로드됩니다. 이 파일은 주로 애플리케이션의 초기 구성과 관련된 중요한 설정을 포함하는 데 사용됩니다. 이 파일은 외부 저장소에서 가져온 프로퍼티 파일의 내용을 덮어씁니다.
- 프로젝트의 application.yml 또는 application.properties: 다음으로, application.yml 또는 application.properties 파일이 classpath에서 로드됩니다. 이 파일은 bootstrap.yml 또는 bootstrap.properties에서 설정한 값과 합쳐집니다.
참고자료 :
https://jeong-pro.tistory.com/223
https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/multi