sleuth 链路追踪

article/2025/9/20 20:58:33

一:什么是链路追踪

 对于以前的单服务器项目而言,如果一个地方出了问题,很容易去找到。可是对于微服务架构项目来说,因为微服务太多,而且往往是一个微服务调用了很多其他的微服务,如果一个地方出错,就会导致其他的微服务均出现问题,这样时候去排错就很苦难很麻烦。

所以我们可以以日志的形式将每个操作执行的时间都记录下来,这样排除就会简单一些。分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上IP、每个服务节点的请求状态200  500等等。

常用的链路追踪组件就是 zipkin,zipkin 由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微 服务架构中的延迟问题,包括:数据的收集、存储、查找和展现《图形化》。该产品结合spring-cloud-sleuth 使用较为简单, 集成很方便, 但是功能较简单

zipkin是链路追踪组件,sleuth可以记录每一条链路上的所有节点,以及这些节点所在的机器地址,和处理一个业务耗费的时间。

二:sleuth的使用

首先要引入sleuth依赖,因为想将所有微服务的操作业务时间都记录显示,所以可以将sleuth依赖引入到父工程中,或者 common 公共项目中

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

引入依赖之后,重启所有的微服务,观察控制台们就会发现所有的操作都会被记录下时间,前面的值是Traceid。后面的值是SpanId

Trace (一条完整链路--包含很多span(微服务接口))

由一组Trace Id(贯穿整个链路)相同的Span串联形成一个树状结构。为了实现请求跟踪,当请求到达分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个唯一的标识(即TraceId),同时在分布式系统内部流转的时候,框架始终保持传递该唯一值,直到整个请求的返回。那么我们就可以使用该唯一标识将所有的请求串联起来,形成一条完整的请求链路。

Span 

代表了一组基本的工作单元。为了统计各处理单元的延迟,当请求到达各个服务组件的时候,也通过一个唯一标识(SpanId)来标记它的开始、具体过程和结束。通过SpanId的开始和结束时间戳,就能统计该span的调用时间,除此之外,我们还可以获取如事件的名称。请求信息等元数据。

 三:sleuth和zipkin结合

使用zipkin与sleuth结合,可以将整条链路上的所有span处理业务耗费的时间以图形化的形式展示出来。更加方便我们的查看、排错。

将 zipkin.jar 下载,本质就是一个springboot项目,所以通过 java -jar zipkin.jar 进行运行。

引入zipkin依赖,因为还是对所有的微服务都要使用 zipkin,所有跟 sleuth 一样,可以在父工程中引入,也可以在common公共工程中引入。

<dependencies><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>
</dependencies>

在所有的微服务配置文件中,进行对 zipkin 的配置,要指定 zipkin的地址以及端口号,还需要指定nacos不将 zipkin 注册,然后还可以指定采样率,就是再这个微服务中,采取多少的日志结果,1.0 则为100%

spring.zipkin.base-url=http://127.0.0.1:9411

spring.zipkin.discovery-client-enabled=false

spring.sleuth.sampler.probability=1.0

重启所有的微服务,浏览器访问地址 localhost:9411 查看效果,可以查看,一个链路中,各个微服务执行的时间数。还可以查看在微服务中调用了哪些方法,请求方式,以及微服务所在的地址。

 

如果这样直接启动 zipkin 后,数据是存在内存中的,如果将zipkin 重启之后之前的链路追踪数据就会消失。所以可以将zipkin 与 mysql结合,将追踪的数据持久化到数据库中。

创建新的数据库,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,

`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' )

 ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate';

ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations';

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(`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';

 ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';

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 )

ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

使用指令启动zipkin,指定数据保存到数据库中

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=数据库地址 --MYSQL_TCP_PORT=端口号 --MYSQL_DB=数据库名 --MYSQL_USER=远程登录名 --MYSQL_PASS=远程密码

 


http://chatgpt.dhexx.cn/article/gUBsxAVc.shtml

相关文章

java sleuth配置

