一、为什么要服务跟踪

1、微服务的现状
随着业务的发展,单体架构变为微服务架构,并且系统规模也变得越来越大,各微服务间的调用关系也变得越来越复杂。

2、多服务协同工作
在微服务的应用中,一个由客户端发起的请求,在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果。

3、复杂的调用链条容易出错
在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链,在每条链路中任何一个依赖服务出现延迟或超时错误,都有可能引起整个请求最后的失败。

4、举个例子
在微服务系统中,一个来自用户的请求,请求先达到前端A(如前端界面),然后通过远程调用,达到系统的中间件B、C(如负载均衡、网关等),最后达到后端服务D、E,后端经过一系列的业务逻辑计算最后将数据返回给用户。对于这样一个请求,经历了这么多个服务,怎么样将它的请求过程的数据记录下来呢?这就需要用到服务链路追踪。

二、服务跟踪解决了什么问题

1、微服务跟踪
微服务跟踪其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集、数据传输、数据存储、数据分析、数据可视化),捕获此类跟踪让我们构建用户交互背后的整个调用链的视图,这是调试和监控微服务的关键工具。

2、spring cloud sleuth有5个特点
(1)提供链路追踪
通过sleuth可以很清楚的看出一个请求都经过了哪些服务。可以很方便的理清服务间的调用关系。

(2)性能分析
通过sleuth可以很方便的看出每个采样请求的耗时,分析出哪些服务调用比较耗时。当服务调用的耗时随着请求量的增大而增大时,也可以对服务的扩容提供一定的提醒作用。

(3)数据分析,优化链路
对于频繁的调用一个服务,或者并行的调用等,可以针对业务做一些优化措施。

(4)可视化错误
对于程序未捕捉的异常,可以在zipkin界面上看到。

三、sleuth使用

1、在需要跟踪的模块pom文件中添加

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

2、配置文件设置日志级别

#设置springboot日志级别
logging:
  level:
    root: debug

3、访问接口
在日志中找到:

X-B3-TraceId: 610569a1143fd7b0
X-B3-SpanId: b00c9f505dc9bd00
X-B3-ParentSpanId: 610569a1143fd7b0
X-B3-Sampled: 0

4、说明
(1)trace
从客户发起请求(request)抵达被追踪系统的边界开始,到被追踪系统向客户返回响应(response)为止的整个过程。

(2)span
每个trace中会调用若干个服务,为了记录调用了哪些服务,以及每次调用的消耗时间等信息,在每次调用服务时,埋入一个调用记录。

(3)X-B3-ParentSpanId
标识当前工作单元所属的上一个工作单元。

(4)X-B3-Sampled
是否采样,1表示需要被输出,0表示不需要被输出。

(5)X-B3-TraceId
一条请求链路(trace)的唯一标识,必须值。

(6)X-Span-Name
工作单元名称,例如http:/user/login。

(7)X-B3-SpanId
一个工作单元(span)的唯一标识,必须值。
每个微服务有一个spanId,而整个链条只有一个traceId。