如何实现分布式链路跟踪

6 篇文章 0 订阅
5 篇文章 0 订阅

在分布式系统中,一组独立的服务相互协作完成特定的业务功能。而服务之间的调用不可避免会出现各种问题,这时候就需要引入分布式链路跟踪体系来定位和解决这些问题。服务调用链路跟踪是分布式系统的基础需求之一,业界关于分布式链路跟踪也有统一的规范以及代表性的实现框架。

在Web系统开发过程中,我们基于业务划分服务并对外暴露服务访问接口。在中大型系统中,可能需要很多个服务相互协同才能完成一个接口功能。而随着业务的不断扩张,服务之间相互调用关系会越来越复杂。、


上图中,随着服务数量的不断增加,整个调用链路的分析工作会变得越来越复杂。通过人工手段显然已经无法完成这种服务调用链路的分析。这时候,我们就需要引入分布式服务跟踪机制并借助于一定的工具实现微服务架构下的服务监控。

分布式服务跟踪基本原理

我们先来分析一下分布式服务跟踪的基本原理,这里需要引入两个基本概念,即TraceId和SpanId。

TraceId和SpanId

  1. TraceId

TraceId即跟踪Id。在分布式架构中,每个请求会生成一个全局的唯一性Id,通过这个Id可以串联起整个调用链,也就是说请求在分布式系统内部流转时,系统需要始终保持传递该唯一性Id,直到请求返回。这个唯一性Id就是TraceId。

  1. SpanId

除了TraceId外,我们还需要SpanId,SpanId一般被称为跨度Id。所谓跨度,就是调用链路中的其中一段时间,具有明确的开始和结束这两个节点,这样通过计算开始时间和结束时间之间的时间差,我们就能明确调用过程在这个Span上所产生的时间延迟。

通过前面的介绍,我们不难理解TraceId和SpanId之间是一对多的关系,即在一个调用链路中只会存在一个TraceId,但会存在多个Span。这样多个SpanId之间就会有父子关系,即链路中的前一个SpanId是后一个SpanId的父SpanId。


四种注解

理解了TraceId和SpanId的概念之后,我们就需要对整个分布式调用链路进行进一步拆分,从而细化控制的粒度。业界一般通过四种不同的注解(Annotation)记录每个服务的客户端请求和服务器响应过程。

  1. cs注解

cs 代表Client Send,即客户端发送请求,启动整个调用链路。

  1. sr注解

sr 代表Server Receive,即服务端接收请求。显然,(sr-cs)值代表请求从客户端到服务器端所需要的网络传输时间。

  1. ss注解

ss 代表Server Send,即服务端把请求处理结果返回给客户端。(ss-sr)值代表服务器端处理该请求所需要的时间。

  1. cr注解

cr 代表Client Receive,即客户端接收到服务端响应,结束调用链路。(cr-sr)值代表响应结果从服务器端传输到客户端所需要的时间。

下面结合一张示意图来进一步解释这四种注解之间的关联关系。


有了这四个注解之后,我们就可以使用它们来量化整个服务调用链路,从而找出潜在的问题。这里同样给出一个示意图。

在上图中,我们看到这次请求的TraceId是trace1,而SpanId根据不同的服务会发生变化。而四种注解构成了客户端和服务器对一次请求处理的闭环,对于服务A而言,cs是11:10:44, cr是11:10:55,也就说该次服务请求经由服务A的整个调用链路时间是11s(11:10:44-11:10:55),显然这个响应时间非常长。

分布式服务跟踪工具Spring Cloud Sleuth

通过这些注解我们就可以发现服务调用链路中存在的问题,目前主流的服务监控实现工具都对这些注解做了支持和封装。下面我们就基于Spring Cloud家族中的Spring Cloud Sleuth(SCS)这款工具来分析具体的分布式链路跟踪使用方式。

对于分布式环境下的服务调用链路,我们可以通过Spring Cloud Sleuth完成两件事情,即服务调用链路的构建以及服务监控数据的分析。

使用SCS构建服务调用链路

通过将Spring Cloud Sleuth添加到系统的类路径,系统便会自动建立日志收集渠道,不仅包括常见的Spring MVC控制器接收的HTTP请求或使用RestTemplate发出的请求,同时也能无缝支持通过Zuul网关发送的请求。现在,假设我们有一个userservice,那么通过SCS会生成类似这样的日志信息:

INFO [userservice,81d66b6e43e71faa,6df220755223fb6e,true] 18100 --- [nio-8082-exec-8] c.s.user.controller.UserController       : Get user by userName from 8082 port of userservice instance

我们关注于上述日志信息中的斜体部分内容,包括了四段内容,即服务名称、TraceId、SpanId和Zipkin标志位,它是格式如下所示:

[服务名称, TraceId, SpanId, Zipkin标志位]

显然,第一段中的userservice代表着该服务的名称。第二段中的TraceId代表一次完整请求的唯一编号,上例中的81d66b6e43e71faa就是该次请求的唯一编号。而第三段中的6df220755223fb6e就是这个TraceId下的一个SpanId。最后的第四段代表Zipkin标志位,该标志位用于识别是否将服务跟踪信息同步到Zipkin。Zipkin是一款可视化工具,可以使用来它存储和可视化服务监控数据。让我们一起来看一下。

