一、Zipkin 是什么?
Zipkin是一个分布式跟踪系统。它有助于收集解决服务体系结构中的延迟问题所需的时序数据。功能包括该数据的收集和查找。
如果日志文件中有跟踪ID,则可以直接跳至该跟踪ID。否则,您可以基于属性进行查询,例如服务,操作名称,标签和持续时间。将为您总结一些有趣的数据,例如在服务中花费的时间百分比以及操作是否失败。
二、架构概述
跟踪程序存在于您的应用程序中,并记录有关发生的操作的时间和元数据。它们通常会检测库,因此它们的使用对用户是透明的。例如,已检测的Web服务器记录它何时接收到请求以及何时发送响应。收集的跟踪数据称为跨度。
仪器的编写保证了生产的安全性和很少的开销。因此,它们仅在带内传播ID,以告知接收方正在进行跟踪。完成的跨度将带外报告给Zipkin,类似于应用程序异步报告指标的方式。
例如,当跟踪某个操作并且需要发出传出的http请求时,会添加一些标头来传播ID。标头不用于发送详细信息,例如操作名称。
在检测应用程序中将数据发送到Zipkin的组件称为Reporter。记者通过几种传输方式之一将跟踪数据发送到Zipkin收集器,后者将跟踪数据持久保存到存储中。稍后,API会查询存储以将数据提供给UI。
这是描述此流程的图:
三、流程实例
如概述中所述,标识符是带内发送的,详细信息是带外发送到Zipkin的。在这两种情况下,跟踪工具都负责创建有效的跟踪并正确呈现它们。例如,跟踪器可确保在带内(下行)和带外(与Zipkin异步)发送的数据之间保持奇偶校验。
这是http跟踪的示例序列,其中用户代码调用资源/ foo。这导致一个跨度,在用户代码收到http响应后,异步发送到Zipkin。
┌─────────────┐ ┌───────────────────────┐ ┌─────────────┐ ┌──────────────────┐
│ 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收集器。有三种主要的传输方式:HTTP,Kafka和Scribe。
五、存储
Zipkin最初是为了在Cassandra上存储数据而构建的,因为Cassandra具有可伸缩性,具有灵活的架构并在Twitter中大量使用。但是,我们使该组件可插入。除了Cassandra,我们还原生支持ElasticSearch和MySQL。其他后端可能会作为第三方扩展提供。
今天的分享就当这里,希望对大家有所帮助!
关注 Java有货领取更多资料
联系小编。微信:372787553,带您进群互相学习
左侧小编微信,右侧获取免费资料
技术博客:https://blog.csdn.net/weixin_38937840
SpringCloud学习代码: https://github.com/Dylan-haiji/javayh-cloud
Redis、Mongo、Rabbitmq、Kafka学习代码: https://github.com/Dylan-haiji/javayh-middleware
AlibabaCloud学习代码:https://github.com/Dylan-haiji/javayh-cloud-nacos
SpringBoot+SpringSecurity实现自定义登录学习代码:https://github.com/Dylan-haiji/javayh-distribution