11-Zipkin
Zipkin
概述
Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。 我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的 API 接口之外,它也提供了方便的 UI 组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。 Zipkin 提供了可插拔数据存储方式:In-Memory、MySql、Cassandra 以及 Elasticsearch。
上图展示了 Zipkin 的基础架构,它主要由 4 个核心组件构成:
- Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin 内部处理的 Span 格式,以支持后续的存储、分析、展示等功能。
- Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。
- RESTful API:API 组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等。
- Web UI:UI 组件,基于 API 组件实现的上层应用。通过 UI 组件用户可以方便而有直观地查询和
分析跟踪信息。
Zipkin 分为两端,一个是 Zipkin 服务端,一个是 Zipkin 客户端,客户端也就是微服务的应用。客户端会配置服务端的 URL 地址,一旦发生服务间的调用的时候,会被配置在微服务里面的 Sleuth 的监听器监听,并生成相应的 Trace 和 Span 信息发送给服务端。
发送的方式主要有两种,一种是 HTTP 报文的方式,还有一种是消息总线的方式如 RabbitMQ。
不论哪种方式,都需要以下:
- 一个 Eureka 服务注册中心,这里我们就用之前的 eureka 项目来当注册中心。
- 一个 Zipkin 服务端。
- 多个微服务,这些微服务中配置Zipkin 客户端。
Zipkin Server的部署和配置
(1)Zipkin Server下载地址
(2)启动方式
在命令行输入 java -jar zipkin-server-2.12.9-exec.jar
启动 Zipkin Server
java -jar zipkin-server-2.12.9-exec.jar
- 默认Zipkin Server的请求端口为
9411
- Zipkin Server 的启动参数可以通过官方提供的yml配置文件查找
- 在浏览器输入 http://127.0.0.1:9411 即可进入到Zipkin Server的管理后台
Sleuth整合Zipkin
(1)客户端引入坐标
- 客户端指的是需要被追踪的微服务
- 商品、订单、网关工程中添加
<!--zipkin依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!--sleuth链路追踪整合zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
(2)修改客户端配置文件
- 商品、订单、网关工程中添加
spring:
application:
name: xxxxxx #服务名称
#配置zipkin
zipkin:
base-url: http://127.0.0.1:9411/ #server的请求地址
sender:
type: web #数据的传输方式 , 已http的形式向server端发送数据
sleuth:
sampler:
probability: 1 #采样比
指定了zipkin server的地址,下面制定需采样的百分比,默认为0.1,即10%,这里配置1,是记录全部的sleuth信息,是为了收集到更多的数据(仅供测试用)。在分布式系统中,过于频繁的采样会影响系统性能,所以这里配置需要采用一个合适的值。
(3) 访问测试
- 在浏览器输入 http://127.0.0.1:9411 进入到Zipkin Server的管理后台,点击查找进行记录查看
存储跟踪数据到mysql
Zipkin Server默认时间追踪数据信息保存到内存,这种方式不适合生产环境。因为一旦Service关闭重启或者服务崩溃,就会导致历史数据消失。Zipkin支持将追踪数据持久化到mysql数据库或者存储到elasticsearch中。
(1)准备数据库脚本并导入到本地,可以从官网获取
zipkin.sql
从F盘资料中获取
F:\my_ide_workspace\idea_workspace\springcloud\document_and_soft
(2)配置启动服务端
在以java -jar启动zipkin时,将启动命令修改为以下配置:
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=root
- STORAGE_TYPE : 存储类型
- MYSQL_HOST: mysql主机地址
- MYSQL_TCP_PORT:mysql端口
- MYSQL_DB: mysql数据库名称
- MYSQL_USER:mysql用户名
- MYSQL_PASS :mysql密码
启动微服务并调用,此时数据记录以保存在数据库中,在浏览器输入 http://127.0.0.1:9411 进入到Zipkin Server的管理后台,点击查找进行记录查看的为mysql库中的记录
基于RabbitMQ收集数据
概述
在默认情况下,Zipkin客户端和Server之间是使用HTTP请求的方式进行通信(即同步的请求方式),在网络波动,Server端异常等情况下可能存在信息收集不及时的问题。Zipkin支持与rabbitMQ整合完成异步消息传输。
加了MQ之后,通信过程如下图所示:
RabbitMQ的安装与启动
配置完后,启动方式:
-
双击
D:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.4\sbin
下的rabbitmq-server.bat
-
输入url进行查看 http://localhost:15672
Zipkin服务端启动
zipkin-server-2.12.9-exec.jar 软件包根目录下打开cmd,并输入以下:
java -jar zipkin-server-2.12.9-exec.jar --RABBIT_ADDRESSES=127.0.0.1:5672
参数解释:
- RABBIT_ADDRESSES : 指定RabbitMQ地址
- RABBIT_USER: 用户名(默认guest)
- RABBIT_PASSWORD : 密码(默认guest)
启动Zipkin Server之后,我们打开RabbitMQ的控制台可以看到多了一个Queue
客户端微服务配置
(1)引入坐标
<!--sleuth链路追踪-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<!--zipkin依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!--sleuth链路追踪整合zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<!--rabbit依赖-->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>
(2)yml配置消息中间件rabbit mq地址等信息
#修改zipkin使用rabbitmq采集数据
zipkin:
#base-url: http://127.0.0.1:9411/ #server的请求地址
sender:
#type: web #数据的传输方式 , 已http的形式向server端发送数据
type: rabbit #向rabbitmq中发送消息
sleuth:
sampler:
probability: 1 #采样比
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
listener: # 这里配置了重试策略
direct:
retry:
enabled: true
simple:
retry:
enabled: true
- 修改消息的投递方式,改为rabbit即可。
- 添加rabbitmq的相关配置
(3)测试
http://localhost:8080/order-service/order/buy/1
http://localhost:8080/product-service/product/1
-
请求上述两个链接,此时访问zipkin管理页面 http://127.0.0.1:9411 ,可以查看到刚刚访问的记录
-
将zipkin的cmd窗口停止(Ctrl+c),关闭ZipkinServer服务
-
再次请求上述两个链接,此时访问http://localhost:15672 ,在打开rabbitmq管理后台可以看到,消息已经推送到rabbitmq
- 当Zipkin Server启动时,会自动的从rabbitmq获取消息并消费,展示追踪数据。