目录
概况
Zipkin是Twitter开源而来。
Zipkin官网:https://zipkin.io/pages/architecture.html
基本思想:在服务调用的请求和响应中加入trace ID,标明上下游请求的关系。利用这些信息,可视化地分析服务调用链路和服务间的依赖关系,保存下来进行展示。
整体架构
组件说明
• Instrumented client和Instrumented server需要集成在分布式系统的具体服务中,采集跟踪信息,调用Transport,把跟踪信息发送给Zipkin的Server。
• Transport是Zipkin对外提供的接口,支持HTTP、Kafka、Scribe等通信方式。
• Zipkin即Zipkin server,主要包括四个模块:
Collector: 用于接收各个应用服务传输的追踪信息;
Storage:Zipkin的后端存储,支持In-Memory、MySql、Elasticsearch和Cassandra;
API:提供对外的查询接口;
UI:提供对外的Web界面。
支持多种语言集成:java、js、go、Python等
Http Tracing的时序图
Spring Cloud Sleuth
Sleuth 术语
- span(跨度):基本工作单元。例如,在一个新建的 span 中发送一个 RPC 等同于发送一个回应请求给 RPC,span 通过一个 64 位 ID 唯一标识,trace 以另一个 64 位 ID 表示,span 还有其他数据信息,比如摘要、时间戳事件、关键值注释(tags)、span 的 ID,以及进度 ID(通常是 IP 地址)。span 在不断的启动和停止,同时记录了时间信息,当你创建了一个 span,你必须在未来的某个时刻停止它。
- trace(追踪):一组共享“root span”的 span 组成的树状结构成为 trace。trace 也用一个 64 位的 ID 唯一标识,trace 中的所有 span 都共享该 trace 的 ID。
- annotation(标注):用来及时记录一个事件的存在,一些核心 annotations 用来定义一个请求的开始和结束。
1)、CS,即 Client Sent,客户端发起一个请求,这个 annotion 描述了这个 span 的开始。
2)、SR,即 Server Received,服务端获得请求并准备开始处理它,如果将其 SR 减去 CS 时间戳便可得到网络延迟。
3)、SS,即 Server Sent,注解表明请求处理的完成(当请求返回客户端),如果 SS 减去 SR 时间戳便可得到服务端需要的处理请求时间。
4)、CR,即 Client Received,表明 span 的结束,客户端成功接收到服务端的回复,如果 CR 减去 CS 时间戳便可得到客户端从服务端获取回复的所有所需时间。
下图演示了请求依次经过 SERVICE1 -> SERVICE2 -> SERVICE3 & SERVICE4 时,span、trace、annotation 的变化:
spring-cloud-sleuth-zipkin
spring-cloud-sleuth-zipkin来方便集成zipkin实现(指的是Zipkin Client,而不是Zipkin服务器)。可以通过spring-cloud-starter-zipkin依赖来引入,再通过spring配置sleuth及zipkin。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
spring:
zipkin:
base-url: http://localhost:9411
sender:
type: web
sleuth:
sampler:
probability : 1 # 1表示百分百进行采样
核心源码解析
https://www.shared-code.com/article/107
结合rabbitmq
在默认情况下,Zipkin客户端和Server之间是使用HTTP请求的方式进行通信(即同步的请求方式),在
网络波动,Server端异常等情况下可能存在信息收集不及时的问题。Zipkin支持与rabbitMQ整合完成异
步消息传输。
zipkin:
sender:
type: RABBIT #WEB方法为http, RABBIT为rabbit
enabled: true
discovery-client-enabled: false #为解析baseurl方式,true为lb:xxx-server
baseUrl: http://localhost:9411/
compression: # 压缩
enabled: true
locator: # 通过nacos动态获取地址
discovery:
enabled: true
rabbitmq: # 使用指定的队列
queue: xxx_zipkin
zipkin服务端
单独部署,启动后直接访问:http://localhost:9411
存储追踪数据
mysql、es、kafka等,生成上建议es或kafka。
可用mysql,根据Zipkin服务端提供脚本,直接初始化再启动。
结合日志TraceID实现链路追踪实现
在logback.xml中springProperty配置 [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}]输出。
在网关中通过Interceptor将Zipkin接口中TraceId加入header中,可通过页面查看生成的traceid。
可以在zipkin中直接通过traceId查找