Sleuth链路追踪详解(作用原理及使用)

Sleuth链路追踪详解(作用原理及使用)-mikechen

Sleuth链路追踪是非常重要的微服务组件,也是大厂经常考察的,下面我就全面来详解Sleuth链路追踪@mikechen

Sleuth定义

Spring Cloud Sleuth 是 Spring Cloud的链路追踪组件,实现了分布式跟踪解决方案。

 

什么是链路追踪

链路追踪就是将一次分布式请求,还原成调用链路,进行:日志记录、性能监控、并将一次分布式请求的调用情况集中展示。

比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

 

Sleuth作用

随着微服务架构的流行,服务按照不同的维度进行拆分,在复杂的微服务架构系统中,会形成一个复杂的分布式服务调用链路,如下图所示:

Sleuth链路追踪详解(作用原理及使用)-mikechen

面对复杂的调用链路就带来一系列问题:

  • 如何快速发现问题?
  • 如何判断故障影响范围?
  • 如何梳理服务依赖以及依赖的合理性?
  • 如何分析链路性能问题以及实时容量规划?

而链路追踪的出现正是为了解决这种问题,它可以在复杂的服务调用中定位问题。

 

Sleuth原理

Sleuth核心概念

Spring Cloud Sleuth采用的是Google的开源项目Dapper的专业术语,span、Trace、Annotations。

Spring Clpud Sleuth 实现分布式系统中的服务跟踪功能,主要在于这三个关键点:

1.Span基本工作单元

例如:每次发送一个远程调用服务就会产生一个 Span,Span通过一个64位ID唯一标识,span还有其他数据信息,比 如摘要、时间戳事件、关键值注释(tags)、span的ID、以及进度ID(通常是IP地址) span在不断的启动和停止,同时记录了时间信息,当你创建了一个span,你必须在未来的某个时 刻停止它。

通过计算 Span 的开始和结束时间,就可以统计每个服务调用所花费的时间。。

 

2.Trace

一系列spans组成的一个树状结构,例如:如果你正在跑一个分布式大数据工程,你可能 需要创建一个Trace。

一个 Trace 认为是一次完整的链路,内部包含 n 多个 Span,Trace 和 Span 存在一对多的关系,Span 与 Span 之间存在父子关系。

 

3.Annotations

用来及时记录一个事件的存在,一些核心 annotations 用来定义一个请求的开始和结束。

 

Sleuth基本原理

Sleuth基本原理很简单,就是在入口生成(traceid,spanid),并在调用中将traceid传递下去。

如下图所示:显示了SpanTrace在系统中的外观。

Sleuth链路追踪详解(作用原理及使用)-mikechen

每个颜色的注解表明一个span,总计7个spans,从A到G。

 

Sleuth使用

通过查看日志分析微服务的调用链路并不是一个很直观的方案,Sleuth可以结合Zipkin可以很直观地显示微服务之间的调用关系。

如果你要追踪的服务实例,Sleuth的使用分为如下2步:

1.添加Maven依赖

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

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

2.添加配置

spring:
  zipkin:
    base-url: http://localhost:9411 #zipkin的服务地址,完成数据的展示
  sleuth:
    sampler:
      probability: 1 #采样率 1为全部采集,实际开发0.5即可

3.后台显示

然后就可以启动服务了,服务的调用在后台的zipkin界面会有显示,如下图所示:

Sleuth链路追踪详解(作用原理及使用)-mikechen

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法