1Zipkin 介绍 · SpringCloud微服务实战 · 看云

导航

1. 什么是 Zipkin

Zipkin是一种分布式跟踪系统。由Twitter公司开发,它有助于收集解决微服务架构中的延迟问题所需的时序数据。它管理这些数据的收集和查找。Zipkin的设计基于Google Dapper论文。


应用程序用于向Zipkin报告实时数据。Zipkin UI还提供了一个拓扑关系图,显示了每个服务调用的跟踪情况。如果要解决延迟问题或错误,可以根据应用程序,跟踪长度,注释或时间戳对所有跟踪进行筛选或排序。选择跟踪后,您可以看到每个跨度所需的总跟踪时间百分比,从而可以识别问题应用程序。

2. Zipkin 模块组成

f8400e9be214343d1f8605eae181b871_MD5.webp

Zipkin Server主要包括四个模块:

  1. Collector 接收或收集各应用传输的数据
  2. Storage 存储接受或收集过来的数据,当前支持Memory,MySQL,Cassandra,ElasticSearch等,默认存储在内存中。
  3. API(Query) 负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给web UI使用
  4. Web 提供简单的web界面

3. Zipkin 的 spanId、traceId、parentId

在追踪日志中,spanId、traceId、parentId 用来显示链路关联。

  • traceId:用来确定一个追踪链的16字符长度的字符串,在某个追踪链中保持不变。
  • spanId:区域Id,在一个追踪链中spanId可能存在多个,每个spanId用于表明在某个服务中的身份,也是16字符长度的字符串。
  • parentId:在跨服务调用者的spanId会传递给被调用者,被调用者会将调用者的spanId作为自己的parentId,然后自己再生成spanId。

4. 流程示例

这是http跟踪的示例序列,其中用户代码调用资源/ foo。这会发生远程调用,在用户代码收到http响应后,异步把监控日志发送给目标是baseUrl指向的Zipkin服务器,会自动调用Zipkin的某个rest接口将监控日志传给它到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--                        │
                             └────────────────────────────────┘