写点什么

服务调用链相关基础知识

用户头像
luojiahu
关注
发布于: 2021 年 05 月 15 日
服务调用链相关基础知识

调用链相关基础概念

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 传播调用链上下文的示例:


   Client Tracer                                                  Server Tracer     ┌───────────────────────┐                                       ┌───────────────────────┐│                       │                                       │                       ││   TraceContext        │          Http Request Headers         │   TraceContext        ││ ┌───────────────────┐ │         ┌───────────────────┐         │ ┌───────────────────┐ ││ │ TraceId           │ │         │ X-B3-TraceId      │         │ │ TraceId           │ ││ │                   │ │         │                   │         │ │                   │ ││ │ ParentSpanId      │ │ Inject  │ X-B3-ParentSpanId │ Extract │ │ ParentSpanId      │ ││ │                   ├─┼────────>│                   ├─────────┼>│                   │ ││ │ SpanId            │ │         │ X-B3-SpanId       │         │ │ SpanId            │ ││ │                   │ │         │                   │         │ │                   │ ││ │ Sampling decision │ │         │ X-B3-Sampled      │         │ │ Sampling decision │ ││ └───────────────────┘ │         └───────────────────┘         │ └───────────────────┘ ││                       │                                       │                       │└───────────────────────┘                                       └───────────────────────┘
复制代码


通常,是否采样的标识Sampling decision会随 span 信息一同传递,但也可以单独传递,例如对于某些不需要进行调用链追踪的请求,可以减少报文传递消耗。如:


                                Server Tracer                                   ┌───────────────────────┐ Health check request         │                       │┌───────────────────┐         │   TraceContext        ││ GET /health       │ Extract │ ┌───────────────────┐ ││ X-B3-Sampled: 0   ├─────────┼>│ NoOp              │ │└───────────────────┘         │ └───────────────────┘ │                              └───────────────────────┘
复制代码

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,如:


X-B3-TraceId: 80f198ee56343ba864fe8b2a57d3eff7X-B3-ParentSpanId: 05e3ac9a4f6e3b90X-B3-SpanId: e457b5a2e4d86bd1X-B3-Sampled: 1
复制代码


Single-Header,所有属性通过一个固定的 keyb3确定,格式b3={TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}, 如:


b3: 80f198ee56343ba864fe8b2a57d3eff7-e457b5a2e4d86bd1-1-05e3ac9a4f6e3b90
复制代码

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 服务会在接受到数据之后进行解析,并将数据信息持久化存储。用户可以通过查询服务查询获取期望的调用链数据。

发布于: 2021 年 05 月 15 日阅读数: 36
用户头像

luojiahu

关注

喜欢思考组织、过程、产品的后端开发 2017.01.08 加入

还未添加个人简介

评论

发布
暂无评论
服务调用链相关基础知识