Zipkin是Twitter的一个开源项目,是一个致力于收集所有服务的监控数据的分布式跟踪系统,它提供了收集数据和查询数据两大接口服务。有了Zipkin我们就可以很直观地对调用链进行查看,并且可能很方便看出服务之间的调用关系以及调用耗费的时间。
首先我们需要创建一个Zipkin的项目,集成Zipkin的ui用于数据的展示和收集,pom.xml 配置如下:
<dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autocongure-ui</artifactId> </dependency>
创建启动类:
@SpringBootApplication@EnableZipkinServerpublic class zipKinServerApplication {
public static void main(String[] args){
SpringApplication.run(ZipKinServerApplication.class, args);
}
}
增加配置信息:
spring.application.name = fangjia-zipkinserver.port=9411
到此为止,Zipkin 的服务就创建好了。启动后访问 http://localhost:9411/zipkin/ 就可以看到管理页面了,如下图所示。

在之前的文章中,我们只是集成了
Spring Cloud Sleuth,然后将跟踪信息输出到日志中。现在,Zipkin的服务创建好了,需要将链路跟踪的信息发送给Zipkin的收集服务。
需要在项目中添加如下依赖:
<dependency> <groupId>org.springframework.cloud</ groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
在属性文件中可以配置 Zipkin 的地址,默认是 http:// 127.0.1:9411 ,这样才能将跟踪的数据发送到执行的收集服务中。
# 配置zipKin Server的地址 spring.zipkin.base-url = http://127.0.0.1:9411
然后我们启动之前的服务、访问接口,就可以看到数据已经能够在 Zipkin 的 Web 页面中了,如下图所示。

在实际使用中可能调用了10次接口,但是Zipkin中只有一条数据,这是因为收集信息是有一定比例的,这并不是bug。Zipkin 中的数据条数与调用接口次数默认比例是0.1,当然我们也可以通过配置来修改这个比例值:
# zipkin抽样比例 spring.sleuth.sampler.percentage= 1
之所以有这样的一个配置,是因为在高并发下,如果所有数据都采集,那这个数据量就太大了,采用抽样的做法可以减少一部分数据量,特别是对于Http方式去发送采集数据,对性能有很大的影响。
虽然有基于采样的收集方式,但是数据的发送采用Http还是对性能有影响。如果 Zipkin 的服务端在重启或者挂掉了,那么将丢失部分采集数据。为了解决这些问题,我们将集成
spring-cloud-sleuth-zipkin-stream ,用 RabbitMQ 来发送采集数据,利用消息队列来提高发送性能,保证数据不丢失。
首先改造我们的Zipkin项目,增加steam的依赖:
<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>
然后在启动类上加上
@EnableZipkinStreamServer 注解,把之前的
@EnableZipkinServer 去掉。属性文件中增加 RabbitMQ 的连接配置:
# rabbitmq 配置 spring.rabbitmq.addresses=amqp://192.168.10.47:5672 spring.rabbitmq.username=yinjihuanspring.rabbitmq.password=123456
接下来我们就要改造需要跟踪的具体服务了,也就是要加入 RabbitMQ 的依赖信息,采用 RabbitMQ 来替换之前的Http发送数据的方式,依赖如下:
<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>
属性文件中也还是增加 RabbitMQ 的连接配置:
# rabbitmq配置 spring.rabbitmq.addresses=amqp://192.168.10.47:5672 spring.rabbitmq.username=yinjihuanspring.rabbitmq.password=123456
到这里集成就已经完成了,记得去掉之前配置的
spring.zipkin.base-url 。因为我们现在利用 RabbitMQ 来发送数据了,所以这个配置不需要了。
目前我们收集的数据都是存在 Zipkin 服务的内存中,服务一重启这些数据就没了,我们需要将这些数据持久化。我们可以将其存储在MySQL中,实际使用中数据量可能会比较大,所以MySQL并不是一种很好的选择,可以选择用
Elasticsearch 来存储数据,
Elasticsearch 在搜索方面有先天的优势。
改造我们的 Zipkin 项目,增加
Elasticsearch 存储的依赖:
<dependency> <groupId>io.zipkin.java</groupId> <artifactId> zipkin-autoconfigure-storage-elasticsearch-http </artifactId> <version>1.24.0</version> <optional>true</optional> </dependency>
属性配置中指定 Zipkin 的存储方式以及配置
Elasticsearch 的连接信息:
zipkin.storage.StorageComponent=elasticsearch zipkin.storage.type=elasticsearch zipkin.storage.elasticsearch.cluster=elasticsearch-zipkin-cluster zipkin.storage.elasticsearch.hosts=127.0.0.1:9300 zipkin.storage.elasticsearch.max-requests=64 zipkin.storage.elasticsearch.index=zipkin zipkin.storage.elasticsearch.index-shards=5 zipkin.storage.elasticsearch.index-replicas=1
重启服务,然后收集一些数据,我们可以通过两种方式来验证数据是否存储到了
Elasticsearch 中。
可以重启 Zipkin 服务,然后看看数据是否还存在,如果存在则证明数据已经是持久化了。
可以通过查看
Elasticsearch 中的数据来确认数据有没有存储成功,访问
Elasticsearch 的地址查看当前所有的索引信息:
http://localhost:9200/_cat/indices 。 可以看到当前节点下面有哪些索引,如果看到有以 zipkin 开头的就说明索引创建了,接着直接查询这个索引下是否有数据即可认证是否存储成功,访问
http://localhost:9200/ 索引名称 /search 即可。
喜欢这篇文章的朋友们可以关注个人简介中的公众号
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69964492/viewspace-2767417/ ,如需转载,请注明出处,否则将追究法律责任。