본문 바로가기

자바 심화/TIL

MSA - 기초 5

 

MSA - 기초 4

MSA - 기초 3MSA 기초 MSA - 기초 2MSA MSA - 기초 1개요추후 MSA를 사용한 프로젝트를 진행하기 앞서 MSA가 무엇이고 어떻게 사용하는지에 대해 배워보려고 한다.다만, MSA에 대한 이론부터 완벽하게 익

eleunadeu.tistory.com

 

개요

Spring Cloud의 분산 추적(Spring Cloud Sleuth, Zipkin)과 스트림(Stream)에 대해 간단하게 정리하고 사용법을 배워볼 것이다.

 

분산 추적(distributed tracing)

Spring Cloud의 분산 추적은 마이크로서비스 아키텍처에서 서비스 간의 요청 흐름을 추적하고 모니터링하는 기능을 제공.

여러 서비스가 협력하여 처리하는 요청의 흐름과 성능 데이터를 수집하여 문제 디버깅성능 최적화에 도움.

주요 개념:

  1. Trace: 하나의 요청 전체에 대한 고유한 ID로, 요청이 시작부터 끝까지 추적된다.
  2. Span: 요청 내에서 개별 작업 단위를 나타내며, 시작 및 종료 시간과 같은 데이터를 포함한다.
  3. Propagation: Trace와 Span 정보를 서비스 간에 전달하여 요청 흐름을 연결한다.

구성 요소:

  • Spring Cloud Sleuth:
    • 분산 추적을 위한 데이터 생성 및 전파를 담당.
    • Trace와 Span ID를 자동 생성하고 로깅 프레임워크와 통합.
  • Zipkin:
    • 수집된 데이터를 저장하고 시각화.
    • 요청 흐름과 병목 구간을 쉽게 파악.

작동 방식:

  1. 클라이언트가 요청을 보내면 Sleuth가 Trace/Span ID를 생성.
  2. 요청이 서비스 간 전파될 때 ID가 함께 전달.
  3. 각 서비스에서 작업이 완료되면 관련 데이터를 수집하여 Zipkin 등으로 전송.
  4. Zipkin UI에서 전체 요청 흐름과 성능 데이터를 시각적으로 확인.

장점:

  • 서비스 간 호출 관계를 파악하여 디버깅과 장애 원인 분석에 도움.
  • 성능 병목 구간을 식별하여 최적화 가능.
  • 서비스 호출 흐름을 쉽게 이해하고 관리.

 

Zipkin 주요 특징

 

  1. 분산 추적: 여러 마이크로서비스 간의 요청 경로와 타임라인을 추적한다.
  2. 데이터 수집: Spring Cloud Sleuth와 연동하여 Trace와 Span 데이터를 생성하고 수집한다.
    • Trace: 요청 전체의 흐름을 나타낸다.
    • Span: 특정 작업 단위를 나타내며 시작 및 종료 시간을 포함한다.
  3. 시각화: Zipkin UI를 통해 추적 데이터를 시각적으로 확인할 수 있다.
  4. 통합성: Spring Boot와 쉽게 통합되며 Kafka, RabbitMQ, HTTP, gRPC 등 다양한 방식으로 데이터를 전송할 수 있다.

 

구성 요소

  • Zipkin Server: 수집된 추적 데이터를 저장하고 조회하는 역할을 한다.
  • Zipkin Client: 추적 데이터를 생성하고 서버로 전송한다.

 

ZipKin 서버 설정

Docker를 사용해 Zipkin 서버를 실행할 수 있다.

docker run -d -p 9411:9411 openzipkin/zipkin

 

 

 

  • 인텔리제이의 터미널을 사용해 명령어를 실행시켰다.

Zipkin 대시보드 사용

http://localhost:9411에 접속하면 Zipkin 대시보드를 확인할 수 있다.

  • 애플리케이션을 실행해 요청을 보내지 않았기 때문에 아무것도 없는 상태인 것을 확인할 수 있다.

 

분산 추적 실습

build.gradle dependency 추가

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-tracing-bridge-brave'
implementation 'io.github.openfeign:feign-micrometer'
implementation 'io.zipkin.reporter2:zipkin-reporter-brave'
  • 기존 SpringCloud 실습 코드에 위 dependency를 추가했다(서버 gradle 파일에는 추가 x).