使用SCS分析服务监控数据

针对监控数据的管理,Spring Cloud Sleuth可以设置常见的日志格式来输出TraceId和SpanId。我们也可以利用诸如Logstash等日志发布组件将日志发布到Elastic Search等日志分析工具中进行处理。同时,Spring Cloud Sleuth也兼容了Zipkin、HTrace等第三方工具的应用和集成。这里我们以Zipkin为例展开讨论。

在结构上,Zipkin包含几个核心的组件。其中收集器组件用来接收来自各个传输器的数据;存储器代表存储组件,用来存储收集过来的数据;API组件提供简单的RESTful API,负责查询存储器中存储的数据;UI组件提供简单的Web界面,可以方便而直观的查询和分析跟踪信息。


对于服务监控而言,服务调用链数据收集、分析和管理的目的是为了发现服务调用过程的问题并采取相应的优化措施。Zipkin的最大优势在于提供了完整的可视化解决方案,通过它可以实现服务调用时序和服务调用数据的可视化。下图展示了Zipkin可视化服务调用时序的主界面。


针对某个服务,Zipkin的查询结果展示了包含该服务的所有调用链路,Zipkin上的执行效果如下图所示。


当发起这个HTTP请求时,该请求会先到达网关服务zuulservice,然后再通过路由转发到userservice。上图中最重要的就是各个Span信息。一个服务调用链路被分解成若干个Span,每个Span代表完整调用链路中的一个可以衡量的部分。我们通过可视化的界面,可以看到整个访问链路的整体时长以及各个Span所花费的时间。每个Span的时延都已经被量化,并通过背景颜色的深浅来表示时延的大小。

在上图中,我们点击任何一个感兴趣的Span就可以获取该Span对应的各项服务调用数据明细。例如,我们点击“get /users/username/{username}”这个Span,Zipkin会跳转到一个新的页面并显示如下图所示的数据。


这里看到了本次调用中用于监控的最重要的元数据TraceId和SpanId。我们也可以进一步可以得到如下图所示的注解明细信息。


上图展示了针对该Span的cs、sr、ss和cr这四个注解数据。对于这个Span而言,zuulservice相当于是userservice的客户端,所以zuulservice触发了cs事件,然后通过(17.160 – 2.102)ms到达了userservice,以此类推。从这些注解数据中可以得出一个结论,即该请求的整个服务响应时间主要取决于userservice自身的处理时间。如果这一处理时间过长,那么我们就可以有针对性的采取优化措施。

总结

可以说,构建服务监控和链路跟踪在分布式系统开发过程中是一项基础设施类工作。关于服务监控的基本原理其实并不复杂,业界也已经形成了一套比较统一的专业术语和方法论。而Spring Cloud Sleuth就是基于这些原理的一种具体实现工具。Spring Cloud Sleuth为我们提供了一种代码免侵入的整合方案,在多个服务进行交互的过程中,通过获取Trace和Span信息就能构建整个服务调用链路。同时,它还可以通过集成Zipkin提供可视化服务调用时序和获取服务调用数据等强大功能。

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在简化和加速从概念设计到产品部署的各个环节。以下是开发工具的主要作用: 代码编写与编辑: 提供集成开发环境(IDE),如Visual Studio、Eclipse、Android Studio和Sublime Text等,这些工具集成了文本编辑器,支持语法高亮、自动补全、代码片段管理和版本控制等功能,有助于开发者高效编写和维护代码。 项目管理: 支持项目创建、组织、构建自动化以及依赖管理,确保不同模块和组件之间的协调一致。 编译与构建: 包括编译器、构建工具(如Make、Gradle、Maven)等,用于将源代码转换为可执行文件或库,并进行资源打包、优化等处理。 调试与测试: 集成调试器允许开发者逐行执行代码,设置断点、查看变量值、跟踪调用堆栈等,帮助定位并修复代码中的错误。 测试框架和工具则协助开发者编写和运行单元测试、集成测试及性能测试,确保软件质量。 版本控制与协作: 通过集成Git、SVN等版本控制系统,支持团队成员间的代码共享、分支管理、合并请求和冲突解决。 可视化设计与原型制作: 对于UI/UX设计,有界面设计工具,如Sketch、Adobe XD,可以帮助设计师快速构建应用程序界面模型,并生成规范的设计稿供开发人员参考实现。 跨平台支持: 跨平台开发工具如Xamarin、React Native和Flutter,让开发者使用一种语言或框架编写可以在多个操作系统上运行的应用程序。 文档编写与API管理: 文档生成工具可以自动生成代码注释文档,便于团队内外理解和使用项目代码。 API管理工具则方便开发者创建、测试、发布和维护API接口。 持续集成与持续部署(CI/CD): Jenkins、Travis CI、GitHub Actions等工具负责自动化构建、测试和部署流程,提高交付效率和可靠性。 数据库管理与ORM工具: 数据库客户端工具用于连接、查询、更新数据库,ORM(对象关系映射)工具简化了数据操作和持久化层的开发工作。 总之,开发工具极大地提升了软件工程师的工作效率,保证了开发过程中的准确性与一致性,同时也促进了团队合作,使得软件开发更系统化、规范化和工业化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值