Sleuth 是通过打入到 Log 中的“卧底”来串联前后日志的。你集成了 Sleuth 组件之后,
它会向你的日志中打入三个“特殊标记”,其中一个标记你应该已经清楚了,那便是
Trace ID。剩下的两个标记分别是 Span ID 和 Parent Span ID,这俩用来表示调用的前后
顺序关系。
所谓 Span,它是 Sleuth 下面的一个基本工作单元,当服务请求抵达当前单元时,Sleuth
就会为这个单元分配一个独一无二的 Span ID,并标记单元的开始时间和结束时间,这样
就可以记录每个单元的处理用时了。
而 Parent Span ID 呢,顾名思义,它指向了当前单元的父级单元,也就是上游的调用者。
一个环环相扣的调用链就通过 Parent Span ID 被串了起来。
从上面的图中可以看出,这个服务请求调用了三个微服务,分别为服务 A、服务 B 和服务
C。
在一条调用链中,不管你调用了多少个微服务,Sleuth 为本次调用生成的全局唯一 Trace
ID 都会贯穿整个链路,所图中三个微服务所对应的日志 Trace ID 都是 A1。
由于服务 A 是调用链的起点,所以它并没有父级单元,因此它的 Parent Span ID 为空,
而起始单元的 Span ID 和 Trace ID 则是相同的,值都为 A1 对于服务 B 来说,它的父级调用单元是服务 A,因此它的 Parent Span ID 指向了服务 A
的 Span ID,即 A1;同理,服务 C 的 Parent Span ID 指向了服务 B 的 Span ID,即
B2。