当前位置: 首页 > 科技观察

LinkTracking-CorePrinciplesandSolutions

时间:2023-03-15 09:59:18 科技观察

本章概述随着互联网的不断发展,企业的业务系统变得越来越复杂,原有单一的应用系统已经不能满足业务发展的需要的企业。于是,很多公司开始将项目向分布式和微服务化转型,新的项目一开始都会采用分布式和微服务的架构。一个系统采用分布式微服务架构后,会被拆分成很多服务模块。这些服务模块之间的调用关系错综复杂,客户端请求的分析处理会显得异常复杂。这时候就需要一种技术来解决这些问题,这种技术就是分布式链路跟踪技术。分布式链路跟踪随着互联网业务的迅速扩张,企业的业务系统也变得越来越复杂。很多企业开始往分布式和微服务方向发展,将原来单一的应用拆分成分布式和微服务。.这也使得当客户端请求系统的接口时,原来同一个系统内部的请求逻辑变成了一个需要在多个微服务之间流转的请求。在单体架构中,可以通过AOP打印调用具体业务逻辑前后的时间来计算整体调用时间。使用AOP捕捉异常也可以知道是哪里的调用导致了异常。但是在分布式微服务场景下,使用AOP技术无法跟踪到每一个微服务的调用情况,无法知道系统中处理一个请求的整体调用链路。另外,在分布式和微服务场景下,我们需要解决以下问题:如何快速发现和定位分布式系统中的问题。如何尽可能准确地判断故障对系统的影响范围和影响程度。如何尽可能准确的梳理出服务之间的依赖关系,判断服务之间的依赖关系是否合理。如何尽可能准确的分析出整个系统调用环节的性能和瓶颈点。如何尽可能准确地分析系统的存储瓶颈和容量规划。如何实时观察系统整体调用链路状态。以上问题是分布式链路跟踪技术要解决的问题。所谓分布式链路跟踪,就是将对分布式系统的请求转化为完整的调用链路。这个完整的调用链从请求进入分布式系统开始,直到整个请求返回。并在请求调用微服务的过程中,记录相应的调用日志,监控系统调用的性能,并以一定的方式展示请求调用。在分布式链路追踪中,可以统计调用每个微服务所花费的时间、请求会经过哪些微服务、每个微服务的运行状态等信息。核心原理假设三个微服务调用的链接如下图所示:Service1调用Service2,Service2调用Service3和Service4。然后链接跟踪会在每个服务调用中添加TraceID和SpanID。如下图:小伙伴们注意上面的颜色,相同的颜色代表相同的SpanID,说明是linktracking中的节点。第一步:客户端调用Service1产生Request,TraceID和SpanID为空,此时请求还没有到达Service1。Step2:请求到达Service1,记录TraceID=X,SpanID等于A。Step3:Service1向Service2发送请求,SpanID等于B,称为ClientSent,即即,客户端发送请求。第四步:请求到达Service2,SpanID等于B,TraceID不变。称为ServerReceived,即服务器收到请求,准备开始解决。第五步:服务2开始解析请求。求解完成后,TraceID不变,SpanID=C。Step6:Service2开始向Service3发送这个请求,TraceID不变,SpanID=D,调用ClientSent,即客户端发送请求。第七步:Service3收到这个请求,SpanID=D,称为ServerReceived。Step8:Service3开始解决这个请求,解决后,SpanID=E。Step9:Service3开始向Service2,SpanID=D发送响应,称为ServerSent,即服务器发送响应。第十步:Service3收到Service2的响应,SpanID=D,称为ClientReceived,即客户端收到响应。第十一步:Service2开始向Service1返回响应,SpanID=B,与第三步中的SpanID相同,称为ClientReceived,即客户端收到响应。第12步:Service1解析响应后,SpanID=A,与第二步中的SpanID相同。第13步:Service1开始向客户端返回响应,SpanID=A,Service3向Service4发送请求类似于Service3,对应的SpanID为F和G,可以参考第六到第十上面的步骤。将上述相同颜色的步骤简化成如下链接跟踪图:第一个节点:SpanID=A,ParentID=null,Service1收到请求。第二个节点:SpanID=B,ParentID=A,Service1向Service2发送请求,返回响应给Service1。第三个节点:SpanID=C,ParentID=B,Service的中间解析过程2.第四个节点:SpanID=D,ParentID=C,Service2向Service3发送请求,返回响应给Service2。第五个节点:SpanID=E,ParentID=D,中间解析过程Service3的第6个节点:SpanID=F,ParentID=C,Service3向Service4发送请求,返回响应给Service3。第7个节点:SpanID=G,ParentID=F,中间Service4的解析过程,通过ParentID可以找到父节点,可以全程跟踪追溯。备注:核心原理部分内容来自:cnblogs.com/jackson0714/p/sleuth_zipkin.html解决方案目前业界比较成熟的分布式链接跟踪技术方案有以下几种。技术说明Cat由大众点评开源。是基于Java开发的实时应用监控平台,包括实时应用监控和业务监控。集成方案是通过代码埋点来实现监控,比如:拦截器、过滤器等,对代码的侵入性很大,集成成本高。风险更大。ZipKin由Twitter开源,是一个开源的分布式跟踪系统,用于采集服务的时序数据,解决微服务架构中的延迟问题,包括:数据采集、存储、搜索和展示。与spring-cloud-sleuth结合使用比较简单,集成方便,但功能比较单一。PinpointPinpoint是一款开源的基于字节码注入的调用链分析和应用监控分析工具。其特点是支持多种插件,UI功能强大,接入端无代码入侵。SkywalkingSkyWalking是一款开源的基于字节码注入的调用链分析和应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码入侵。SleuthSleuth是SpringCloud中的一个组件,实现了SpringCloud的分布式追踪解决方案。