目录
一、介绍
Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。
二、架构
Zipkin分为两部分:
- zipkin server
- zipkin client
zipkin server
用来作为数据的采集存储、数据分析与展示。
主要包括四个模块:Collector、Storage、API、UI
- Collector: 收集器组件,主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin内部处理的Span格式,以支持后续的存储,分析,展示等功能
- Storage:存储接收或收集过来的数据(支持Memory,MySQL,Cassandra,ElasticSearch…),默认存储在内存中
- API:提供对外的查询接口
- UI:提供对外的Web界面,通过UI组件用户可以方便而有直观地查询和分析跟踪信息
zipkin client
完成了追踪数据的生成与上报功能
三、基本概念
Annotation
记录某个时间点发生的事件,事件类型有四种:
- cs(Client Send):客户端发送请求
- sr(Server Recevied):服务端接收请求开始进行处理
- ss(Server Send):服务端处理完毕,发送至客户端
- cr(Cilent Recevied):客户端接收到服务端的响应,请求结束
BinaryAnnotation
提供一些额外信息(比如:sessionID、userID、userIP、异常等),可以将需要的数据以键值对的形式放入到这个字段中
Span
追踪服务调用的基本结构,由一组Annotation和BinaryAnnotation组成,每个服务的处理跟踪是一个Span。
接收到请求后进行处理时,就生成一个Span,如果当前请求是由上游发送过来的请求,则将新建的Span的父节点设置成上一步请求的Span。
Trace
由一组traceId相同的Span串联形成一个树状结构,表示一条调用链路。
请求到达分布式系统的入口端点时,生成唯一的标识traceId,在分布式系统内部流转的时候,框架始终保持传递该唯一值
四、服务之间传递的信息结构
Trace的基本信息需在上下游服务之间传递,如下信息是必须的:
- Trace ID:起始(根)服务生成的TraceID
- Span ID:调用下游服务时所生成的Span ID
- Parent Span ID:父Span ID
- Is Sampled:是否需要采样
- Flags:告诉下游服务,是否是debug Reqeust
五、服务追踪流程
- 应用发起请求,经过Trace框架拦截
- 当前调用链的Trace信息添加到HTTP Header中
- 记录当前时间戳
- 将Trace相关的header信息携带上,发送请求
- 调用结束,记录当前花费时间
- 以上步骤产生的信息汇集成一个span,把span上传到zipkin的Collector模块
┌─────────────┐ ┌───────────────────────┐ ┌─────────────┐ ┌──────────────────┐
│ User Code │ │ Trace Instrumentation │ │ Http Client │ │ Zipkin Collector │
└─────────────┘ └───────────────────────┘ └─────────────┘ └──────────────────┘
│ │ │ │
┌─────────┐
│ ──┤GET /foo ├─▶ │ ────┐ │ │
└─────────┘ │ record tags
│ │ ◀───┘ │ │
────┐
│ │ │ add trace headers │ │
◀───┘
│ │ ────┐ │ │
│ record timestamp
│ │ ◀───┘ │ │
┌─────────────────┐
│ │ ──┤GET /foo ├─▶ │ │
│X-B3-TraceId: aa │ ────┐
│ │ │X-B3-SpanId: 6b │ │ │ │
└─────────────────┘ │ invoke
│ │ │ │ request │
│
│ │ │ │ │
┌────────┐ ◀───┘
│ │ ◀─────┤200 OK ├─────── │ │
────┐ └────────┘
│ │ │ record duration │ │
┌────────┐ ◀───┘
│ ◀──┤200 OK ├── │ │ │
└────────┘ ┌────────────────────────────────┐
│ │ ──┤ asynchronously report span ├────▶ │
│ │
│{ │
│ "traceId": "aa", │
│ "id": "6b", │
│ "name": "get", │
│ "timestamp": 1483945573944000,│
│ "duration": 386000, │
│ "annotations": [ │
│--snip-- │
└────────────────────────────────┘
六、安装Zipkin服务端
两个方式:
- 自己搭建Zipkin服务端
- 使用官方编译好的jar包
第一种方法,在网上看了一堆文章,只写了Zipkin的依赖没有提供版本号,结果一直导致依赖失败;写了版本号又因为和SpringBoot版本不兼容导致启动不了服务;
最后才知道,在Springboot 2.0以后,官方不再推荐自已搭建Zipkin模块,而是推荐使用官方编译好的Jar包
2.1 下载jar包
2.2 启动服务
打开cmd,在对应jar存放的目录下输入命令:
java -jar 文件全称
访问端口9441,显示以下界面代表安装成功