服务调用链相关基础知识
调用链相关基础概念
Span
Span 是调用链追踪的最小单元模型。发送一个 RPC 请求可以作为一个 Span,同样发送一个 RPC 请求的响应也可以作为一个 Span。Span 的主要标识包括:唯一标识 ID,和标识其所属 Trace 的 traceId。Span 还可能包含其他内容,如:描述信息,带有时间戳的事件,标签,parentSpanId, process ID(通常为 IP 地址)
Span 可以启动或者终止,同时会跟踪时间信息。Span 一旦被创建,应该在未来的某个时间将其销毁。
Trace 中最初的 Span 称为父 Span,父 Span 的 SpanId 与 TraceId 相同。
Trace
一组层级关联的 Span 构成一个 Trace,Trace 形成一个树状结构。
Annotation
标识调用链中某一时刻中的事件,包括:
cs: client sent. 客户端发送请求,表示 span 的开始
sr: server recieved. 服务端接收到请求,sr 时刻减去 cs 时刻表示请求发送的网络延时
ss: server sent. 服务端发送响应,ss 时刻减去 sr 时刻表示服务端的处理时间
cr: client recieved. 客户端收到请求,表示 span 的结束。cr 时刻减去 cs 时刻表示客户端从发出请求到收到响应的总耗时
B3 Propagation Specification.
B3 : Abbreviation for BigBrotherBird.
B3 Propagation 规定了以x-b3-
开头,用于调用链上下文在服务间传播的报文头。
最常见的调用链上下文传播方式,是在通过客户端与服务端之间 RPC 调用时,复制上下文并通过报文传递,这种方式下,客户端与服务端之间的 RPC 调用采用相同的 span ID.
下面是采用多字段编码的通过 HTTP 传播调用链上下文的示例:
通常,是否采样的标识Sampling decision
会随 span 信息一同传递,但也可以单独传递,例如对于某些不需要进行调用链追踪的请求,可以减少报文传递消耗。如:
TraceId
TraceId 是一个 128-bit 或 64-bit 整型数字,唯一标识由一系列 Span 构成的 Trace.
SpanId
SpanId 是一个 64-bit 的整型数字,唯一标识 Trace 中的 Span,从而可以确定 Span 在 Trace 中的位置。根 Span 的 SpanId 与 TraceId 相同,其他 Span 则不同。
ParentSpanId
ParentSpanId 同样为一个 64-bit 的整型数字,标识当前 Span 的父 Span。根 Span 没有 ParentSpanId。
Sampling State
为了减少总的链路追踪数据,规定了采样机制。在 B3 中,采样状态随 Trace 确定。几种 State 如下:
Defer: 延迟确定。
Deny: 不采样。通过拒绝采样,可以从整体上降低链路追踪的系统消耗。在满足要求的情况下,应尽可能使用 Deny.
Accept: 采样。
Debug: 强制采样。Debug 通常用于生产环境定位问题。
最常见的采样方式是概率式,对 1/10000 的调用链进行采样。Debug 最少使用。
HTTP 编码方式
B3 支持多种编码方式,Multiple Headers、Single-Header、binary 等。
Multiple Headers,每个属性单独的 key,如:
Single-Header,所有属性通过一个固定的 keyb3
确定,格式b3={TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}
, 如:
Sleuth
sleuth: 侦探
Spring Cloud Sleuth 为分布式调用链提供基于 Spring Boot 的自动配置。主要提供如下几方面的功能:
Sleuth 会将 trace 和 span 信息添加至 MDC,这样就可以从日志中获取调用链信息并进一步加工。
Zipkin 在
brave-instrument-servlet
包中定义了TracingFilter
类,通过将其添加到 servlet FilterChain 中,在请求执行开始时进行调用链相关操作,包括:trace 和 span 信息的生成、将其添加到 Request Context 以及通过 Scope Decorator 向 MDC 添加 trace 信息等操作。Sleuth 实现类
Slf4jContextDecorator
实现 Zipkin 的CurrentTraceContext.ScopeDecorator
接口,将 trace/ span 等信息添加至 MDC。
监测应用的重要进出点,如:servlet filter, rest template, scheduled actions, message channels, feign client.
相关功能主要在
brave-instrumentation-xxx
依赖包中体现。如果添加了
spring-cloud-sleuth-zipkin
依赖,Sleuth 会生成兼容 Zipkin 格式的调用链数据并将其发送给 Zipkin 服务端,默认服务端地址为 localhost:9411,可以通过spring-cloud-sleuth-zipkin
配置服务端地址。
Zipkin
Zipkin 由 Twitter 开源,是一个分布式服务调用链追踪系统,支持调用链数据采集和查看。通过 Zipkin 提供的调用链追踪功能,可以定位分布式系统中可能存在的延迟。通过调用链,还可以查看服务之间的依赖拓扑关系。
从 2.0 版本开始,Sleuth 默认采用 Zipkin 作为调用链采集的实际底层库。
Zipkin 架构示意如下:
集成了 Reporter 的服务会在产生远程调用时,由 Reporter 向 Zipkin 服务报送调用量信息。Zipkin 支持以 HTTP、Kafka 等方式接受数据。Zipkin 服务会在接受到数据之后进行解析,并将数据信息持久化存储。用户可以通过查询服务查询获取期望的调用链数据。
版权声明: 本文为 InfoQ 作者【luojiahu】的原创文章。
原文链接:【http://xie.infoq.cn/article/dc8e941ec07c0374d6eb9eb32】。文章转载请联系作者。
评论