Spring Cloud Config 개념 및 설정 방법

이현지·2023년 2월 14일
0
post-custom-banner

Spring Cloud Config 란?

위 그림으로 간단히 설명 가능하다. Spring Cloud Config 는 여러 서비스들의 설정 정보들을 중앙으로 관리하기 용이하도록 도와주는 것이다.

그렇다면 왜 설정 정보를 외부에 따로 중앙으로 관리할까?
-> 예를 들어 A, B, C 서비스가 있다. 각각의 서비스들은 같은 설정 정보를 사용한다. 만약 각각의 서비스들에 설정 정보를 관리한다면, 설정 정보를 변경할 때 모든 서비스의 설정 정보를 수정해야한다. 그리고 설정 정보를 변경했으므로 모두 재배포를 해야한다. 여간 불편한 일이 아닐 수 없다. 그와중에 한군데의 설정 정보를 잘못 변경하면 장애로 이어질 수 있다.
그러므로 설정 정보의 변경시 관리 용이를 위해 외부에 중앙으로 관리하는 것이 관리적인 측면에서 편하다.


이제 사용하는 이유도 알았으니 자세히 알아보자

  • 분산 시스템에서 외부화된 설정 정보를 서버 및 클리이언트에게 제공하는 시스템
  • Config Server 는 외부에서 모든 환경에 대한 정보들을 관리해주는 중앙 서버
  • 설정 정보를 외부로 분리한 후, 설정 정보를 변경하였을 때 별도로 재배포가 필요없음
  • 설정 정보를 분리함으로써 보안적인 측면 강화

즉, Spring Cloud Config Server 는 Client 와 설정 정보 저장소 간의 중간 다리 역할 이라고 볼 수 있다.

앞으로 client, sever, 저장소 라는 말을 사용하여 설명할텐데 그림과 비교해봤을 때 이렇게 생각하면 된다.

  • Spring Boot MircroSevice -> Spring Cloud Config Client
  • Spring Cloud Config Server
  • Git -> 설정 정보 저장소

설정 정보 저장 방법

설정 정보를 저장하는 방법은 다양하게 존재한다. 위 그림은 git으로 나와있지만, git 이외에도 다음과 같은 저장 방식을 제공하므로 필요에 맞게 저장소를 선택하면 된다.

  1. Git repo
  2. AWS S3
  3. Redis
  4. JDBC
  5. File
  6. Vault

Spring Cloud Config 설정 정보 갱신

Spring Cloud Config 의 장점 중 하나가 설정 정보를 변경하여도 재배포가 필요없다는 것이다.
저장소에 변경 사항이 발생하면 Config Sever 에서 이를 탐지할 수 있다. 그러나 Client에 변경 사항이 반영되려면 다음과 같은 별도의 조치가 필요하다.
예시에서는 1번 방법을 사용한다.

  1. actuator API 사용
  2. Spring Cloud Bus 사용
  3. Watcher 를 통해 변경 여부 확인

이제 본격적으로 구축 방법에 대해 다음과 같은 순서로 알아보자.

  1. 설정 정보 저장소 구축
  2. Spring Cloud Config Server 구축
  3. 기존 서비스(Client)를 Config Sever 와 연동

설정 정보 저장소 구축

  1. 설정 파일을 저장할 저장소(git repo) 를 만들고 다음과 같이 파일을 생성 후, 중앙 관리할 설정 정보를 옮긴다.
    • 파일 이름 규칙 : {application name}-{profile}.yml
      application.yml // 공통
      application-local.yml // 로컬 환경
      application-dev.yml // 개발 환경
      application-prod.yml // 운영 환경
      Client 를 설정할 때 한번 더 설명하지만, 설정한 application name 을 client 쪽에서 맞춰줘야 한다.

