[Spring Cloud] Spring Cloud Config 에 대해

최동근·2023년 10월 11일
0
post-thumbnail
post-custom-banner

해당 포스팅은 인프런의 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 을 수강하면서 정리하는 글입니다. 이도원님의 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

안녕하세요 오늘은 Spring Cloud Config 첫번째 시간으로 기본적인 개념에 대해서 알아보고 간단한 실습을 해보겠습니다.
실습에 대한 코드는 SpringCloud MSA 프로젝트 깃허브 주소 + SpringCloudConfig 설정 파일 깃 저장소 을 참고해주세요.

☁️ Spring Cloud Config 개념

MSA(Micro Service Architecture) 로 서비스를 구축하다보면 각 애플리케이션에서 사용해야 하는 다양한 설정값이 필요합니다.
데이터베이스 관련 값이라던지, 보안적으로 중요한 암호키 혹은 클라우드 서비스의 아이디, 비밀번호 등 다양한 설정값이 이에 해당합니다.
Spring Boot 을 이용해서 개발하면 Resouce 파일에 application.yml 에서 관리를 하게 됩니다.
Spring Cloud ConfigMSA 같은 분산 시스템에서 서버, 클라이언트 구성에 필요한 설정 정보(application.yml)를 외부 시스템에서 관리를 위한 Spring Cloud 에 속해있는 기술입니다❗️

쉽게 이해하자면, 분산 시스템에서 여러 어플리케이션에 존재하는 application.yml을 하나의 중앙화 된 저장소 즉, 설정 정보를 위한 서버(= Config Server) 에서 관리할 수 있는 기술입니다.
중앙 저장소로는 Git 레포지토리, 로컬의 File System, Vault 등이 있습니다.

[ 용어 정리 ]

설정 파일 외부 저장소 : Git,Database,File System, Valut 등의 저장소
Spring Cloud Config Server : 설정 파일 외부 저장소로부터 설정 값을 읽어오는 설정 서버
Spring Cloud Config Client : 설정 서버에서 설정 값을 사용하는 분산 시스템의 각 어플리케이션

☁️ Spring Cloud Config 을 사용하는 이유

앞에서 Spring Cloud Config 의 개념에 대해서 알아보았습니다.
그렇다면 분산 시스템에서 각 애플리케이션의 설정 정보를 중앙화된 저장소에서 관리하는 Spring Cloud Config 기술을 사용하는 이유가 뭘까요? 🤔

    1. 설정 정보를 외부로 분리하면, 설정 정보가 변할 때 설정 서버의 재배포가 필요없습니다.
    1. 설정 정보를 애플리케이션에서 관리하는 것이 아니라 분리해서 외부 저장소에서 관리함으로서 보안적인 측면을 강화할 수 있습니다.
    1. 공통적인 구성을 공유하는 MSA 가 자신의 속성 설정으로 유지/관리하지 않고도 동일한 속성을 공유할 . 수있습니다. 또한 공유되는 속성을 한 곳에서 변경함으로서 모든 MSA 에 적용 가능합니다.
      즉, 설정 정보의 유연한 적용과 관리가 가능합니다.

이처럼 Spring Cloud Config 기술을 통해 분산 시스템을 운영하면서, 보안적으로 중요한 각종 설정 정보를 안전하고 효율적으로 관리 가능합니다.
하지만 몇몇의 단점도 존재합니다.

    1. Config Server 의 장애가 애플리케이션으로 전파될 수 있습니다.
    1. 우선 순위에 의해 설정 정보가 의도치 않게 덮어씌워질 수 있습니다.

이러한 상황은 실제 Spring Cloud Config 을 사용해보면서 마주칠 수 있는 상황입니다.
따라서 Spring Cloud Config 을 사용함에 있어 선제적으로 해당 기술에 대해 충분한 이해와 구현 능력을 가지는것이 필수적입니다.

☁️ Spring Cloud Config 작동 로직

앞에서 살펴본 것에 추가적으로 Spring Cloud Config 기술이 어떤 로직으로 작동하는지 꼼꼼히 살펴보겠습니다.

상단의 이미지 처럼, Spring Cloud Config 기술은 Application(MSA) - Config Server - Config Server 가 바라보는 설정 외부 저장소 로 구성됩니다 ☁️
이제, 클라이언트의 API 요청부터 시작해서 어떻게 외부 설정 저장소에서 설정 값을 가져오는지 살펴보겠습니다.
여기서는 Config Server 가 바라보는 설정 외부 저장소를 Git 저장소라고 가정하겠습니다 ❗️

