目录
在前面整合 Sleuth 实现链路追踪时,我们是通过查看日志的情况来了解系统调用的链路情况,这并不是一种很好的解决方案,如果系统所包含的微服务越来越多,通过查看日志的方式来分析系统的调用是非常复杂的,在实际项目中根本不可行。此时,我们可以将 Sleuth 和 ZipKin 进行整合,利用 ZipKin 将日志进行聚合,将链路日志进行可视化展示,并支持全文检索。
1、ZipKin 核心架构
Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 论文实现,可以收集微服务运行过程中的实时链路数据,并进行展示
1.1、ZipKin 概述
Zipkin 是一种分布式链路跟踪系统,能够收集微服务运行过程中的实时调用链路信息,并能够将这些调用链路信息展示到 Web 界面上供开发人员分析,开发人员能够从 ZipKin 中分析出调用链路中的性能瓶颈,识别出存在问题的应用程序,进而定位问题和解决问题。
1.2、ZipKin 核心架构
ZipKin 的核心架构图如下所示:
其中,ZipKin 核心组件的功能如下所示:
- Reporter:ZipKin 中上报链路数据的模块,主要配置在具体的微服务应用中。
- Transport:ZipKin 中传输链路数据的模块,此模块可以配置为 Kafka,RocketMQ、RabbitMQ 等。
- Collector:ZipKin 中收集并消费链路数据的模块,默认是通过 http 协议收集,可以配置为 Kafka消费。
- Storage:ZipKin 中存储链路数据的模块,此模块的具体可以配置为 ElasticSearch、Cassandra 或者 MySQL,目前ZipKin支持这三种数据持久化方式。
- API:ZipKin 中的 API 组件,主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是开放给外部系统实现监控等。
- UI: ZipKin 中的 UI 组件,基于 API 组件实现的上层应用。通过 UI 组件用户可以方便并且很直观地查询和分析跟踪信息。
- Zipkin 在总体上会分为两个端,一个是 Zipkin 服务端,一个是 Zipkin 客户端,客户端主要是配置在微服务应用中,收集微服务中的调用链路信息,将数据发送给 ZipKin 服务端
2、集成 ZipKin
Zipkin 总体上分为服务端和客户端,我们需要下载并启动 ZipKin 服务端的 Jar 包,在微服务中集成ZipKin 的客户端
2.1、下载安装 ZipKin 服务端
1、下载 ZipKin 服务端 Jar 文件
我通过浏览器下载的 ZipKin 服务端 Jar 文件为:zipkin-server-2.14.1-exec.jar
2、在命令行输入如下命令启动 ZipKin 服务端
java -jar zipkin-server-2.14.1-exec.jar
3、由于 ZipKin 服务端启动时,默认监听的端口号为 9411
,所以,在浏览器中输入 http://localhost:9411
链接就可以打开 ZipKin 的界面,如下所示:
2.2、集成 ZipKin 客户端
1、在每个微服务(用户微服务 shop-user
,商品微服务 shop-product
,订单微服务 shop-order
,网关服务 shop-gateway
)中添加 ZipKin 依赖,如下所示:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
2、在网关服务 shop-gateway
的 application.yml
文件中添加如下配置:
spring:
sleuth:
sampler:
probability: 1.0 # 采样率,0.0-1.0,1.0为全部采集
zipkin:
base-url: http://localhost:9411 # zipkin 服务地址
discovery-client-enabled: false # 关闭服务发现【关闭服务发现,使Nacos将其当成一个URL,不要按服务名处理】
3、分别启动用户微服务,商品微服务,订单微服务和服务网关,在浏览器中访问链接http://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1
4、点击 Zipkin 界面上的【查找】按钮,如下所示:
点击后的界面:
可以看到,点击【查找】按钮后,会出现一个请求链路,包含:网关服务 server-gateway
耗时 405.302 毫秒,订单微服务 server-order
耗时 395.911 毫秒,用户微服务 server-user
耗时70.689 毫秒,商品微服务 server-product
耗时 155.499 毫秒
5、点击 ZipKin 界面上显示的调用链路,如下所示:
点开后的界面如下所示:
可以非常清晰的看到整个调用的访问链路。
我们还可以点击具体的节点来查看具体的调用信息。例如:我们点击网关微服务查看网关的具体链路,如下所示:
点开后的效果如下所示:
接下来,查看下订单微服务的调用链路具体信息,如下所示:
点开后的效果如下所示:
可以看到,通过 ZipKin 能够查看服务的调用链路,并且能够查看具体微服务的调用情况。我们可以基于 ZipKin 来分析系统的调用链路情况,找出系统的瓶颈点,进而进行针对性的优化。
另外,ZipKin 中也支持下载系统调用链路的 Json 数据,如下所示:
3、ZipKin 数据持久化
我们实现了在项目中集成 ZipKin,但是此时我们集成 ZipKin 后,ZipKin 中的数据是保存在系统内存中
的,如果我们重启了 ZipKin,则保存在系统内存中的数据就会丢失,那我如何避免数据丢失呢?
ZipKin 支持将数据进行持久化来防止数据丢失,可以将数据保存到 ElasticSearch、Cassandra 或 MySQL 中。
3.1、ZipKin 数据持久化到 MySQL
1、将 Zipkin 数据持久化到 MySQL,我们需要知道 MySQL 的数据表结构,ZipKin 提供了 MYSQL 脚本
将下载后的 MySQL 脚本放到了网关服务 shop-gateway
的 resources
目录下的 scripts
目录下:
2、在 MySQL 数据库中新建 zipkin 数据库,并运行mysql.sql脚本,,运行脚本后的效果如下所示:
在 zipkin 数据库中新建了 zipkin_annotations
、zipkin_dependencies
和 zipkin_spans
三张数据表
3、启动 ZipKin 时指定 MySQL 数据源,如下所示:
java -jar zipkin-server-2.14.1-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=123456
4、启动 ZipKin 后,在浏览器中访问链接 http://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1
5、查看 zipkin 数据库中的数据,发现 zipkin_annotations
数据表与 zipkin_spans
数据表已经存在系统的调用链路数据
zipkin_annotations
数据表部分数据如下所示:
zipkin_spans
数据表部分数据如下所示
可以看到,ZipKin 已经将数据持久化到 MySQL 中,重启 ZipKin 后就会从 MySQL 中读取数据,数据也不会丢失了