20241128 TIL : Spring Cloud Config, 분산 추적(zipkin)

MCS·2024년 11월 28일

TIL

목록 보기
14/45

오늘 학습한 내용

  • Spring Cloud Config
    • Spring Cloud Config의 주요 기능
    • Spring Cloud Config 서버 및 클라이언트 설정
    • 환경별 구성 관리
    • 실시간 구성 변경
  • 분산 추적(zipkin)
    • zipkin이란?
    • zipkin 서버 설정

Spring Cloud Config

Spring Cloud Config는 분산 시스템 환경에서 중앙 집중식 구성 관리를 제공하는 프레임워크이다. 컨피그 서버를 통해 각 서비스의 설정을 관리하고, 변경 사항을 실시간으로 반영할 수 있다. 즉, 설정을 변경하기 위해 각 서비스를 재실행할 필요가 없어진다.

Spring Cloud Config의 주요 기능

  • 중앙 집중식 구성 관리: 모든 마이크로서비스의 설정을 중앙에서 관리
  • 환경별 구성: 개발, 테스트, 운영 등 환경별로 구성을 분리하여 관리 가능
  • 실시간 구성 변경: 설정 변경 시 애플리케이션을 재시작하지 않고도 실시간으로 반영할 수 있음

Spring Cloud Config 서버 및 클라이언트 설정

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

Spring Cloud Config 클라이언트

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

Spring Cloud Bus를 사용하면 설정 변경 사항을 실시간으로 클라이언트 애플리케이션에 반영할 수 있다. 이를 위해서는 메시징 시스템(RabbitMQ 또는 Kafka 등)을 사용하여 변경 사항을 전파해야 한다.

수동으로 /actuator/refresh 엔드포인트를 호출

  1. Config 서버에서 설정 파일을 변경한다.
  2. 클라이언트 애플리케이션의 /actuator/refresh 엔드포인트를 POST 요청으로 호출하여 변경된 설정을 반영한다.

이 방법은 간단하지만, 각 클라이언트 애플리케이션에서 수동으로 엔드포인트를 호출해야 한다는 단점이 있다.

Spring Boot DevTools

Spring Boot DevTools를 사용하면 개발 환경에서 파일 변경을 자동으로 감지하고 애플리케이션을 재시작할 수 있다. 이는 classpath 내의 파일 변경도 포함된다.

Git 저장소 사용

Spring Cloud Config 서버가 Git 저장소에서 설정 파일을 읽어오도록 설정할 수 있다. 이는 설정 파일의 변경 사항을 쉽게 반영하고, 여러 서비스 간에 일관된 구성을 유지하는 데 유용하다. 앞서 Config 서버 설정 과정에서 Git 저장소에서 설정 파일을 읽어오도록 지정했다.

분산 추적(zipkin)

분산 추적은 분산 시스템에서 서비스 간의 요청 흐름을 추적하고 모니터링하는 방법으로, 각 서비스의 호출 관계와 성능을 시각화하여 문제를 진단하고 해결할 수 있도록 돕는다.
분산 추적에서는 트레이스(Trace), 스팬(Span), 컨텍스트(Context)라는 주요 개념이 있다.

트레이스(Trace)

  • 트레이스(Trace) : 트레이스는 하나의 요청이 시작부터 끝까지 각 서비스를 거치는 전체 흐름을 나타냄
    • 하나의 트레이스는 여러 개의 스팬으로 구성
    • 분산 시스템에서 클라이언트의 요청이 여러 서비스로 전달될 때, 각 서비스 호출이 트레이스의 일부로 기록
    • 트레이스 ID는 각 스팬에 공통으로 부여되며, 이를 통해 전체 요청 흐름을 추적할 수 있음

스팬(Span)

  • 스팬(Span) : 스팬은 분산 추적에서 가장 작은 단위로, 특정 서비스 내에서의 개별 작업 또는 요청을 나타냄
    • 각 스팬은 시작 시간과 종료 시간을 기록하여 작업의 지속 시간을 나타냄
    • 스팬은 고유한 스팬 ID를 가지며, 이는 트레이스 ID와 함께 특정 작업을 식별하는 데 사용됨
    • 스팬은 부모-자식 관계를 가질 수 있으며, 이를 통해 호출 계층 구조를 표현
    • 스팬에는 메타데이터(태그, 로그, 이벤트 등)를 추가하여 상세한 정보를 기록할 수 있음

컨텍스트(Context)

  • 컨텍스트는 요청이 서비스 간에 전달될 때 함께 전파되어, 각 서비스가 요청의 전체 흐름에 대한 정보를 가질 수 있게 함
  • 컨텍스트는 트레이스 ID, 스팬 ID, 부모 스팬 ID 등의 정보를 포함하여 각 서비스가 요청의 출처와 경로를 추적할 수 있도록 도움
  • 서비스 호출 간에 컨텍스트를 유지함으로써, 분산 시스템 전체에서 일관된 추적이 가능

분산 추적이 필요한 이유

  • 마이크로서비스 아키텍처에서는 여러 서비스가 협력하여 하나의 요청을 처리함
  • 서비스 간의 복잡한 호출 관계로 인해 문제 발생 시 원인을 파악하기 어려움
  • 분산 추적을 통해 각 서비스의 호출 흐름을 명확히 파악하고, 성능 병목이나 오류를 빠르게 진단 가능

zipkin이란?

Zipkin은 트레이스 데이터를 수집하고 시각화하는 분산 추적 시스템으로, 각 서비스의 트레이스와 스팬 데이터를 저장하고, 이를 통해 호출 흐름을 시각화한다.

주요 특징

  • 데이터 수집 및 저장: 각 서비스에서 전송된 트레이스 데이터를 수집하고 저장
  • 시각화: 트레이스 데이터를 시각화하여 서비스 간의 호출 관계를 명확히 파악 가능
  • 검색 및 필터링: 특정 트레이스나 스팬을 검색하고 필터링하여 문제 진단 가능

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를 호출하는 과정이 트래킹 되는 것을 확인 할 수 있다.

profile
백엔드를 잘 하고 싶은 사람

0개의 댓글