Spring Cloud Config Server(외부 중앙 설정 서버) : 버전 관리 레포지토리로 백언된 중앙 집중식 구성 노출을 지원한다.
Spring Cloud Config Client(분산 시스템을 구성하는 애플리케이션) : 외부 중앙 설정 서버로 부터 설정값을 Fetch 해 온다.

  1. 분산 시스템의 애플리케이션은 처음 구동시 애플리케이션의 Name 과 Profile 정보를 이용해서 자신이 바라보고 있는 Config Server 에서 설정값을 가져옵니다.
  2. 해당 요청을 받은 애플리케이션은 Config Server 에서 받아온 설정값을 이용하여 클라이언트의 요청을 처리합니다.
  3. 만약 Git 원격 저장소나 file Store 의 설정 값이 변경되는 경우 이를 바라보고 있는 Config Server 는 새로운 설정 값으로 자동 갱신됩니다.

Config Server 는 Client 와 실제 설정 값을 제공하는 Git 저장소나 File System의 중간 다리 역할을 하는 서버라고 이해하면 되겠습니다 ❗️

여기서 Spring Cloud Config 의 가장 큰 장점이 두드러집니다.
Spring Cloud Config 을 사용하면 사용자가 외부 설정 저장소의 설정 정보를 최신화 했을 때, Config Server을 다시 빌드 및 배포할 필요가 없습니다 🔥

☁️ Spring Cloud Config Server 구축하기

[단계]

1. 설정 파일 저장소(Git 저장소) 구축
2. 설정 서버(Cloud Config Server) 구축
3. 설정 서버 실행 및 확인

1. 설정 파일 저장소(Git 저장소) 구축

이번 실습에서 Git 레포지토리를 사용해서 설정 파일 저장소를 구축해보겠습니다.
spring cloud config 설정 파일 저장소 을 참고해주세요.
(해당 실습 설정 파일과 Git 원격 레포지토리의 설정 파일 내용이 다를 수 있습니다❗️)

이번 포스팅에서 구축할 Config Client 어플리케이션의 이름은 Users-service 이며 이와 관련해서
총 4개의 설정 파일(.yml) 을 해당 원격 레포지토리에 저장해보겠습니다.

1. application.yml

// application.yml
## 해당 파일은 공용 파일로서, 애플리케이션이 어떤 이름이든 default 프로파일이면 조회된다.
## http://localhost:8888/{config server 의 이름}/default 로 불러올 수 있음
application:
  name: application
  file: application.yml

2. users-service.yml

// users-service.yml
application:
  name: users-service
  file: users-service.yml
  profile: default

3. users-service-dev.yml

// users-service-dev.yml
application:
  name: users-service
  file: users-service-dev.yml
  profile: dev

4. users-service-prod.yml

// users-service-prod.yml
application:
  name: users-service
  file: users-service-prod.yml
  profile: prod

이렇게 4개의 yml 을 구성해줍니다.
설정 파일 저장소를 구성해주면, 다음에 실습해볼 설정 서버(Config Server) 는 설정 파일 저장소의 설정 파일을 클론하고 설정 정보를 읽어오는 원리로 동작하게 됩니다.

2. 설정 서버(Cloud Config Server) 구축

이번에는 설정 파일 저장소에서 설정 정보를 가져와서 분산 시스템의 애플리케이션에게 설정 정보를 제공하는 설정 서버(config server)를 구축해보겠습니다.
SpringCloud_MicroService - Config-services 을 참조해주세요.
Config Services 라는 모듈을 하나 구성해주고, 밑의 단계를 진행합니다.

1. spring-cloud-config-server 의존성을 추가

dependencies {
	implementation 'org.springframework.cloud:spring-cloud-config-server'
 }

2. 해당 모듈 main class 에 @EnableConfigServer 추가

@SpringBootApplication
@EnableConfigServer <- 해당 서비스는 config server 임을 의미
public class ConfigServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServiceApplication.class,args);
    }
}


3. application.yml 구성

server:
  port: 8888 // spring cloud config server 기본 포트
    
spring:
  application:
     name: spring-cloud-config-server
  cloud:
     config:
        server:
       	   git:
            #github address
			   uri: https://github.com/choidongkuen/spring_cloud_config_repo.git
               # search-paths: 해당 깃 원격 레포지토리 하위 파일 경로
               # default-label: 해당 깃 원격 레포지토리 브랜치명

위에 application.yml 은 원격 Git 레포지토리에 대한 설정 방식이지만 이외에도 다양한 설정 파일 저장소를 지정할 수 있습니다.
: spring cloud config server에 파일 시스템 사용

3. 설정 서버 실행 및 Endpoint 확인

자 이제 모든 준비가 끝났습니다.
이렇게 구성해준 Config Server 을 구동해볼까요?

Config Server 을 구동하면 설정 파일 저장소로부터 설정 정보를 가져옵니다 ❗️
또한 Config Server 는 자신이 가져온 설정 정보를 보여주는 Endpoint 을 가집니다.

/{application name}/{profile}

앞에서 우리는 Config ClientUsers-service 로 하기로 결정했습니다.

여기서 주의할 점은 application name 은 각 yml 에 지정한 spring:application:name 에 지정한 이름입니다 ❗️

Endpoint 을 이용해서 Config Server 가 설정 정보를 잘 가져오는지 확인해보겠습니다.