java sleuth配置 springCloud学习记录SpringCloud Alibaba sleuth&#xff08;分布式请求链路跟踪&#xff09;zipkinsleuthpomyml springCloud学习记录 SpringCloud Alibaba sleuth&#xff08;分布式请求链路跟踪&#xff09; 在微服务框架种&#xff0c;一个由客户端发起的…

Spring Cloud Sleuth+Zipkin 构建微服务链路跟踪系统

什么是链路跟踪系统&#xff1f; 在微服务中&#xff0c;多个服务分布在不同物理机器上&#xff0c;各个服务之间相互调用。如何清晰地记录服务调用过程&#xff0c;并在出现问题的时候能够通过查看日志和服务之间的调用关系来定位问题&#xff0c;这样的系统就叫做链路跟踪系…

SpringCloud Sleuth入门介绍

案例代码:https://github.com/q279583842q/springcloud-e-book 一、Sleuth介绍 为什么要使用微服务跟踪?它解决了什么问题&#xff1f; 1.微服务的现状&#xff1f; 微服务的现状   随着业务的发展&#xff0c;单体架构变为微服务架构&#xff0c;并且系统规模也变得越来…

Spring Cloud Sleuth HTTP详解

目录 1版本关系 2简介 2.1术语 2.2调用链可视化 2.2.1使用Zipkin进行分布式跟踪 2.2.2错误可视化 2.2.3使用Brave进行分布式跟踪 2.2.4将Sleuth添加到项目中 3调用信息生成与上报原理 3.1初始化配置类 3.2过滤器-请求过滤 3.3调用信息拦截 3.4调用信息上报 4日志…

Sleuth链路追踪

文章目录 Spring-Cloud-Alibaba-Sleuth链路追踪一、链路追踪介绍二、Sleuth入门演示&#xff1a; 三、ZipKin介绍ZipKin服务端安装ZipKin数据持久化 Spring-Cloud-Alibaba-Sleuth链路追踪 一、链路追踪介绍 在大型的微服务项目中&#xff0c;一个系统被拆分成许多模块&#xf…

sleuth原理详解

sleuth原理 1、关键术语 Span&#xff1a;Span基本工作单元&#xff0c;发送一个远程调度任务就会产生一个Span, Span 是用 64ID唯一标识的&#xff0c;Trace是用另一个64ID唯一标识的。Span还包含了其他的信息&#xff0c;例如摘要、时间戳事件、Span的ID以及进程 ID。Trace…

07-搭建微服务-链路追踪Sleuth

1、为什么使用链路追踪&#xff1f; 在微服务中&#xff0c;随着服务越来越多&#xff0c;对调用链的分析越来越复杂。 出现问题&#xff1a; 1、微服务之间的调用错综复杂&#xff0c;用户发送的请求经历哪些服务&#xff0c;调用链不清楚&#xff0c;没有一个自动化的工具类来…

sleuth入门

Sleuth介绍 SpringCloud Sleuth主要功能就是在分布式系统中提供追踪解决方案。它大量借用了Google Dapper的设计&#xff0c; 先来了解一下Sleuth中的术语和相关概念。 Trace 由一组Trace Id&#xff08;贯穿整个链路&#xff09;相同的Span串联形成一个树状结构。为了实现请求…

集成sleuth_Spring Cloud Sleuth整合zipkin过程解析

这篇文章主要介绍了Spring Cloud Sleuth整合zipkin过程解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 SpringCloud Sleuth 简介 Spring Cloud Sleuth为Spring Cloud实现了分布式跟踪解决方案。 Spring Clo…

集成sleuth_整合Sleuth

Sleuth是 springcloud 分布式跟踪解决方案。 Sleuth 术语&#xff1a; 跨度(span ) &#xff1a;Sleuth 的基本工作单元&#xff0c;他用一个64位的id唯一标识。出ID外&#xff0c;span还包含 其他的数据&#xff0c;如 描述&#xff0c;时间戳事件&#xff0c;键值对注解等&am…

Spring Boot 中的 Sleuth 是什么, 如何使用

