目录
- 1、ZipKin 核心架构
- 1.1、ZipKin 概述
- 1.2、ZipKin 核心架构
- 2、集成 ZipKin
- 2.1、下载安装 ZipKin 服务端
- 2.2、集成 ZipKin 客户端
- 3、ZipKin 数据持久化
- 3.1、ZipKin 数据持久化到 MySQL
在前面整合 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 中读取数据,数据也不会丢失了