- Spring Cloud Config
- Spring Cloud Config의 주요 기능
- Spring Cloud Config 서버 및 클라이언트 설정
- 환경별 구성 관리
- 실시간 구성 변경
- 분산 추적(zipkin)
- zipkin이란?
- zipkin 서버 설정
Spring Cloud Config는 분산 시스템 환경에서 중앙 집중식 구성 관리를 제공하는 프레임워크이다. 컨피그 서버를 통해 각 서비스의 설정을 관리하고, 변경 사항을 실시간으로 반영할 수 있다. 즉, 설정을 변경하기 위해 각 서비스를 재실행할 필요가 없어진다.
- 중앙 집중식 구성 관리: 모든 마이크로서비스의 설정을 중앙에서 관리
- 환경별 구성: 개발, 테스트, 운영 등 환경별로 구성을 분리하여 관리 가능
- 실시간 구성 변경: 설정 변경 시 애플리케이션을 재시작하지 않고도 실시간으로 반영할 수 있음
build.gralde에 다음 의존성을 추가한다.
dependencies {
implementation 'org.springframework.cloud:spring-cloud-config-server'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
메인 클래스에 @EnableConfigServer 어노테이션을 추가한다.
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
application.yml 파일에 config 서버의 포트와 config 파일을 가져올 git을 설정한다.(git 이외에 다양한 저장소를 지원한다.)
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/my-config-repo/config-repo
clone-on-start: true
build.gradle에 다음 의존성을 추가한다.
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-config'
}
application.yml에 컨피그 서버를 찾을 수 있도록 설정을 추가한다.
spring:
application:
name: my-config-client
cloud:
config:
discovery:
enabled: true
service-id: config-server
eureka:
client:
service-url:
defaultZone: http://localhost:19090/eureka/
Config 서버는 환경별로 다른 설정 파일을 제공할 수 있다.
예를 들어, application-dev.yml, application-prod.yml 파일을 Git 저장소에 저장하여 환경별 설정을 관리한다.
클라이언트의 application.yml에서 프로필 설정을 통해 사용할 설정을 선택할 수 있다.
spring:
profiles:
active: dev
실시간 구성 변경을 반영하는 방법에는 여러 가지가 있다.
- Spring Cloud Bus
- 수동으로 /actuator/refresh 엔드포인트를 호출
- Spring Boot DevTools
- Git 저장소 사용
Spring Cloud Bus를 사용하면 설정 변경 사항을 실시간으로 클라이언트 애플리케이션에 반영할 수 있다. 이를 위해서는 메시징 시스템(RabbitMQ 또는 Kafka 등)을 사용하여 변경 사항을 전파해야 한다.
/actuator/refresh 엔드포인트를 POST 요청으로 호출하여 변경된 설정을 반영한다.이 방법은 간단하지만, 각 클라이언트 애플리케이션에서 수동으로 엔드포인트를 호출해야 한다는 단점이 있다.
Spring Boot DevTools를 사용하면 개발 환경에서 파일 변경을 자동으로 감지하고 애플리케이션을 재시작할 수 있다. 이는 classpath 내의 파일 변경도 포함된다.
Spring Cloud Config 서버가 Git 저장소에서 설정 파일을 읽어오도록 설정할 수 있다. 이는 설정 파일의 변경 사항을 쉽게 반영하고, 여러 서비스 간에 일관된 구성을 유지하는 데 유용하다. 앞서 Config 서버 설정 과정에서 Git 저장소에서 설정 파일을 읽어오도록 지정했다.
분산 추적은 분산 시스템에서 서비스 간의 요청 흐름을 추적하고 모니터링하는 방법으로, 각 서비스의 호출 관계와 성능을 시각화하여 문제를 진단하고 해결할 수 있도록 돕는다.
분산 추적에서는 트레이스(Trace), 스팬(Span), 컨텍스트(Context)라는 주요 개념이 있다.
- 트레이스(Trace) : 트레이스는 하나의 요청이 시작부터 끝까지 각 서비스를 거치는 전체 흐름을 나타냄
- 하나의 트레이스는 여러 개의 스팬으로 구성
- 분산 시스템에서 클라이언트의 요청이 여러 서비스로 전달될 때, 각 서비스 호출이 트레이스의 일부로 기록
- 트레이스 ID는 각 스팬에 공통으로 부여되며, 이를 통해 전체 요청 흐름을 추적할 수 있음
- 스팬(Span) : 스팬은 분산 추적에서 가장 작은 단위로, 특정 서비스 내에서의 개별 작업 또는 요청을 나타냄
- 각 스팬은 시작 시간과 종료 시간을 기록하여 작업의 지속 시간을 나타냄
- 스팬은 고유한 스팬 ID를 가지며, 이는 트레이스 ID와 함께 특정 작업을 식별하는 데 사용됨
- 스팬은 부모-자식 관계를 가질 수 있으며, 이를 통해 호출 계층 구조를 표현
- 스팬에는 메타데이터(태그, 로그, 이벤트 등)를 추가하여 상세한 정보를 기록할 수 있음
- 컨텍스트는 요청이 서비스 간에 전달될 때 함께 전파되어, 각 서비스가 요청의 전체 흐름에 대한 정보를 가질 수 있게 함
- 컨텍스트는 트레이스 ID, 스팬 ID, 부모 스팬 ID 등의 정보를 포함하여 각 서비스가 요청의 출처와 경로를 추적할 수 있도록 도움
- 서비스 호출 간에 컨텍스트를 유지함으로써, 분산 시스템 전체에서 일관된 추적이 가능
- 마이크로서비스 아키텍처에서는 여러 서비스가 협력하여 하나의 요청을 처리함
- 서비스 간의 복잡한 호출 관계로 인해 문제 발생 시 원인을 파악하기 어려움
- 분산 추적을 통해 각 서비스의 호출 흐름을 명확히 파악하고, 성능 병목이나 오류를 빠르게 진단 가능
Zipkin은 트레이스 데이터를 수집하고 시각화하는 분산 추적 시스템으로, 각 서비스의 트레이스와 스팬 데이터를 저장하고, 이를 통해 호출 흐름을 시각화한다.
- 데이터 수집 및 저장: 각 서비스에서 전송된 트레이스 데이터를 수집하고 저장
- 시각화: 트레이스 데이터를 시각화하여 서비스 간의 호출 관계를 명확히 파악 가능
- 검색 및 필터링: 특정 트레이스나 스팬을 검색하고 필터링하여 문제 진단 가능
다음 명령어를 실행해 zipkin 서버를 도커를 통해 실행한다.
docker run -d -p 9411:9411 openzipkin/zipkin
http://localhost:9411 주소를 통해 zipkin 대시보드에 접속할 수 있다.

기존에 실습했던 product, order 서비스를 사용했다. RUN QUERY를 클릭하면 리스트가 나오며 Spans 3 인 항목의 SHOW를 클릭한다.

Order-service가 Product-service를 호출하는 과정이 트래킹 되는 것을 확인 할 수 있다.