-profile = default

해당 이미지는 {profile}default 로 설정하여서 http 요청을 보낸 결과입니다.
users-service-ymlapplication.yml 의 설정 정보를 가져오는 것을 확인 할 수 있습니다 ❗️
이번에는 {profile}devprod 로 설정하여 결과를 확인해보겠습니다.

- profile = dev

- profile = prod

여기서 확인할 수 있는 부분은 /{application name}/{profile}.yml 과 함께 기본적으로 profile 이 default 일때 가져오는 application.ymlusers-service.yml 을 가져는 것을 알 수 있습니다.

Spring Cloud Config 는 설정 파일 우선 순위를 가지고 있습니다.
이는 로컬에 존재하는 설정 파일과 설정 파일 저장소에 존재하는 설정 파일의 우선 순위를 결정합니다.
가장 우선순위가 높은 것은 설정 파일 저장소의 {application name}-{profile}.yml 입니다!

1. 설정 파일 저장소의 {application name}-{profile}.yml
2. 설정 파일 저장소의 {application name}.yml
3. 로컬의 {application name}-{profile}.yml
4. 로컬의 {application name}.yml
5. 설정 파일 저장소의 application.yml
6. 로컬의 application.yml

위에서 살펴본 Endpoint 결과 이미지에서도 설정 파일 저장소 기준 우선 순위에 따라 순서대로 설정 값이 보여지는 것을 확인할 수 있습니다 ❗️
이렇듯, 우선 순위가 존재하기 때문에 개발자가 의도한 설정 파일로 애플리케이션이 실행되지 않는 경우도 있으므로, Spring Cloud Config 에 대한 전반적인 이해가 필요합니다.

+ 설정 파일 저장소에 users-service-default.yml 을 추가한 경우

설정 서버(Config Server) 의 설정 파일이 로컬 프로젝트의 설정 파일보다 우선순위가 높고, 구체적인 설정 파일이 우선 순위가 높습니다.

☁️ Spring Cloud Config Client 구축하기

[단계]

1. Config Client 인 users-service 구축
2. 테스트 및 결과 확인

1. Config Client, users-service 구축

앞에서 구현한 설정 서버를 실제로 사용하는 애플리케이션(Config Client)users-service 을 구현해보겠습니다.
SpringCloud_MicroService-Config-client(users-service) 을 참고해주세요.

여기서 핵심은 users-service 을 만들고, 해당 애플리케이션의 application.yml 을 통해 Config Server 와 연동시켜주는 과정입니다 ❗️
연동을 시키면 users-service 애플리케이션이 구동될때 Config Server 을 통해 설정 정보를 Fetch 합니다.

1. spring-cloud-starter-config 의존성 추가

dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-config`
}

2. application.yml 구성

server:
  port: 8081
spring:
  application:
  	name: users-service 
    
  profiles:
  	active: default # 없으면 defult profile 로 동작
    
  config:
  	import: optiona:configserver:http://localhost:8888 # config server 주소
    name: users-service # 설정 파일 저장소에서 찾을 파일의 애플리케이션 이름

3. ConfigProperties.class 구성

// ConfigPropreties.class
@ConstructorBinding
@AllArgsConstructor
@Getter
@ConfigurationProperties(prefix = "application")
public class ConfigProperties {
    private String name;
    private String file;
    private String profile;
}

ConfigProperties.class 는 설정 파일에서 읽어온 설정 값들을 바인딩 하기위한 클래스 입니다.

2. 테스트 및 결과 확인

프로젝트에서는 Spring Cloud Api Gateway 을 사용하기 때문에 port 는 8000번입니다.
위에 있는 users-service 의 application.yml 처럼 profile 이 default 로 구성되었기 때문에 설정 파일 저장소에서 application 이름이 users-service 이면서 가장 우선 순위가 높은
users-service-default.yml 의 설정 값으로 결과가 나오는 것을 확인할 수 있습니다 👨‍💻

☁️ 마무리

이렇게 Spring Cloud Config 에 대한 기본적인 개념을 알아보고 간단한 실습을 진행해보았습니다.

실제 프로젝트에서 application.yml 에 들어있는 다양한 설정값들을 어떻게 처리할까에 대해 항상 고민이 있었는데 Spring Cloud Config 을 사용하면 효과적으로 설정 정보를 관리할 수 있을 것 같습니다.

다음시간에는 Spring Cloud Config 기술에 보안적인 측면을 강화해보겠습니다.
다음 포스팅 : [Spring Cloud] Spring Cloud Config 보안 기술 적용하기


참고

Spring Cloud Config docs
Spring Cloud Config 소개 & 예제
[Spring Cloud] cloud config에 대한 설명 및 구현
Spring Cloud 를 이용한 MSA #5. 설정파일 관리(config)
spring cloud config server에 파일 시스템 사용

profile
비즈니스가치를추구하는개발자
post-custom-banner

0개의 댓글