application.yml에 zipkin 설정 추가

management:
  zipkin:
    tracing:
      endpoint: "http://localhost:9411/api/v2/spans"
  tracing:
    sampling:
      probability: 1.0
  • Zipkin을 사용하기 위한 기본 설정을 yml 파일에 추가(서버 yml에는 추가 x)
    • Zipkin으로 추적한 데이터를 전송할 기본 endpoint 및 추적 샘플링 확률 설정(기본 0.1)

 

Application 실행

1. Eureka Server → Order → Product

  • 실행 코드 파일은 로드 밸런싱 때 사용한 기본 코드 사용

2. PostMan 또는 Talend API로 Order API 호출

  • Order API는 성공적으로 동작했다.

3. Zipkin 대시보드 확인

  • ZipKin 대시보드의 Run Query를 누르면 방금 전 호출했던 API를 확인할 수 있다.

  • Show 버튼을 눌러 호출에 대한 상세한 정보도 확인할 수 있다.

 

스프링 클라우드 스트림(Spring Cloud Stream)

이벤트 드리븐 아키텍처(Event-Driven Architecture, EDA)

개념

시스템 구성 요소들이 이벤트를 통해 비동기적으로 상호작용하는 아키텍처 스타일

 

  • 이벤트: 상태 변화나 작업 완료 등의 정보를 나타내는 메시지
  • 프로듀서: 이벤트를 발생시키는 주체
  • 컨슈머: 이벤트를 처리하거나 반응하는 주체

특징

 

  1. 비동기성: 프로듀서와 컨슈머가 느슨하게 결합되어 독립적으로 작동.
  2. 확장성: 다양한 컨슈머를 쉽게 추가 가능.
  3. 유연성: 시스템의 한 부분 변경이 다른 부분에 영향을 최소화.
  4. 실시간성: 이벤트 발생 시 즉시 반응 가능.

 

 

적용 사례

 

  • 주문 처리 시스템
  • IoT 데이터 처리
  • 실시간 알림 서비스

 

 

Spring Cloud Stream

개념

Spring 기반 마이크로서비스에서 이벤트 드리븐 아키텍처를 쉽게 구현하기 위한 프레임워크

 

핵심 구성 요소

 

  • Binder: 메시지 브로커와의 연결을 추상화.
  • Input/Output: 데이터 송수신 채널을 정의.
  • @EnableBinding@StreamListener: 메시지 채널 설정 및 이벤트 처리 메서드 정의.

동작 과정

 

  1. 이벤트를 발행: @Output으로 정의된 채널을 통해 메시지를 보냄.
  2. 이벤트를 구독: @Input으로 정의된 채널에서 메시지를 수신 및 처리.

 

장점

 

  1. 브로커 세부 구현에서 개발자를 분리.
  2. 설정 기반의 유연한 메시징 구성.
  3. 마이크로서비스 간의 간단한 통합.

구현 예시

  • Kafka 기반 Spring Cloud Stream
// 이벤트 발행 (Producer)
@EnableBinding(Source.class)
public class EventPublisher {
    private final MessageChannel output;

    public EventPublisher(Source source) {
        this.output = source.output();
    }

    public void sendEvent(String message) {
        output.send(MessageBuilder.withPayload(message).build());
    }
}

// 이벤트 처리 (Consumer)
@EnableBinding(Sink.class)
public class EventConsumer {
    @StreamListener(Sink.INPUT)
    public void handleEvent(String message) {
        System.out.println("Received event: " + message);
    }
}

 

 

 

정리

  • Spring Cloud의 분산 추적 시스템(Zipkin)과 이벤트 드리븐 아키텍처, Stream에 대해 간단하게 배우고 기본적인 사용법을 익혔다.
  • 분산 추적을 잘 활용하면 프로젝트를 개발하는데 도움이 될 것 같다.

'자바 심화 > TIL' 카테고리의 다른 글

Redis - Redis Template  (0) 2024.11.29
Docker - 기본 사용 및 Cl / CD  (5) 2024.11.28
MSA - 기초 4  (0) 2024.11.26
MSA - 기초 3  (0) 2024.11.25
MSA - 기초 2  (1) 2024.11.22