Spring Boot 是一个非常流行的 Java Web 开发框架&#xff0c;它提供了许多方便的功能&#xff0c;其中之一就是 Sleuth。Sleuth 是一个分布式跟踪系统&#xff0c;用于跟踪应用程序中的请求和操作。在本文中&#xff0c;我们将探讨 Spring Boot 中的 Sleuth 是什么&#xff0c…

sleuth原理分析

背景 微服务模式下&#xff0c;一次请求可能会经过多个服务。如果没有日志链将单次请求的日志串起来&#xff0c;定位问题时很容易陷入海量的日志中&#xff0c;无法快速定位问题。 sleuth是spring cloud中日志链&#xff08;调用链解决方案&#xff09;&#xff0c;引入该依赖…

快速学习-Sleuth--链路追踪

Sleuth–链路追踪 6.1 链路追踪介绍 在大型系统的微服务化构建中&#xff0c;一个系统被拆分成了许多模块。这些模块负责不同的功能&#xff0c;组合成 系统&#xff0c;最终可以提供丰富的功能。在这种架构中&#xff0c;一次请求往往需要涉及到多个服务。互联网应用构建 在…

SpringCloud学习笔记(十二)Sleuth 分布式请求链路跟踪

目录 一、Sleuth介绍 1、为什么会出现这个技术&#xff1f;需要解决哪些问题&#xff1f; 2、是什么 二、搭建链路监控步骤 1、zipkin搭建安装 1&#xff09;下载 2&#xff09;运行jar 3&#xff09;运行控制台 4&#xff09;术语 2、服务提供者 cloud-provider-pa…

MySQL5种索引类型

一、简介 MySQL目前主要有以下几种索引类型&#xff1a; 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 二、语句 CREATE TABLE table_name[col_name data type] [unique|fulltext][index|key][index_name](col_name[length])[asc|desc] 1.unique|fulltext为可选…

mysql索引类型和索引方式

1.什么是索引 在MySQL中&#xff0c;索引&#xff08;index&#xff09;也叫做“键&#xff08;key&#xff09;”&#xff0c;它是存储引擎用于快速找到记录的一种数据结构。 2.索引的分类 在MySQL中&#xff0c;通常我们所指的索引类型&#xff0c;有以下几种&#xff1a;…

Mysql索引的类型(单列索引、组合索引 btree索引 聚簇索引等)

一、索引的类型 Mysql目前主要有以下几种索引类型&#xff1a;FULLTEXT&#xff0c;HASH&#xff0c;BTREE&#xff0c;RTREE。 FULLTEXT 即为全文索引&#xff0c;目前只有MyISAM引擎支持。其可以在CREATE TABLE &#xff0c;ALTER TABLE &#xff0c;CREATE INDEX 使用&…

mysql索引类型有哪些?

在Mysql数据库当中&#xff0c;我们经常会谈到Sql语句&#xff0c;当然也会谈到索引优化&#xff0c;那么在数据库当中有哪些索引类型呢&#xff0c;博主在这里进行分享&#xff0c;希望对大家能有所帮助。 目录 1、B-Tree索引&#xff1a; 2、Hash索引&#xff1a; 3、Full…

什么是索引?Mysql目前主要的几种索引类型

一、索引 MySQL索引的建立对于MySQL的高效运行是很重要的&#xff0c;索引可以大大提高MySQL的检索速度。 打个比方&#xff0c;如果合理的设计且使用索引的MySQL是一辆兰博基尼的话&#xff0c;那么没有设计和使用索引的MySQL就是一个人力三轮车。 索引分单列索引和组合索引。…

Mysql索引类型与索引方法

写在前面&#xff1a; 乍一看这两个概念可能有点混&#xff0c;先上一张发图。 索引类型就是我们平常说的唯一索引&#xff0c;主键索引&#xff0c;组合索引等索引类型。 我们都知道索引是一种数据结构&#xff0c;到底我们建的索引应该以什么样的结构存储呢&#xff1f;存储…