如果能跟踪每个请求,中间请求经过哪些微服务,请求耗时,网络延迟,业务逻辑耗时等。我们就能更好地分析系统瓶颈、解决系统问题。因此链路跟踪很重要。
链路追踪目的:解决错综复杂的服务调用中链路的查看。排查慢服务。
市面上链路追踪产品,大部分基于 google的Dapper论文 。
Sleuth是Spring cloud的分布式跟踪解决方案。
span(跨度),基本工作单元。一次链路调用,创建一个span,span用一个64位id唯一标识。包括:id,描述,时间戳事件,spanId,span父id。
span被启动和停止时,记录了时间信息,初始化span叫:root span,它的span id和trace id相等。
trace(跟踪),一组共享“root span”的span组成的树状结构 称为 trace,trace也有一个64位ID,trace中所有span共享一个trace id。类似于一颗 span 树。
annotation(标签),annotation用来记录事件的存在,其中,核心annotation用来定义请求的开始和结束。
其实数据结构是一颗树,从root span 开始。
在每个需要被监控的系统的pom中引入:
<!-- 引入sleuth依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
启动后,日志中可以看到类似于: [account-service,,,]
的数据,说明如下:
[服务名称,traceId(一条请求调用链中 唯一ID),spanID(基本的工作单元,获取数据等),是否让zipkin收集和展示此信息]
zipkin是twitter开源的分布式跟踪系统。
原理收集系统的时序数据,从而追踪微服务架构中系统延时等问题。还有一个友好的界面。
由4个部分组成:Collector(采集器)、Storage(存储器)、Restful API(接口)、Web UI
sleuth收集跟踪信息通过http请求发送给zipkin server,zipkin将跟踪信息存储,以及提供RESTful API接口,zipkin ui通过调用api进行数据展示。
默认内存存储,可以用mysql,ES等存储。
在每个需要被监控的系统的pom中引入:
<!-- zipkin --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
在每个需要监听的服务的配置文件中加入:
spring: #zipkin zipkin: base-url: http://localhost:9411/ #采样比例1 sleuth: sampler: rate: 1
根据 zipkin官网中的Quickstart ,启动zipkin。