文章目录
-
-
-
-
- 1、链路追踪Sleuth+Zipkin
- 2、Zipkin介绍
- [3、Spring Cloud Alibaba 实现链路追踪(Sleuth 、Zipkin 集成)](#3、Spring Cloud Alibaba 实现链路追踪(Sleuth 、Zipkin 集成))
- [4、Zipkin 持久化](#4、Zipkin 持久化)
-
-
-
1、链路追踪Sleuth+Zipkin
链路追踪(Tracing)主要用于分布式系统中,尤其是微服务架构下,目的是为了跟踪一个请求在各个微服务之间的调用链路。它能够帮助开发者了解请求的执行流程、耗时情况以及各个服务之间的依赖关系,从而便于性能优化、故障排查和系统监控。以下是链路追踪的主要原因和优势:
- 分布式系统的复杂性
在微服务架构中,一个简单的请求可能会经过多个服务的处理。例如,一个在线购物系统的订单请求可能需要经过订单服务、库存服务、支付服务等多个服务的处理。由于各个服务之间相互调用,形成了复杂的调用链路,很难直观地了解整个请求的执行流程。
链路追踪能够将这些分散的调用记录整合起来,形成一个完整的调用链路图,帮助开发者清晰地看到请求在各个服务之间的流转过程。- 性能优化
通过链路追踪,可以精确地了解每个服务的处理时间,从而找出性能瓶颈所在。例如,如果某个服务的处理时间过长,就可以针对性地进行优化。- 故障排查
当系统出现故障时,链路追踪可以帮助开发者快速定位问题所在的服务或环节。通过查看链路追踪数据,可以了解请求在哪个服务中出现了异常或超时,从而快速进行修复。- 系统监控
链路追踪数据可以作为系统监控的重要指标,帮助运维人员实时了解系统的运行状态。例如,通过监控链路追踪数据,可以及时发现服务之间的调用异常或性能下降,从而采取相应的措施。- 服务依赖分析
链路追踪能够清晰地展示各个服务之间的依赖关系,帮助团队更好地理解和管理微服务架构。这对于系统的架构设计和优化非常重要。
2、Zipkin介绍
Zipkin 是一个分布式追踪系统,通过收集微服务间的请求数据,帮助开发者发现服务调用延迟的来源和理解分布式系统的运作。其基本原理如下:
追踪ID:为每个请求分配一个全局唯一的追踪ID,以便在整个调用链路中标识请求。
跨度(Span):表示请求在系统中的某个服务节点的一次调用过程,包括开始时间和结束时间。
调用关系:通过记录不同跨度之间的调用关系,构建调用链路。
2.1、下载Zipkin
1.1 下载 zipkin-server-2.12.9-exec.jar 服务端;
1.2 启动jar包, java -jar zipkin-server-2.12.9-exec.jar
1.3 通过浏览器访问 http://localhost:9411访问
3、Spring Cloud Alibaba 实现链路追踪(Sleuth 、Zipkin 集成)
可以使用 Spring Cloud Sleuth 和 Zipkin Server 组件。
3.1、添加依赖
在各个微服务中pom.xml文件中引入 Sleuth 和 Zipkin的坐标依赖
xml
<!--链路追踪 Sleuth-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
3.2、application.yml配置文件
在各个微服务application.yml文件中添加如下配置:
yaml
spring:
zipkin:
base-url: http://127.0.0.1:9411
# discoveryClientEnabled: false # 让nacos把它当成一个URL, 而不是当做服务名
sender:
type: web
sleuth:
sampler:
probability: 1.0 # 采样率, 1.0表示全部采集
3.3、验证
- 启动 微服务, 请求 http://localhost:7000/order-serv/order/2/1/1

上面是请求了3次接口, 每次请求显示一次。 - 点击上面的信息, 可以查看具体详情

4、Zipkin 持久化
Zipkin Server默认会将追踪数据信息保存到内存,但这种方式不适合生产环境。Zipkin支持将追踪数据持久化到mysql数据库或elasticsearch中。
注: 这里仅展示 使用MySQL实现数据持久化
4.1、使用MySQL实现数据持久化
- 执行zipkin的持久化sql,个人觉得,可以有单独的数据库服务来完成,不与项目数据库在同一个服务器。
sql
CREATE DATABASE zipkin;
USE zipkin;
CREATE TABLE IF NOT EXISTS zipkin_spans (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL,
`id` BIGINT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`remote_service_name` VARCHAR(255),
`parent_id` BIGINT,
`debug` BIT(1),
`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
CREATE TABLE IF NOT EXISTS zipkin_annotations (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
CREATE TABLE IF NOT EXISTS zipkin_dependencies (
`day` DATE NOT NULL,
`parent` VARCHAR(255) NOT NULL,
`child` VARCHAR(255) NOT NULL,
`call_count` BIGINT,
`error_count` BIGINT,
PRIMARY KEY (`day`, `parent`, `child`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
- 在启动ZipKin Server的时候,指定数据保存的mysql的信息
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
参数解释:
MYSQL_HOST: 数据库服务器ip地址
MYSQL_TCP_PORT: 数据库端口号
MYSQL_DB: 数据库名称
MYSQL_USER: 数据库用户名
MYSQL_PASS: 数据库用户密码
再次请求链接
- 验证

在命令窗口中, Ctrl + C 停止zipkin服务端, 然后再次启动 zipkin服务端, 进入http://localhost:9411/
如果还能看到上面图片的内容, 说明持久化成功。