Spring Cloud Config Server 구축

  1. 프로젝트를 생성 후에 spring cloud config server 의존성을 주입한다.

    <dependency>
     	<groupId>org.springframework.cloud</groupId>
     	<artifactId>spring-cloud-config-server</artifactId>
    </dependency>

    현재 본인이 사용할 spring boot version에 따라 spring cloud version이 달라지므로 확인하고 버전을 설정해야 한다.

  2. actuator 의존성을 주입한다.
    Client에서 설정 정보를 갱신하는 방법중에 하나인 actuator 를 사용하려면 의존성을 주입해야한다. 갱신 방법 중 다른 것을 사용한다면 이 과정을 패스해도 된다.

    <dependency>
     	<groupId>org.springframework.boot</groupId>
     	<artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  3. application.yml 에 다음의 설정을 추가한다.

    server:
      port: 8888
    spring:
      application:
        name: config
      cloud:
        config:
          server:
            git:
              uri: https://github.com/~ 
              search-paths: config-file/**
              default-label: main
              username: hyunjee
              password: dafsfsfad
    • config 서버는 기본으로 8888 사용
    • uri : 설정 파일이 있는 git repo 주소
    • default-label : git branch name, 설정 정보 저장소 repo 브랜치
    • search-paths : 설정 파일들을 찾을 경로, 설정 정보 저장소에서 설정 정보 파일 위치
    • username, password : https 를 사용 시 인증 수단

    저장소 주소를 ssh 나 https 로 설정하면 별도의 인증 값을 더 적어줘야 한다. (privateKey or password)

  4. 메인 클래스에 메인 클래스에 @EnableConfigServer 붙이기

    @SpringBootApplication
    @EnableConfigServer
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
  5. 설정 서버 실행 및 확인

    • spring cloud config server 의 endpoint 로 config server가 정상 동작하는지 확인한다.
      설정 정보 저장소에 존재하는 application-dev.yml 파일 정보를 읽고 싶다면
      http://localhost:8888/application/dev 라고 요청을 보내면 된다.
      응답값에 설정 정보들이 존재한다면 정상 동작하는 것이다.

    • Spring Cloud Config Sever Endpoint
      application-> application name
      label -> 설정 정보 저장소 브랜치

      - /{application}/{profile}[/{label}]
      - /{application}-{profile}.yml
      - /{label}/{application}-{profile}.yml
      - /{application}-{profile}.properties
      - /{label}/{application}-{profile}.properties

Spring Cloud Config Client 구축

  1. yml 에서 설정 정보를 읽어 올 수 있는 class 를 생성한다.
@Getter
@ConfigurationProperties("com.hyunjee")
@RefreshScope
public class Config {

    private String minFileSize;
    private String maxFileSize;

}
  • @RefreshScope 는 설정 정보가 변경되었을 때 설정 정보를 다시 불러오는 역할이며 설정 정보가 저장되어 있는 git repo 에 수정이 발생했을 때 /actuator/refresh 호출하면 변경된 설정 정보가 반영됨 -> actuator API 를 사용하지 않는다면 필요없다.
  1. Config Sever 와의 연동을 위해 Client yml 파일에 해당 설정을 추가한다.
spring:
  application:
    name: application
  profiles:
    active: dev
  config:
    import: optional:configserver:http://localhost:8888
  • spring.aplication.name - 설정 정보 저장소에서 지정한 application name
    설정 정보 저장소에서 application-dev.yml 이와 같은 형식으로 작성했다면 application name은 application 이다! client에서 설정하는 application name을 보고 설정 정보를 찾기 때문에 반드시 원하는 설정 정보의 application name을 적어줘야 한다.
  • spring.profiles.active - 구동 환경 설정, dev라고 할 경우 설정 정보 저장소에서 application-dev 파일을 읽게된다.
  • spring.config.import 설정 config server 주소를 입력, 여러개의 config server를 입력할 수도 있다. 여러개 입력했을 경우 첫번째 서버와 연결이 실패하면 두번째 서버와 연결한다.
    또한 config server와 통신에 실패했을 때 에러를 던지고 서버를 중지하려면 optional 부분을 제거하면 된다. optional을 붙였는데 통신에 실패한다면 외부의 설정 정보를 읽지 못하므로 내부의 설정 정보를 읽게 된다.

이렇게 Spring Cloud Config 의 개념과 구축 방법을 간단히 알아보았다. 사실 실무에서는 예시에 설명된 방식이 아닌 상황에 따른 다양한 방식을 고려하게 될 것이다. 그러므로 다음 편에는 실무에서 Spring Cloud Config 를 적용한 적용기를 올려보려고 한다.

References

https://mangkyu.tistory.com/253
https://mangkyu.tistory.com/254
https://godekdls.github.io/Spring Cloud Config/contents/

profile
Backend Developer👩‍💻
post-custom-banner

0개의 댓글