课程名称:Java架构师-技术专家
课程章节: 阶段四 · 服务调用链追踪、消息驱动
课程讲师: 慕课讲师团队
课程内容
调用链路数据模型
Trace,Span,Annotatio
Sleuth数据结构
-
Trace :它就是从头到尾贯穿整个调用链的 ID ,叫做 Trace ID,不管调用链路中途访问了多少服务节点,在每个节点的 log 中都会打印同一个 Trace ID
-
Span:它标识了 Sleuth 下面一个基本的工作单元,每个单元都有一个独一无二的 ID。比如 服务 A 发起对 服务 B 的调用,这个事件就可以看作一个独立单元,生成一个独立 ID。
Span 不仅仅是一个 ID ,还包含一些其它的信息,比如时间戳,它标识了这个 Span 在执行过程中发起的一些特殊事件。
Annotation标记
一个 Span 可以包含多个 Annotation ,每个 Annotation 表示一个特殊事件,比如:
-
cs Client Sent,客户端发送了一个调用请求。
-
sr Server Received,服务端收到了来自客户端的调用
-
ss Server Sent,服务端将 Response 发送给客户端
-
cr Client Received:客户端收到了服务端发来的 Response
每个 Annotation 同样有一个时间戳字段,这样我们就能分析一个 Span 内部每个事件的起始和结束事件。
上面的图中调用了两个接口 Server 1 和 Service 2 ,整个调用过程的所有 Span 都有相同的 Trace ID,但每一个 Span 都有独立的 Span ID。其中 Service 1 对 Service 2 的调用分为两个 Span ,蓝色 Span 的时间跨度从调用发起直到调用结束,分别记录了 4 个特殊事件(对应客户端和服务端对Request 和 Response 的传输)。绿色 Span 主要针对 Service 2 内部业务的处理,因此我们在 Service2 中打印的日志会带上绿色 Span 的 ID。
服务节点间的 ID 传递
Sleuth 通过 Filter 向 Header 中添加追踪信息。
HTTP Header Name
Trace Data
X-B3-TraceId
Trace ID
链路全局唯一ID
X-B3-SpanId
Span ID
当前 Span 的 ID
X-B3-ParentSpanId
Parent Span ID
前一个Span 的ID
X-Span-Export
Can be exported for sampling or not
是否可以被采样
在调用下一个服务的时候,Sleuth 会在当前的 Request Header 中写入上面的信息,这样下游系统就很容易识别出当前 Trace ID以及它的前置 Span ID 是什么。
整合 Sleuth 追踪调用链路
-
创建 sleuth-traceA 和 sleuth-traceB,添加 Sleuth 依赖
-
调用请求链路,查看 log 中的信息
-
采样率设置
课程收获
今天学习的收获是
-
链路追踪后面的数据结构
-
Sleuth 是如何在不同服务节点之间传递数据的。