Cloud/MSA
[MSA] MSA 분산 추적
문승주
2024. 12. 2. 21:45
반응형
본 내용은 인프런의 이도원 님의 강의 "Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)" 내용을 바탕으로 정리한 내용입니다.
Zipkin이란?
- 분산 추적 시스템으로, 애플리케이션의 다양한 서비스 간의 트랜잭션을 추적하고 시각화하는 데 사용된다.
Zipkin의 기능
- 트레이스 수집: 여러 서비스에서 발생하는 트랜잭션 데이터를 수집하여, 요청의 흐름을 시각화
- 성능 분석: 각 서비스의 응답 시간과 실패율 등을 분석하여 성능 병목 현상 파악
- 서비스 간 호출 관계 시각화: 각 서비스가 어떻게 연결되어 있는지 표시
Sleuth란?
- Spring 애플리케이션에서 분산 추적을 쉽게 구현할 수 있도록 도와주는 라이브러리이다.
Trace ID
- 하나의 전체 요청을 나타내는 고유한 식별자로 클라이언트의 요청이 여러 서비스에 걸쳐 흐를 때, 이 ID는 모든 관련 스팬을 연결한다.
- 여러 서비스 간의 요청 흐름을 추적할 수 있도록 한다.
Span ID
- Span ID는 Trace ID 내에서 개별 작업이나 프로세스를 나타내는 고유한 식별자로 각각의 서비스에서 수행되는 특정 작업(스팬)에 대한 정보를 담고 있다.
- 요청의 특정 부분(예: 데이터베이스 쿼리, 외부 API 호출 등)의 시작과 끝을 기록한다.
- 부모-자식 관계를 정의하여 요청의 흐름을 더 세밀하게 추적할 수 있다.
Zipkin 서버 설치(Docker)
- Window에서 설치하려 했더니 설치가 복잡해서 도커 데스트탑 설치 후 Zipkin 설치
- https://zipkin.io/pages/quickstart.html 해당 페이지에서 Zipkin 다운로드 방법 확인 가능
Window PowerShell
docker run -d -p 9411:9411 openzipkin/zipkin
- Zipkin 이미지 다운로드 후 컨테이너를 실행한다.
- openzipkin/zipkin: Zipkin의 Docker 이미지
- -p 9411:9411: 9411 포트로 Zipkin UI에 접근 가능
- http://localhost:9411/zipkin/ URL 호출하여 Zipkin 사이트 접속
- 실습에 앞서 스프링 3.0 부터는 sleuth 서비스 하지 않는다 하여 현재 사용자, 주문 서비스의 스프링 부트 버전을 다운 그레이드 시켰다.
실습
UserService
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
- spring-cloud-starter-sleuth: Trace ID, Span ID 생성 및 추적 기능을 제공한다.
- spring-cloud-starter-zipkin: 생성된 추적 데이터를 Zipkin에 전송한다.
application.yml
# Zipkin settings
zipkin:
base-url: http://localhost:9411
enabled: true
# Sleuth settings
sleuth:
sampler:
probability: 1.0
- zipkin.base-url: Zipkin 서버의 주소를 지정하는데 기본적으로
localhost:9411
로 설정된다. - zipkin.enabled: Zipkin 추적 기능을 활성화한다.
- sleuth.sampler.probability: 추적할 요청의 비율을 설정하는데 1.0으로 설정하면 모든 요청을 추적한다.
OrderService
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
- spring-cloud-starter-sleuth: Trace ID, Span ID 생성 및 추적 기능을 제공한다.
- spring-cloud-starter-zipkin: 생성된 추적 데이터를 Zipkin에 전송한다.
application.yml
# Zipkin settings
zipkin:
base-url: http://localhost:9411
enabled: true
# Sleuth settings
sleuth:
sampler:
probability: 1.0
- zipkin.base-url: Zipkin 서버의 주소를 지정하는데 기본적으로
localhost:9411
로 설정된다. - zipkin.enabled: Zipkin 추적 기능을 활성화한다.
- sleuth.sampler.probability: 추적할 요청의 비율을 설정하는데 1.0으로 설정하면 모든 요청을 추적한다.
결과 확인
요청
- Postman으로 http://127.0.0.1:8080/userService/users/${userId} 를 Post 방식으로 호출
응답(로그 확인)
INFO [UserService,8bccea002ee3ae5c,8bccea002ee3ae5c] 37400 --- [o-auto-1-exec-4] c.e.UserService.service.UserServiceImpl : Before call OrderService
2024-07-14 00:31:00.025 DEBUG [UserService,8bccea002ee3ae5c,8d81e451f5f8680f] 37400 --- [pool-4-thread-9] c.e.U.client.OrderServiceClient : [OrderServiceClient#getOrders] ---> GET http://OrderService/orderService/f94f8fa2-7663-486b-9ab9-2f35726c76ac/orders HTTP/1.1
2024-07-14 00:31:00.025 DEBUG [UserService,8bccea002ee3ae5c,8d81e451f5f8680f] 37400 --- [pool-4-thread-9] c.e.U.client.OrderServiceClient : [OrderServiceClient#getOrders] ---> END HTTP (0-byte body)
2024-07-14 00:31:00.039 DEBUG [UserService,8bccea002ee3ae5c,8d81e451f5f8680f] 37400 --- [pool-4-thread-9] c.e.U.client.OrderServiceClient : [OrderServiceClient#getOrders] <--- HTTP/1.1 200 (13ms)
2024-07-14 00:31:00.040 DEBUG [UserService,8bccea002ee3ae5c,8d81e451f5f8680f] 37400 --- [pool-4-thread-9] c.e.U.client.OrderServiceClient : [OrderServiceClient#getOrders] connection: keep-alive
2024-07-14 00:31:00.040 DEBUG [UserService,8bccea002ee3ae5c,8d81e451f5f8680f] 37400 --- [pool-4-thread-9] c.e.U.client.OrderServiceClient : [OrderServiceClient#getOrders] content-type: application/json
2024-07-14 00:31:00.040 DEBUG [UserService,8bccea002ee3ae5c,8d81e451f5f8680f] 37400 --- [pool-4-thread-9] c.e.U.client.OrderServiceClient : [OrderServiceClient#getOrders] date: Sat, 13 Jul 2024 15:31:00 GMT
2024-07-14 00:31:00.040 DEBUG [UserService,8bccea002ee3ae5c,8d81e451f5f8680f] 37400 --- [pool-4-thread-9] c.e.U.client.OrderServiceClient : [OrderServiceClient#getOrders] keep-alive: timeout=60
2024-07-14 00:31:00.040 DEBUG [UserService,8bccea002ee3ae5c,8d81e451f5f8680f] 37400 --- [pool-4-thread-9] c.e.U.client.OrderServiceClient : [OrderServiceClient#getOrders] transfer-encoding: chunked
2024-07-14 00:31:00.040 DEBUG [UserService,8bccea002ee3ae5c,8d81e451f5f8680f] 37400 --- [pool-4-thread-9] c.e.U.client.OrderServiceClient : [OrderServiceClient#getOrders]
2024-07-14 00:31:00.041 DEBUG [UserService,8bccea002ee3ae5c,8d81e451f5f8680f] 37400 --- [pool-4-thread-9] c.e.U.client.OrderServiceClient : [OrderServiceClient#getOrders] [{"productId":"CATALOG-001","qty":1,"unitPrice":1500,"totalPrice":1500,"orderId":"d32f6a03-2a3e-418c-a88f-5e9eccc58b5c"},{"productId":"CATALOG-002","qty":1,"unitPrice":2000,"totalPrice":2000,"orderId":"b8db3d1d-57f2-4e7e-bacf-6e859577115e"}]
2024-07-14 00:31:00.041 DEBUG [UserService,8bccea002ee3ae5c,8d81e451f5f8680f] 37400 --- [pool-4-thread-9] c.e.U.client.OrderServiceClient : [OrderServiceClient#getOrders] <--- END HTTP (241-byte body)
2024-07-14 00:31:00.042 INFO [UserService,8bccea002ee3ae5c,8bccea002ee3ae5c] 37400 --- [o-auto-1-exec-4] c.e.UserService.service.UserServiceImpl : After call OrderService
- [UserService,8bccea002ee3ae5c,8bccea002ee3ae5c] 을 확인하면 앞 번호는 traceId 뒷 번호는 spanId 이다.
2024-07-14 00:31:00.037 INFO [OrderService,8bccea002ee3ae5c,2c15c5b1334071ab] 48212 --- [-auto-1-exec-10] c.e.O.controller.OrderController : After select orders
2024-07-14 00:31:21.805 INFO [OrderService,,] 48212 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
2024-07-14 00:36:21.810 INFO [OrderService,,] 48212 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
- [OrderSerivce,8bccea002ee3ae5c,2c15c5b1334071ab] 을 확인하면 앞 번호는 traceId 뒷 번호는 spanId 이다.
- Zipkin URL 접속: http://localhost:9411/zipkin/
- Trace ID 입력: "8bccea002ee3ae5c" 입력 후 조회
- 결과 확인
- 서비스 간의 호출 관계가 시각화되어 표시
- 요청이 UserService → OrderService로 연결된 경로와 각 호출의 소요 시간 확인 가능
구분 | Zipkin | Sleuth |
기능 | 트랜잭션 추적, 시각화 | Trace ID, Span ID 자동 생성 |
설치 | Docker로 설치 | Spring Boot에 라이브러리 추가 |
시각화 | 호출 관계 및 응답 시간 시각화 | Zipkin과 함께 사용해야 시각화 가능 |
중요 개념 | Trace, Span | Trace ID, Span ID 자동 관리 |
사용 목적 | 서비스 간 호출 흐름 및 병목 추적 | 마이크로서비스의 분산 추적 자동화 |
반응형