현재 Ficket 프로젝트는 user, admin, event, queue, ticketing, face 총 6개의 마이크로 서비스로 구성되어 있습니다. 기존 방식에서는 각 마이크로 서비스의 설정 파일이 개별적으로 관리되고 있어, 공통 설정을 변경할 때마다 모든 서비스를 수정해야 하는 불편함이 있었습니다. 이는 생산성과 운영 효율성을 저하시키고, 모든 서비스를 다시 빌드하고 배포해야 하는 문제를 발생시켰습니다.
이러한 문제를 해결하기 위해 설정 파일을 중앙에서 통합 관리할 수 있는 Config Server를 도입하였으며, 최종적으로 Spring Cloud Bus(RabbitMQ), Actuator, GitHub Private Repository, 비대칭키 암호화, 모니터링, Webhook 등을 사용해 설정 관리를 자동화하고자 합니다.
Spring Cloud Config는 MSA와 같은 분산 시스템에서 서버 및 클라이언트 구성에 필요한 설정 정보를 외부 시스템에서 중앙 집중적으로 관리하는 솔루션입니다.
새로운 프로젝트를 생성하고 다음과 같은 의존성을 추가합니다:
// Config Server
implementation 'org.springframework.cloud:spring-cloud-config-server'
@EnableConfigServer
어노테이션을 사용하여 해당 애플리케이션이 Config Server로 동작하도록 설정합니다:
@EnableConfigServer
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
server:
port: 8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: https://github.com/Fickets/config.git
default-label: main
search-paths: ConfigFiles
username: ${cloud.username}
password: ${cloud.password}
spring.cloud.config.server
: Spring Cloud Config Server 관련 설정을 정의합니다.git
: Git 저장소에서 Config 설정 파일을 가져옵니다.Private 레포지토리를 연동하는 방법은 SSH 키 등록 및 GitHub 계정 자체를 연동하는 방법이 있지만 저는 계정 연동 방식으로 진행했습니다.
Git 저장소를 Private으로 생성한 후, username
과 password
에는 Git 토큰을 발급받아 설정합니다.
해당 저장소에는 application-local.yml
, user-service-local.yml
, user-service-prod.yml
등의 설정 파일을 만들어 두었으며, Spring Cloud Config Server는 이 설정 파일들을 가져와서 다른 마이크로 서비스들에게 제공합니다.
각 마이크로 서비스에 다음과 같은 의존성을 추가합니다:
// Config 의존성
implementation 'org.springframework.cloud:spring-cloud-starter-config'
// Actuator 의존성
implementation 'org.springframework.boot:spring-boot-starter-actuator'
각 마이크로 서비스의 application.yml
파일을 다음과 같이 설정합니다:
server:
port: 0
spring:
application:
name: user-service
profiles:
active: local
config:
import: optional:configserver:http://localhost:8888
http://localhost:8888/user-service/local
로 GET 요청을 보내서, 설정 파일의 정보가 반환되면 성공입니다:
이렇게 해서 Config 서버를 생성하고 설정을 중앙 집중적으로 관리하는 과정을 마쳤습니다. 다음 단계에서는 Spring Cloud Bus, RabbitMQ, 비대칭키 암호화 등의 기능을 통해 더욱 효율적으로 설정을 관리할 수 있도록 하겠습니다.