Zipkin
简介
Zipkin
是Twitter
开源的分布式跟踪系统,基于Dapper
的论文设计而来。它的主要功能是收集系统的时序数据,从而跟踪微服务架构的系统时序等问题。Zipkin
还提供了一个非常友好的界面,来帮助分析追踪数据。
编写Zipkin Server
- 新建项目,
pom
添加依赖:
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
启动类添加
@EnableZipkinServer
注解。在
application.yml
中配置:
server:
port: 9411
- 启动
Zipkin
服务:
微服务整合Zipkin
- 客户端添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
- 在
application.yml
中配置:
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
# 采样百分比,默认0.1(10%)
sampler:
percentage: 1.0
- 启动服务并访问:
使用消息中间件收集数据
使用消息中间件有以下优点:
- 微服务与
Zipkin Server
解耦,微服务无需知道Zipkin Server
的网络地址。 - 在一些场景下,
Zipkin Server
与微服务网络可能不同,使用 HTTP 直接收集的方式无法工作,此时可借助消息中间件实现数据收集。
如图:
改造Zipkin Server
pom
修改依赖:
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<!--mq收集数据-->
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
<version>2.3.1</version>
</dependency>
application.yml
配置文件:
server:
port: 9411
spring:
application:
name: zipkin-server
zipkin:
collector:
rabbitmq:
# 多个地址使用,分隔
addresses: localhost:5672
username: guest
password: guest
queue: zipkin
这样,Zipkin Server
就改造完成。
改造微服务
pom
修改依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-amqp</artifactId>
<version>1.7.5.RELEASE</version>
</dependency>
application.yml
配置文件:
spring:
application:
name: micorservice-provider-user
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
zipkin:
rabbitmq:
queue: zipkin
这样,微服务就改造完成。
使用Elasticsearch
存储跟踪数据
Zipkin Server
是将数据存储在内存中的。一旦Zipkin Server
重启或者发生崩溃,就会导致历史数据的丢失。
Zipkin Server
支持多种后端存储,如MYSQL
、Elasticsearch
、Cassandra
等等。
pom
修改依赖:
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<!--mq收集数据-->
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<!--支持elasticsearch 2.x - 6.x-->
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
<version>2.3.1</version>
</dependency>
application.yml
配置文件:
zipkin:
collector:
rabbitmq:
# 多个地址使用,分隔
addresses: localhost:5672
username: guest
password: guest
queue: zipkin
storage:
type: elasticsearch
elasticsearch:
cluster: elasticsearch
hosts: http://localhost:9200
index: zipkin
index-shareds: 5
index-replicas: 5
- 启动微服务,访问后,访问
http://localhost:9200/_search
,可以看到如下结果:
{
"took":5,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":7,
"max_score":1,
"hits":[
{
...
}
]
}
}
说明能够正常将数据存储在elasticsearch
中。重启Zipkin Server
,仍可以查询历史数据。
依赖关系图
使用elasticsearch
存储数据后,单击Zipkin Server
导航栏上的Dependencies
,会发现一片空白。
要想分析微服务之间的依赖关系,需借助zipkin-denpendencies
(https://github.com/openzipkin/zipkin-dependencies)组件,该工具本质上是一个`Spark job`。