[Spring Cloud] Spring Cloud Config - 기본 개념 및 활용

mrcocoball·2024년 1월 23일
0

Spring Cloud

목록 보기
7/8

해당 포스트는 Spring Cloud에 속한 기술들에 대한 개념과 주요 기술에 대해 알아보고 실무에 적용했었던 내용을 정리하는 포스트입니다.

1. 개요

환경 변수 및 설정 정보의 분리 필요성

기본적으로 어플리케이션의 설정 및 환경 변수가 변경되었을 경우 서버 재시작을 해야 반영이 되는데 이는 applicatiom.yml과 같은 설정 정보가 어플리케이션 빌드 당시에 적용이 되기 때문입니다.

마이크로서비스의 경우 스케일링이 자주 발생하다보니 설정 및 환경 변수의 변화가 많이 발생할 수 밖에 없는데 이 경우 서비스를 계속해서 재시작해야 하는 문제가 있습니다.

MSA 12 Factors에서는 다음과 같은 내용을 강조하고 있는데 위의 내용과 더불어 마이크로서비스와 환경 변수, 설정 정보의 분리가 필요함을 역설하고 있습니다.

  • 마이크로서비스가 배포될 때 제반 설정값들을 배포 대상 환경에 맞게 적용해야 한다
  • 마이크로서비스를 Stateless하게 개발하여 스케일링과 부담없는 재시작을 가능하게 해야 한다

Spring Cloud Config

Spring Cloud Config는 분산 시스템에서 외부화된 설정 정보를 서버 및 클라이언트에게 제공하며 Server와 Client로 구성됩니다.

  • Config Server : 설정 및 버전 관리 리포지토리, 백업된 중앙 집중식 구성 노출을 지원
  • Config Client : 어플리케이션이 설정 서버에 연결하도록 지원

Spring Cloud Config는 여러 서비스들의 설정 파일을 외부로 분리, 중앙에서 관리할 수 있도록 하고 또한 설정값 변경 시 서비스를 재기동하지 않고도 적용할 수 있도록 도와줍니다.

다만 외부 원격 저장소나 Config Server에 장애가 발생할 경우 각 마이크로서비스들로 장애가 전파될 수 있으며, 우선 순위에 의해 설정 정보가 덮어 씌워질 수 있다는 단점이 있어 관련 자원에 대한 관리가 필요합니다.

주요 기능

Config Server는 환경 변수, 설정값들을 외부 저장소에서 불러오며, 외부 저장소에서 설정 파일이 변경될 경우 Config Server가 이를 감지하여 변경된 내용을 반영합니다.

Config Client는 어플리케이션 구동 시 Config Server로부터 구동에 필요한 환경 변수와 설정값을 받아옵니다.

다만 여기서 주의할 점은, Config Server에 저장되어 있던 환경변수, 설정값이 변경되더라도 Config Client는 기본적으로 어플리케이션 구동시에만 Config Server로부터 값을 받아오므로 값이 변경되었음을 알려야 합니다.

이 때 사용되는 방법은 3가지입니다.

  • 각 클라이언트의 /actuator/refresh 엔드포인트로 POST 요청을 하여 최신화
  • Spring Cloud Bus 활용
  • Spring Cloud Config Watcher를 사용

2. 활용 예제

설정 : Spring Cloud Config Server + GitHub Repository

메인 클래스에 @EnableConfigServer 어노테이션을 부착한 후 application.yml을 설정합니다.
리포지토리 연결의 경우 SSH, HTTPS 2가지 방식이 있는데 예제에서는 HTTPS 방식을 사용합니다.
참고로 HTTPS 인증의 경우 더 이상 Password 인증을 지원하지 않아 Password에 GitHub 토큰을 입력해야 합니다.

server:
  port: 8888

spring:
  application:
    name: sample
  cloud:
    config:
      server:
        git:
          uri: ${GITHUB_URI}.git
          search-paths: configs/**
          default-label: main
          username: ${GITHUB_USERNAME}
          password: ${GITHUB_PASSWORD} #실제로는 password가 아닌 GitHub에서 발급한 토큰을 입력한다
          basedir: ./config #기본값은 tmp 폴더에 설정 정보를 clone하나, 주기적으로 삭제되는 경우가 있어 프로젝트 디렉토리에 저장 (gitignore 처리)

이후 Config Server의 엔드포인트를 통해 리포지토리에서 가져온 설정 정보를 읽을 수 있는데 이는 search-paths에 작성한 경로 + 어플리케이션 이름 + '-' + 프로필 (예시 : configs/sample-local.yml) 형식으로 작성된 파일에서 가져오며 엔드포인트는 /어플리케이션 이름/프로필 형식입니다.

설정 : Spring Cloud Config Client

application.yml을 다음과 같이 설정합니다.
optional의 경우 Config Server에서 설정 정보를 불러오지 못하더라도 실행을 종료시키는 것이 아니라 application.yml 내부의 값으로 대체해서 실행하는 옵션입니다.

spring:
  config:
    activate:
      on-profile: local
    import: optional:configserver:http://localhost:8888
profile
Backend Developer

0개의 댓글