服务链路追踪
发布时间:2026/11/6 1:11:01 锦皓数字建站

服务链路追踪为什么需要服务追踪在微服务架构下由于进行了服务拆分一次请求往往需要涉及多个服务每个服务可能是由不同的团队开发使用了不同的编程语言还有可能部署在不同的机器上分布在不同的数据中心。服务跟踪系统可以跟踪记录一次用户请求都发起了哪些调用经过哪些服务处理并且记录每一次调用所涉及的服务的详细信息通过查看完整的调用链路形成拓补图可以更加直观的了解业务也可以针对当前的系统进行分析是否需要扩容、优化接口、失败缓解通过日志快速定位是调用失败的环节。Sleuth概述简介Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案并且兼容支持了 zipkin你只需要在pom文件中引入相应的依赖即可服务追踪说明微服务架构是通过业务来划分服务的使用 REST 调用。对外暴露的一个接口可能需要很多个服务协同才能完成这个接口功能如果链路上任何一个服务出现问题或者网络超时都会形成导致接口调用失败。随着业务的不断扩张服务之间互相调用会越来越复杂。随着服务的越来越多对调用链的分析会越来越复杂。它们之间的调用关系也许如下好壮观的 冠状病毒呀Sleuth链路追踪入门虽然理论比较难弄, 但代码实现到不是很困难链路追踪, 主要是因为微服务架构不同模块完成不同的事情…一个功能由多个模块构成… 模块之间相互依赖… 而为了更方便的浏览业务.以及防止 因某个模块出错快速的定位错误 排错 完善…出现的技术所以一般来说每个模块都要进行 链路追踪配置依赖因为每个模块都要进行链路追踪就直接定义在父工程模块下了pom.xml!-- 引入Sleuth依赖 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-sleuth/artifactId/dependency.yml 配置文件每个模块都要哦~application.yml添加日志级别为了能够在 控制台中看到每次调用的情况 方便实时进行分析、.yml#yml 配置不在任何属性节点下logging:level:root:INFOorg.springframework.web.servlet.DispatcherServlet:DEBUG# DispatcherServlet 日志级别org.springframework.cloud.sleuth:DEBUG# sleuth 日志级别启动微服务调用之后我们可以在控制台观察到sleuth的日志输出。网关调用者提供者其中 9bd993c22c807eda是TraceId后面的是Span仔细分析每个微服务的日志不难看出请求的具体过程。查看日志文件并不是一个很好的方法可以使用Zipkin 进行可视化的查看服务之间的 链路请求当微服务越来越多日志文件也会越来越多通过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基于 API 组件实现的上层应用。通过 UI 组件用户可以方便而有直观地 查询 和 分析跟踪信息。Zipkin Server的部署和配置Zipkin Server下载从spring boot 2.0开始官方就不再支持使用自建Zipkin Server的方式进行服务链路追踪*而是直接提供了编译好的 jar 包来给我们使用。可以从官方网站下载先下载Zipkin的web UI*我们这里下载的是zipkin-server-2.12.9-exec.jar启动windows 控制台java -jar zipkin-server-2.12.9-exec.jar启动 Zipkin Server默认Zipkin Server的请求端口为9411客户端Zipkin Sleuth整合通过查看日志分析微服务的调用链路并不是一个很直观的方案结合zipkin可以很直观地显示微服务之间的调用关系。因为Sleuth是在所以模块下进行链路追踪的所以模块下都要进行配置哦*客户端添加依赖同样父工程下添加pom.xml!-- 客户端ZipkinSleuth整合 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-zipkin/artifactId/dependency客户端配置文件Spring 属性节点下配置yml.xmlspring:application:name:order-providerzipkin:base-url:http://127.0.0.1:9411/#zipkin server的请求地址sender:type:web#请求方式,默认以http的方式向zk server发送追踪数据sleuth:sampler:probability:1.0#采样的百分比,所有的监控记录...指定了zipkin server的地址下面制定需采样的百分比默认为0.1即10%这里配置1是记录全部的sleuth信息测试启动Zipkin Service。通过浏览器发送一次微服务请求。我们可以根据条件追踪每次请求调用过程链路追踪Sleuth-Zipkin与Mysql数据的持久化:上面说了存在内存中:Zipkin服务关闭监控的数据就丢失了Zipkin持久化数据库Mysqlmysql 脚本information_schema/* SQLyog Ultimate v11.33 (64 bit) MySQL - 5.5.58 : Database - zipkin ********************************************************************* */zipkin_dependencies/*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE*/; /*!40014 SET OLD_UNIQUE_CHECKSUNIQUE_CHECKS, UNIQUE_CHECKS0 */; /*!40014 SET OLD_FOREIGN_KEY_CHECKSFOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS0 */; /*!40101 SET OLD_SQL_MODESQL_MODE, SQL_MODENO_AUTO_VALUE_ON_ZERO */; /*!40111 SET OLD_SQL_NOTESSQL_NOTES, SQL_NOTES0 */; CREATE DATABASE /*!32312 IF NOT EXISTS*/zipkin/*!40100 DEFAULT CHARACTER SET utf8 */; USEzipkin; /*Table structure for tablezipkin_annotations*/ DROP TABLE IF EXISTSzipkin_annotations; CREATE TABLEzipkin_annotations(trace_id_highbigint(20) NOT NULL DEFAULT 0 COMMENT If non zero, this means the trace uses 128 bit traceIds instead of 64 bit,trace_idbigint(20) NOT NULL COMMENT coincides with zipkin_spans.trace_id,span_idbigint(20) NOT NULL COMMENT coincides with zipkin_spans.id,a_keyvarchar(255) NOT NULL COMMENT BinaryAnnotation.key or Annotation.value if type -1,a_valueblob COMMENT BinaryAnnotation.value(), which must be smaller than 64KB,a_typeint(11) NOT NULL COMMENT BinaryAnnotation.type() or -1 if Annotation,a_timestampbigint(20) DEFAULT NULL COMMENT Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp,endpoint_ipv4int(11) DEFAULT NULL COMMENT Null when Binary/Annotation.endpoint is null,endpoint_ipv6binary(16) DEFAULT NULL COMMENT Null when Binary/Annotation.endpoint is null, or no IPv6 address,endpoint_portsmallint(6) DEFAULT NULL COMMENT Null when Binary/Annotation.endpoint is null,endpoint_service_namevarchar(255) DEFAULT NULL COMMENT Null when Binary/Annotation.endpoint is null, UNIQUE KEYtrace_id_high(trace_id_high,trace_id,span_id,a_key,a_timestamp) COMMENT Ignore insert on duplicate, KEYtrace_id_high_2(trace_id_high,trace_id,span_id) COMMENT for joining with zipkin_spans, KEYtrace_id_high_3(trace_id_high,trace_id) COMMENT for getTraces/ByIds, KEYendpoint_service_name(endpoint_service_name) COMMENT for getTraces and getServiceNames, KEYa_type(a_type) COMMENT for getTraces, KEYa_key(a_key) COMMENT for getTraces, KEYtrace_id(trace_id,span_id,a_key) COMMENT for dependencies job ) ENGINEInnoDB DEFAULT CHARSETutf8 ROW_FORMATCOMPRESSED; /*Data for the tablezipkin_annotations*/ /*Table structure for tablezipkin_dependencies*/ DROP TABLE IF EXISTSzipkin_dependencies; CREATE TABLEzipkin_dependencies(daydate NOT NULL,parentvarchar(255) NOT NULL,childvarchar(255) NOT NULL,call_countbigint(20) DEFAULT NULL, UNIQUE KEYday(day,parent,child) ) ENGINEInnoDB DEFAULT CHARSETutf8 ROW_FORMATCOMPRESSED; /*Data for the tablezipkin_dependencies*/ /*Table structure for tablezipkin_spans*/ DROP TABLE IF EXISTSzipkin_spans; CREATE TABLEzipkin_spans(trace_id_highbigint(20) NOT NULL DEFAULT 0 COMMENT If non zero, this means the trace uses 128 bit traceIds instead of 64 bit,trace_idbigint(20) NOT NULL,idbigint(20) NOT NULL,namevarchar(255) NOT NULL,parent_idbigint(20) DEFAULT NULL,debugbit(1) DEFAULT NULL,start_tsbigint(20) DEFAULT NULL COMMENT Span.timestamp(): epoch micros used for endTs query and to implement TTL,durationbigint(20) DEFAULT NULL COMMENT Span.duration(): micros used for minDuration and maxDuration query, UNIQUE KEYtrace_id_high(trace_id_high,trace_id,id) COMMENT ignore insert on duplicate, KEYtrace_id_high_2(trace_id_high,trace_id,id) COMMENT for joining with zipkin_annotations, KEYtrace_id_high_3(trace_id_high,trace_id) COMMENT for getTracesByIds, KEYname(name) COMMENT for getTraces and getSpanNames, KEYstart_ts(start_ts) COMMENT for getTraces ordering and range ) ENGINEInnoDB DEFAULT CHARSETutf8 ROW_FORMATCOMPRESSED; /*Data for the tablezipkin_spans*//*!40101 SET SQL_MODEOLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKSOLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKSOLD_UNIQUE_CHECKS */;/*!40111 SET SQL_NOTESOLD_SQL_NOTES */;启动Zipkin Server (附带数据库)如果以及启动了上面的要记得关闭哦Windows 启动命令java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPEmysql --MYSQL_HOST127.0.0.1 --MYSQL_TCP_PORT3306 --MYSQL_DBzipkin --MYSQL_USERroot --MYSQL_PASSokSTORAGE_TYPE : 存储类型MYSQL_HOST mysql主机地址MYSQL_TCP_PORTmysql端口MYSQL_DB mysql数据库名称MYSQL_USERmysql用户名MYSQL_PASS mysql密码配置好服务端之后可以在浏览器请求几次。回到数据库查看会发现数据已经持久化到mysql中下次重启依然可以看到历史的链路追踪术语解释SpanSpan基本工作单元(相当于一次完整的请求一次请求对应一个 Span )Trace一系列 Spans 组成的一个树状结构例如如果你正在运行一个分布式大数据工程你可能需要创建一个 Trace。Span 通过一个 64 位 ID 唯一标识, Trace 以另一个 64 位 ID 表示。 可以在控制台中查看Annotation用来即使记录一个事件的存在一些核心 Annotations 用来定义一个请求的开始和结束:在Zipkin Ul页面上, 可以之间对某个服务进行查看: 调用方/提供方 响应请求时间…CS客户端发起一个请求这个 Annotation 描述了这个Span 请求 的开始SS服务端获得请求并准备开始处理它如果将其ss 减去 cs时间戳便可得到网络延迟SF表明请求处理的完成(当请求返回客户端)如果sf 减去 ss时间戳便可得到服务端需要的处理请求时间CF表明 Span 的结束客户端成功接收到服务端的回复,如果cf 减去 cs时间戳便可得到客户端从服务端获取回复的所有所需时间
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。