Spring Cloud Sleuth(一)简单实例及概念

本文基于Finchley.SR2。

1 概述

Spring Cloud Sleuth为Spring Cloud实现了分布式服务跟踪的解决方案。我们可以通过Spring Cloud Sleuth来获得一个调用链中,各个阶段的时间消耗、服务的异常信息、服务的性能瓶颈等信息。

2 简单实例

在我们进行基本概念的学习之前,我们先来看个Sleuth的简单实例。

将“spring-cloud-starter-sleuth”添加到我们的maven依赖中,如下:

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

这样我们的应用就拥有了Sleuth功能。启动应用,在应用中适当地输出日志,随便请求一个接口,我们就可以看下以下的日志输出。

2019-01-30 11:32:19.702  INFO [service-2,2f5d73210600f8a7,2f5d73210600f8a7,false] 38612 --- [nio-8002-exec-1] com.liutao.controller.UserController     : username:a's

上面的日志就是集成了Sleuth后的默认日志输出格式。

3 概念简述

上面的例子,我们看见了输出的日志中有"[service-2,2f5d73210600f8a7,2f5d73210600f8a7,false]"样式的内容,那么这一串内容代表了些什么意思呢?我们现在就来解开这个谜底。

service-2这是应用名称。

这里有两个字符串是相等的,其实这仅仅是一个巧合。第一字符串代表了TraceId,每一个调用链就有一个TraceId。第二个字符串是SpanId,每一个逻辑处理单元就有一个SpanId。最后一个布尔值是表示该条信息是否被用于展示。

我们来具体看看Sleuth有哪些属性。

Span:这是调用链中基本的工作单元,例如发送一个RPC请求是一个Span。每个Span都有一个64位的唯一的ID。Span也包含了其他的数据,例如描述、时间戳等。

Trace:一个由一组Span构成的树形结构。通常我们可以认为一个调用链就相当于一个Trace。

Annotation:用来记录事件的各个状态。通常我们可以用下面的内容来表示服务端和客户端在一个事件中的接收和发送状态。

  • cs:客户端发送状态。客户端已经发送了一个请求,这个注释表示一个Span的开始。
  • sr:服务端接收状态。服务端接收请求并且开始处理。根据sr和cs的时间,我们可以计算出来网络延迟。
  • ss:服务端发送状态。这个注释用于在一个请求处理已经完成(响应将发送给客户端)的时候。通过ss和sr的计算我们可以得到服务端处理请求耗费的时间。
  • cr:客户端接收状态。预示着Span结束。这个状态表示客户端已经成功收取到了响应从服务端。通过cr与cs的计算,我们可以的得到整个请求的耗时。

下面我们来看一张从SpringCloud官网获取的图:

Spring Cloud Sleuth(一)简单实例及概念

上图详细展示了整个RPC过程上面三个参数的变化情况。每个颜色代表了一个Span。

具体的实例代码请参考:Spring Cloud Sleuth

参考:

Spring Cloud官方文档