前面介绍了sleuth链路追踪。
本文使用zipkin来分析调用链,以及各阶段的耗时等问题。
简介
Zipkin是一个分布式追踪系统。 它有助于收集解决微服务架构中延迟问题所需的时序数据。
它负责数据收集、存储(第三方存储mysql、cassandra、elasticsearch)、分析。Zipkin的设计基于Google Dapper论文。
应用程序通过http、消息中间件等向zipkin server上报数据。
可通过Zipkin UI 查看依赖关系图,调用链,耗时等信息。

zipkin主要有四大组件构成
- collector: 收集器。对数据进行验证、存储、索引,方便后续使用。
- storage: 存储。保存收集器收集的追踪数据,默认保存到内存中,可选择使用Cassandra、ElasticSearch、MySQL。
- search: 从存储中查询和检索追踪信息的API。主要被web UI使用。
- web UI: 基于service, time, and annotations来查询追踪信息。不过该UI没有自带权限验证。
下面是用户通过http调用资源/foo
的追踪示例。(摘自官网)
当用户收到资源/foo
的返回后,会异步将生成的span发送的zipkin server。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| ┌─────────────┐ ┌───────────────────────┐ ┌─────────────┐ ┌──────────────────┐ │ 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 server
1 2
| curl -sSL https://zipkin.io/quickstart.sh | bash -s java -jar zipkin.jar
|
1
| docker run -d -p 9411:9411 openzipkin/zipkin
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> <version>2.9.0</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </exclusion> <exclusion> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-metrics-prometheus</artifactId> </exclusion> </exclusions> </dependency>
<dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> <version>2.9.0</version> </dependency>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.wekri.cloud.zipkinserver;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import zipkin.server.internal.EnableZipkinServer;
@EnableZipkinServer @SpringBootApplication public class ZipkinServerApplication {
public static void main(String[] args) { SpringApplication.run(ZipkinServerApplication.class, args); } }
|
启动后可查看ui http://host:ip/zipkin
数据上报
添加依赖
1 2 3 4 5 6 7 8
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
|
配置zipkin server地址:
1 2 3 4 5
| spring: application: name: serviceA zipkin: base-url: http://192.168.3.37:9411
|
查看
打开zipki UI
示例:http://docssleuth-zipkin-server.cfapps.io/zipkin/
zipkin API
https://zipkin.io/zipkin-api/
本文源码
资料:
https://github.com/spring-cloud/spring-cloud-sleuth#sleuth-adding-project
https://github.com/openzipkin/zipkin
https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
https://zipkin.io/