Sleuth基本知识
概述&简介
随着业务的发展,单体架构变为微服务架构,并且系统规模也变得越来越大,各微服务间的调用关系也变得越来越复杂。在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟超时或者错误都有可能引起整个请求最后的失败。Spring Cloud Sleuth为Spring Cloud实现了分布式的跟踪解决方案。Sleuth提供了以下功能:
- 链路追踪:通过Sleuth可以很清楚的看出一个请求都通过了哪些服务,可以很方便的理清服务间的调用关系;
- 性能分析:通过Sleuth可以很方便的看出每个采样请求的耗时,分析服务瓶颈;
- 数据分析,优化链路: 对于频繁调用一个服务或者并行调用,可以针对业务做一些优化措施;
- 可视化:Sleuth兼容Zipkin(官方文档推荐),HTrace等可视化日志信息,便于日志分析。
基本概念
在SpringCloud Sleuth中常见到Span,Trace,Annotations等术语,以下将逐一介绍这几种术语:
- span:span是Sleuth中的基本工作元。在微服务服务调用中,每次发送一个远程调用,服务就会产生一个span。span有一个唯一标志的64位的span id。服务初始span定义为root span,其下每个span均有其parent id(其父节点的span id)。通过计算span的开始和结束时间,就可以统计服务调用所花费的时间。
- Trace:Trace是span的集合,是一系列span组成的树状结构。一个Trace可以认为是一次完整的链路,其Trace id用于标志不同的链路信息。
- Annotations:通过span和trace记录了服务请求节点信息和链路信息之后,需要用annotations记录请求基础信息。在annotains中主要存在以下几个指标:
- cs:即Client Sent,标志客户端发送请求时间,该annotation描述了span的开始时间;
- ss:即Server Sent,标志服务器请求处理完成时间(Tips:ss 减去 sr 时间戳便可得到服务端处理请求需要的时间。);
- sr:即Server Received,标志服务器获得请求时间(Tips:sr 减去 cs 时间戳便可得到网络延迟。);
- cr:即Client Received,标志客户端接收到服务端回复的时间,该annotation描述了span的结束时间(Tips:cr 减去 cs 时间戳便可得到客户端从服务端获取回复的所有所需时间。);
链路追踪原理
"链路追踪"这一名词最早出现在谷歌于2010年发布的Dapper论文中。在论文中介绍了谷歌分布式系统跟踪的基础原理和架构,介绍了谷歌以低成本实现应用级透明的遍布多个服务的调用链跟踪系统方法。
服务调用结构往往是一个树形结构,其中每一个树节点对应为Sleuth的每一个基本工作单元Span,节点之间的连线表示Span和其父节点Span之间的一次请求和响应的调用关系。谷歌的Dapper论文通过增加应用层的标记对服务化中的请求和响应建立联系,例如通过HTTP协议头携带标记信息,标记信息包括标示调用链的唯一ID,在Sleuth中叫作TraceID,以及标示调用层次和顺序的SpanID和ParentSpanID。
前端接收用户请求后会为用户分配一个TraceID,在内部服务调用时,会通过应用层的协议将TraceID传递到下层服务,直到整个调用链的每个节点都拥有TraceID,这样在系统出现问题时,可以使用这个唯一TraceID迅速问题发生的节点。
TraceID解决了系统串联的问题,但是我们无法标识和恢复这些请求和响应调用时的顺序和层级关系.
因此我们需要附加的信息在系统之间的请求和响应消息中传递,它就是SpanID,这里SpanID包含SpanID和ParentSpanID
SpanID和ParentSpanID组合在一起就可以表示一个树形的调用关系,SpanID表示当前为一个调用节点,ParentSpanID表示这个调用节点的父节点。
链路跟踪系统对比
Google Dapper论文发出来之后,很多公司基于链路追踪的基本原理给出了各自的解决方案,如Twitter的Zipkin,Uber的Jaeger,pinpoint,Apache开源的skywalking,还有国产如阿里的鹰眼,美团的Mtrace,滴滴Trace,新浪的Watchman,京东的Hydra,不过国内的这些基本都没有开源。为了便于各系统间能彼此兼容互通,OpenTracing组织制定了一系列标准,旨在让各系统提供统一的接口。
下面对比一下几个常见的开源组件:
pinpoint | zipkin | jaeger | skywalking | |
---|---|---|---|---|
OpenTracing兼容 | 否 | 是 | 是 | 是 |
客户端支持语言 | Java、php | Java、C#、go、php等 | Java、C#、go、php等 | Java、.NET Core、NodeJS and php |
存储 | hbase | ES、mysql、Cassandra,内存 | ES、Kafka、Cassandra、内存 | ES、H2、mysql、TiDB、sharding sphere |
传输协议 | thrift | http、MQ | UDP、HTTP | gRPC |
ui丰富程度 | 高 | 低 | 中 | 中 |
实现方式-代码侵入性 | 字节码注入,无侵入 | 拦截请求,侵入 | 拦截请求,侵入 | 字节码注入,无侵入 |
扩展性 | 低 | 高 | 高 | 中 |
trace查询 | 不支持 | 支持 | 支持 | 支持 |
告警支持 | 支持 | 不支持 | 不支持 | 支持 |
jvm监控 | 支持 | 不支持 | 不支持 | 支持 |
性能损失 | 高 | 中 | 中 | 低 |
附各大开源组件的地址:
- zipkin:https://zipkin.io/
- Jaeger:www.jaegertracing.io/
- Pinpoint:https://github.com/pinpoint-apm/pinpoint
- SkyWalking:http://skywalking.apache.org/