springcloud alibaba(八)链路追踪

文章目录

1、链路追踪Sleuth+Zipkin

链路追踪(Tracing)主要用于分布式系统中,尤其是微服务架构下,目的是为了跟踪一个请求在各个微服务之间的调用链路。它能够帮助开发者了解请求的执行流程、耗时情况以及各个服务之间的依赖关系,从而便于性能优化、故障排查和系统监控。以下是链路追踪的主要原因和优势:

  1. 分布式系统的复杂性
    在微服务架构中,一个简单的请求可能会经过多个服务的处理。例如,一个在线购物系统的订单请求可能需要经过订单服务、库存服务、支付服务等多个服务的处理。由于各个服务之间相互调用,形成了复杂的调用链路,很难直观地了解整个请求的执行流程。
    链路追踪能够将这些分散的调用记录整合起来,形成一个完整的调用链路图,帮助开发者清晰地看到请求在各个服务之间的流转过程。
  2. 性能优化
    通过链路追踪,可以精确地了解每个服务的处理时间,从而找出性能瓶颈所在。例如,如果某个服务的处理时间过长,就可以针对性地进行优化。
  3. 故障排查
    当系统出现故障时,链路追踪可以帮助开发者快速定位问题所在的服务或环节。通过查看链路追踪数据,可以了解请求在哪个服务中出现了异常或超时,从而快速进行修复。
  4. 系统监控
    链路追踪数据可以作为系统监控的重要指标,帮助运维人员实时了解系统的运行状态。例如,通过监控链路追踪数据,可以及时发现服务之间的调用异常或性能下降,从而采取相应的措施。
  5. 服务依赖分析
    链路追踪能够清晰地展示各个服务之间的依赖关系,帮助团队更好地理解和管理微服务架构。这对于系统的架构设计和优化非常重要。
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、验证
  1. 启动 微服务, 请求 http://localhost:7000/order-serv/order/2/1/1

    上面是请求了3次接口, 每次请求显示一次。
  2. 点击上面的信息, 可以查看具体详情
4、Zipkin 持久化

Zipkin Server默认会将追踪数据信息保存到内存,但这种方式不适合生产环境。Zipkin支持将追踪数据持久化到mysql数据库或elasticsearch中。

注: 这里仅展示 使用MySQL实现数据持久化

4.1、使用MySQL实现数据持久化
  1. 执行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;
  1. 在启动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: 数据库用户密码

再次请求链接

  1. 验证

在命令窗口中, Ctrl + C 停止zipkin服务端, 然后再次启动 zipkin服务端, 进入http://localhost:9411/

如果还能看到上面图片的内容, 说明持久化成功。

相关推荐
疯狂的程序猴2 小时前
深入理解 iPhone 文件管理,从沙盒结构到开发调试的多工具协同实践
后端
一只游鱼2 小时前
我的第一个微服务项目cy-fang1.0
java·后端·spring cloud
JavaGuide2 小时前
对标MinIO!全新一代分布式文件系统诞生!
数据库·后端
喵个咪2 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:基于 Ent 从零实现新服务
后端·go·orm
atwednesday2 小时前
分布式事务及实现方案
后端
文心快码BaiduComate2 小时前
Comate Spec模式实测:让AI编程更精准可靠
前端·后端·前端框架
哈哈哈笑什么2 小时前
3 次生产系统崩溃复盘:Java 后端从踩坑到封神的排查优化之路
java·后端·性能优化
ServBay2 小时前
MongoDB 的文档模型与 CRUD 实战
数据库·后端·mongodb
哈哈哈笑什么2 小时前
企业级高并发分布式SpringCloud系统下,订单动态超时自动取消(最终成熟方案),使用spring-cloud-starter-stream-rabbit
分布式·spring cloud·rabbitmq