ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 마이크로서비스 추적을 위한 Spring Cloud Sleuth와 Zipkin 사용예제
    SpringBoot 2023. 10. 22. 22:04
    반응형

    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 대시보드에서는 서비스 간의 통신 경로, 각 서비스에서의 응답 시간 등의 정보를 시각적으로 확인할 수 있습니다. 이를 통해 성능 문제를 진단하고 해결하는 데 도움을 받을 수 있습니다.
    반응형
Designed by Tistory.