본문 바로가기

Spring & Java

마이크로서비스 추적을 위한 Spring Cloud Sleuth와 Zipkin 사용예제

반응형

Spring Cloud Sleuth는 Spring Cloud 프레임워크의 일부로, 마이크로서비스 아키텍처에서 서비스 간의 요청 추적을 돕는 라이브러리입니다. 이를 통해 개발자는 마이크로서비스 간의 요청이 어떻게 흘러가는지, 각 서비스에서 소요되는 시간 등을 쉽게 확인하고 문제를 진단할 수 있습니다.

Spring Cloud Sleuth는 주로 다음과 같은 방법으로 작동합니다:

  • 각 마이크로서비스의 요청과 응답에 유니크한 ID를 부여하여 추적합니다.
  • 서비스 호출 체인을 통해 각 서비스의 응답 시간과 상태를 로깅합니다.
  • 이 정보를 이용하여 시각화 도구 (예: Zipkin)에 데이터를 전송하여, 서비스 간의 호출 관계와 응답 시간을 시각적으로 확인할 수 있게 해줍니다.

Spring Cloud Sleuth

Spring Cloud Sleuth는 Spring Cloud 프로젝트의 일부로, 마이크로서비스 간의 요청을 추적하는 데 도움을 줍니다. Sleuth는 각 서비스 호출에 유니크한 ID를 할당하고, 이 정보를 로그에 기록하여 서비스 간의 통신을 추적할 수 있도록 해줍니다.

Zipkin

Zipkin은 분산 시스템의 레이턴시 문제를 시각화하고 모니터링하는 도구입니다. Sleuth와 함께 사용하면, 서비스 간의 요청 경로, 각 서비스에서의 처리 시간 등을 시각적으로 확인할 수 있습니다.

예제 구현

다음은 Spring Cloud Sleuth와 Zipkin을 사용한 간단한 마이크로서비스 예제입니다. 이 예제에서는 두 개의 마이크로서비스 (Service A와 Service B)와 Zipkin 서버를 사용합니다.

Service B 

Service B는 간단한 REST 컨트롤러로 구성됩니다
build.gradle.kts:

plugins {
    kotlin("jvm") version "1.5.21"
    id("org.springframework.boot") version "2.5.4"
    id("io.spring.dependency-management") version "1.0.11.RELEASE"
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.cloud:spring-cloud-starter-sleuth")
}

application {
    mainClassName = "com.example.ServiceBApplication"
}

ServiceBApplication.kt:

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@SpringBootApplication
class ServiceBApplication

fun main(args: Array<String>) {
    runApplication<ServiceBApplication>(*args)
}

@RestController
class BController {
    @GetMapping("/serviceB")
    fun serviceB(): String {
        return "Hello from Service B"
    }
}

Service A 

Service A는 Service B를 호출하는 REST 컨트롤러로 구성됩니다.

build.gradle.kts:

plugins {
    kotlin("jvm") version "1.5.21"
    id("org.springframework.boot") version "2.5.4"
    id("io.spring.dependency-management") version "1.0.11.RELEASE"
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-webflux")
    implementation("org.springframework.cloud:spring-cloud-starter-sleuth")
}

application {
    mainClassName = "com.example.ServiceAApplication"
}

ServiceAApplication.kt:

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.reactive.function.client.WebClient

@SpringBootApplication
class ServiceAApplication

fun main(args: Array<String>) {
    runApplication<ServiceAApplication>(*args)
}

@RestController
class AController(val webClient: WebClient.Builder) {
    @GetMapping("/serviceA")
    suspend fun serviceA(): String {
        val response = webClient.build().get().uri("http://localhost:8081/serviceB").retrieve().bodyToMono(String::class.java).awaitSingle()
        return "Hello from Service A and $response"
    }
}

Zipkin 서버 설정

Zipkin 서버를 실행하려면, Docker를 사용하는 것이 가장 간단한 방법입니다.

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

이 명령어는 Zipkin 서버를 9411 포트에서 실행합니다.

실행 및 확인

  1. 먼저 Zipkin 서버를 실행합니다.
  2. Service A와 Service B를 각각 실행합니다.
  3. 브라우저에서 http://localhost:8080/serviceA로 요청을 보냅니다.
  4. 브라우저에서 http://localhost:9411/zipkin/로 이동하여 Zipkin 대시보드를 엽니다.
  5. Zipkin 대시보드에서 "Find Traces" 버튼을 클릭하여 추적 정보를 검색하고 결과를 확인합니다.
  6. Zipkin 대시보드에서는 서비스 간의 통신 경로, 각 서비스에서의 응답 시간 등의 정보를 시각적으로 확인할 수 있습니다. 이를 통해 성능 문제를 진단하고 해결하는 데 도움을 받을 수 있습니다.
반응형