MSA 에서 분산 컴퓨팅 환경을 가짐으로서 클라이언트의 Request -> Response 까지 다양한 MS 를 거치게 된다.
이 과정을 하나의 트랜젝션으로 보았을 때에 , 작업 단위의 세부내용을 추적하는 것은 어려운 일이다.
이는 분산 추적 <- 이라는 개념으로 기술되며, Spring Cloud Netflix 에서는 이를 해결하기 위해 Sleuth 를 사용한다.
Sleuth 는 TraceID , SpanID 를 생성하여 로그에 아이디를 달아 넣어 추적한다.
Sleuth 가 제공하는 ID 의 체계
Span ID
- 작업의 기본단위. 서비스 호출시 새로운 Span 이 만들어진다.
- 값은 유일하며 64 bit ID 를 가진다.
- Description, key-value annotation, process ID 등의 추가정보를 가진다.
- Trace 에서 가장 먼저 만들어지는 Span 을 Root Span 이라고 한다.
Trace ID
- 최초의 Request 시에 Service 에서 만들어 낸다.
- 동일한 Trace ID 를 가지는 Span 을 묶어 Tree 로 구성한다.
- 값은 유일하며 64bit ID 를 가진다.
전체 트랜잭션의 Flow 를 확인하며, 트랜잭션 => Trace Id / 구간별 => Span Id 의 로그를 추적한다.
트위터가 제공하는 Zipkin , 구글의 Dapper 등의 UI 툴을 이용해 분산 추적을 쉽게 할 수 있다.
- 서비스 Request 시 API GateWay < (Ex : Zuul) 에서 gTxId (Global Transaction ID) 를 만든다.
- 각 서비스의 Logging 시에 gTxId 를 함께 Logging 한다. 다른 서비스로 넘어갈 때 Header 에 gTxId 를 포함한다.
기록되는 이벤트와 시간
- cs (Client Sent) : Span 의 시작
- sr (Server Received) : 서버가 Request 를 받아 Process 를 시작함. / 즉 sr - cs = 네트워크 지연시간 이 된다.
- ss (Server Sent) : Request 된 Process 의 완료 시점으로 Client 에 Response 를 전달한 시점. / ss - sr = 서버 요청 처리 시간
- cr (Client Received) : Span 종료 시점. / cr - cs = 클라이언트가 응답받는데 걸린시간.
** Client 는 요청을 보낸 쪽을 의미하며 단순한 Web Browser 를 의미하지 않는다. MS 가 MS 로 Request 를 보내면 요청을보낸 MS 가 Client 가 된다.
**서버가 Client 에 응답을 받아 처리를하면 Server Sent 를 하게 되며, 다른 MS 가 이를 받아도 Client Received 다.
Spring Cloud Sleuth 의 기능
- Slf4J 의 MDC ( Mapped Diagnostic Context ) 를 통하여 Trace 와 Span Id 를 로그에 추가한다.
- 적용구간 : Servlet Filter , Rest Template , Message , Channels , Zull Filters , Feign Client
2018-05-11 15:21:46.466 INFO [sleuth-example,8f8964f0eebf01a8,8f8964f0eebf01a8,false ] 2647 --- [nio-8080-exec-1] com.example.slueth.SleuthApplication : This is your home!
[appname ,traceId ,spanId ,exportable]
사용
- 필요의존 : 'org.springframework.cloud:spring-cloud-starter-sleuth'
이후 Slf4J 로 로깅시 해당 [ AppId , Trace ID , Span ID , Exportable ] 규격으로 출력 됨
Zuul 에서 라우팅 시킬때의 AppId , Trace Id, Span Id, Exportable
다른 서비스에서 받은 AppId , Trace Id, Span Id, Exportable
ZipKin
Zipkin 은 UI 를 제공하여 Slueth 가 달아놓은 Trace Id 와 Span Id를 가지고 작업을 추적한다.
- 필요의존 : org.springframework.cloud:spring-cloud-starter-zipkin
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
implementation 'org.springframework.cloud:spring-cloud-starter-zipkin'
깃 배쉬 같은 cml 로 jar 파일을 받을 수 있게 해놓았으니, 받아준다.
$ curl -sSL https://zipkin.io/quickstart.sh | bash -s
$ java -jar zipkin.jar
Application.yml
- spring.sleuth.sampler.probability : ZipKin 에 트랜잭션 값을 얼마나 보낼지의 여부 , default 0.1 ( 10%)
- spring.zipkin.base-url : Zipkin 서버의 Url
- Sleuth 에서 나오는 Exportable 은 Zikin 에 트랜잭션을 보냈는지에 대한 여부이다.
spring:
application:
name: zuul-service
sleuth:
sampler:
probability: 1.0
zipkin:
base-url: http://localhost:9411/zipkin/
'Cloud' 카테고리의 다른 글
Spring Cloud Bus (0) | 2020.12.15 |
---|---|
Config Server (0) | 2020.12.14 |
Hystrix (0) | 2020.12.08 |
Feign (0) | 2020.12.08 |
Ribbon (0) | 2020.12.08 |