Spring Cloud之基于Zipkin的链路数据持久化

在前文《Spring Cloud之分布式链路跟踪服务Sleuth》中我们介绍了如何对微服务做分布式链路数据的跟踪。但是目前仍存在一个问题:Zipkin-Server默认是把链路数据保存的内存中,当积累的数据过多后,会存在内存溢出的风险。因此本文着重解决这个问题,介绍了一种基于Spring Cloud Sleuth + RabbitMQ + ElasticSearch的数据持久化存储解决方案。

1. 改造Zipkin Server

我们假设你已经按照前文《Spring Cloud之分布式链路跟踪服务Sleuth》的步骤,实现了Zipkin链路数据通过RabbitMQ传输。首先对于你的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
41
42
43
44
45
46
47
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
<version>1.24.0</version>
<optional>true</optional>
</dependency>

配置文件中加入以下ElasticSearch的配置:

1
2
3
4
5
6
7
8
#zipkin数据持久化
zipkin.storage.type=elasticsearch
zipkin.storage.elasticsearch.hosts=es的IP:端口
zipkin.storage.elasticsearch.max-requests=64
#注意索引就用zipkin即可
zipkin.storage.elasticsearch.index=zipkin
zipkin.storage.elasticsearch.index-shards=5
zipkin.storage.elasticsearch.index-replicas=1

然后重启Zipkin Server即可,查看你的ElasticSearch,会发现多了zipkin-YYYY-MM-DD的索引数据,调用链路的数据也会正常的显示。

2. 配置Zipkin Dependencies

别高兴的太早,如果你查看Zipkin的依赖分析,会发现没有依赖关系的数据:
image
这是因为es中只存储了链路的调用数据,还没有计算依赖关系,所以需要一个Zipkin提供的插件来计算依赖关系,根据openzipkin中的介绍,首先下载jar包:

1
wget -O zipkin-dependencies.jar 'https://search.maven.org/remote_content?g=io.zipkin.dependencies&a=zipkin-dependencies&v=LATEST'

计算依赖关系:

1
STORAGE_TYPE=elasticsearch ES_HOSTS=http://es的IP:端口 java -jar zipkin-dependencies-2.0.4.jar

稍等片刻,插件会把依赖关系的数据计算好:
image

此时,再打开Zipkin Server的管理页面,会发现依赖分析页面已经有数据了:
image

对于生产环境来说,可以写一个定时任务,执行依赖分析的计算插件。

以上内容就是关于Spring Cloud之Zipkin链路数据持久化策略的全部内容了,谢谢你阅读到了这里!

Author:zhaoyh