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 포트에서 실행합니다.
실행 및 확인
- 먼저 Zipkin 서버를 실행합니다.
- Service A와 Service B를 각각 실행합니다.
- 브라우저에서 http://localhost:8080/serviceA로 요청을 보냅니다.
- 브라우저에서 http://localhost:9411/zipkin/로 이동하여 Zipkin 대시보드를 엽니다.
- Zipkin 대시보드에서 "Find Traces" 버튼을 클릭하여 추적 정보를 검색하고 결과를 확인합니다.
- Zipkin 대시보드에서는 서비스 간의 통신 경로, 각 서비스에서의 응답 시간 등의 정보를 시각적으로 확인할 수 있습니다. 이를 통해 성능 문제를 진단하고 해결하는 데 도움을 받을 수 있습니다.
'SpringBoot' 카테고리의 다른 글
Java Heap 메모리 할당 과정 시퀀스 (0) | 2023.10.29 |
---|---|
JMX (Java Management Extensions) 이해하기 및 모니터링 도구 (0) | 2023.10.29 |
스프링 클라우드 스트림과 카프카를 활용한 마이크로서비스 이벤트 처리 (1) | 2023.10.22 |
몽고디비를 활용한 주문 프로세스 관리: 스텝별 상태 저장 및 조회 (0) | 2023.10.22 |
스프링의 RedisLockRegistry를 활용한 제한된 상품의 동시성 제어 및 주문 처리 (0) | 2023.10.09 |