[Spring Cloud] Spring Cloud Config

lin·2023년 9월 13일
0

Spring Cloud Config는 분산형 시스템에서 클라이언트, 서버 사이드로 외부화된 configuration을 제공한다.

With the Config Server, you have a central place to manage external properties for applications across all environments.

Config server

@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...

📙 Environment Repository

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.

📙 Authentication

To use HTTP basic authentication on the remote repository, add the username and password properties.

📙 Push notification and Spring cloud bus

깃헙에서는 저장소의 변경 사항을 webhook을 통해 알려준다.
종속성에 spring-cloud-config-monitor을 추가하고, 구성 서버에서 Spring Cloud Bus를 활성화하면 /monitor 엔드포인트가 활성화된다.

webhook이 작동하면, Config 서버는 RefreshRemoteApplicationEventapplications it thinks might have changed에 보낸다는디 might 뭐여?!
아 기본적으로는 application name가 일치하는 파일의 변경 사항을 김지한다고 한다. 예를 들어 foo.properties는 foo 애플리케이션을 대상으로 하고 application.properties는 모든 애플리케이션을 대상으로 하는 것이다.

Config Client

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는 끝인데 생각보다 내용이 많지 않은김에 추가적으로 정리를 해보겠다.


Enviroment

Spring에서 제공하는 인터페이스로 설정과 관련된 인터페이스이다.
profiles과 property 설정에 접근할 수 있다.

profiles

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 사용하기
    @Profile 어노테이션을 사용하여 설정에 따라 빈을 생성하고 안하고를 결정할 수 있다.

기본 적용이 된 profiles - defaultProfiles
현재 활성화된 profiles - activePrifiles

property

Environment 인터페이스의 부모 인터페이스 PropertyResolver!에서 접근 가능하게 해주는 것이다.

profiles 값은 여러개가 활성화될 수 있는데, 이 때 나중에 오는 profiles이 우선된다. (덮어씌워짐)

environment에서도 값을 가져올 수 있고
@PropertySource로도 가져올 수 있고
(@PropertySource는 프로퍼티 파일을 직접 로드하고, 그 값을 어노테이션을 통해 필드에 할당함. 이 방식은 일반적으로 타입 안전성이 부족하며, 설정 값이 여러 클래스에 흩어져 있어 가독성과 유지보수성이 떨어질 수 있어 권장 X)
@ConfigurationProperties로도 가져올 수 있다.

사실 이 것들의 궁금증의 첫 시작은 config 서버와 기본적으로 있는 yml 파일들과...bootstrap 까지 수많은 파일들로 인해 불러와질때 대체 어떤 값이 사용되는가 하는 혼란이였다.

이건 아직 더 찾아봐야하는데 나의 고민과 챗선생과 함께 한 답변은 아래와 같다.

  1. 외부 저장소의 프로퍼티 파일 (예: Git 레포지토리 또는 파일 시스템): Spring Cloud Config를 사용하면 외부 저장소의 프로퍼티 파일이 가장 먼저 로드됩니다.

2.프로젝트의 bootstrap.yml 또는 bootstrap.properties: 애플리케이션이 시작될 때, bootstrap.yml 또는 bootstrap.properties 파일이 classpath에서 로드됩니다. 이 파일은 주로 애플리케이션의 초기 구성과 관련된 중요한 설정을 포함하는 데 사용됩니다. 이 파일은 외부 저장소에서 가져온 프로퍼티 파일의 내용을 덮어씁니다.

  1. 프로젝트의 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

profile
BE

0개의 댓글