手机定位追踪系统原理框图 微服务追踪平台

                   
专业调查机构联系电话,18610181714。代您查询删除各类记录资料,请来电咨询。

我们学习了一下分布式调用链追踪平台的机理和实践,有些读者对其中的推动原理提出了一些问题,所以有了这篇专门写给小白看的微服务追踪平台,相信你们看完对其原理会有更透彻的理解,这里谢谢公号「码农翻身」刘欣老师的指导!

前言

在微服务架构中,一次请求通常涉及到多个模块,多个后面件,多台机器的互相协作才能完成。这一系列调用请求中,有些是串行的手机定位追踪系统原理框图,有些是并行的,那么怎样确认这个请求背后调用了这些服务,哪些组件,哪些节点及调用的先后次序?怎么定位每个组件的性能问题?本文将为你揭晓答案。

微服务架构

这是一个稍微复杂的举例

如果有客户反馈某个页面很慢,我们了解这个页面的请求调用链是A----->C----->B----->D,此时如何定位或许是什么模块引起的难题呢?

更进一步,如果每个服务ServiceA,B,C,D都部署在好几台机器上。怎么清楚某个请求调用了服务的详细哪台机器呢?

可以显著提到,由于未能确切定位每个请求经过的准确路径,在微服务这些架构下有下面几个痛点:

1.排查问题难度大,周期长

2.特定场景难复现

3.系统性能瓶颈分析较难

有没有一种方法可以精确地形成完整的读取链,并且用可视化的方法展现出来呢?

这就必须一个分布式调用链追踪平台。

分布式调用链追踪平台:设计

想想看,如果要我们自己实现一个这种的分布式追踪平台,该如何去设计?

首先,我们需要得区别每个调用链(起个时髦的名称叫Trace),得给它分配一个全局唯一的ID(称为TraceID),并且在调用链上的每天调用都带上这个ID,这样每个子调用都被关联起来了。

其次,我们得记录所有调用的先后顺序和兄弟关系。

假设有以上这种的调用链,如果我们只记录了这四个调用:

A---->B

B---->C

A---->D

D---->E

D---->F

然而我们了解它属于一个调用(TraceID相同),还是能够画出完整的调用拓扑图。

然而需要得记录父子关系:

A---->B是B---->C的父调用

A---->D是D---->E的父调用

A---->D还是D---->F的父调用

如何记录呢?应该给每位调用分配一个ID(称为SpanID),并且把这个ID传递给子调用,子调用根据ParentSpanID生成自己的SpanID:

用表格展示是这种:

这种根据id间的关系就很容易据此画出调用链了(即可视化视图)

魔法师Agent

后面说得挺容易,但是在分布式的环境下,如何能够恰当地生成TraceID,ParentSpanID,SpanID呢?

微服务是来推动业务的,肯定不能来干这个监控和跟踪的活儿,那样对微服务的侵入性就太强了。

然而需要得有一个独立的模块,在不干扰微服务的状况下,监控微服务之间的读取,把这种ID生成,这个独立的模块就是Agent。

Agent要想施展魔法,需要安装在每个服务所在的机器上:

这个魔法师依照的规则也十分简洁,以上图中服务A上的Agent为例:

1.当Agent监控到有人在调用服务A,但是没有ParentSpanID,它就明白,这是一次全新的调用,应该创建新的TraceID。

2.当Agent监控到A调用了B时,它就可以生成SpanID=1,并且把这个ID当作ParentSpanID传递给B。这样当B调用C的之后,B的Agent就能生成此次调用的SpanID为1.1

3.当Agent监控到A调用D的之后,可以生成SpanID=2,并且把这个ID当作ParentSpanID传递给D

D在调用E和F的之后,就能分别生成SpanID2.1和2.2

你可能注意到了一个难题:微服务都是跨进程调用的,怎么可能把TraceID,ParentSpanID在服务之间传来传去呢?

这就必须Agent来施展“魔法”了,Agent必须理解微服务之间的存储协议,然后把TraceID,ParentSpanID悄悄地“藏”到某个地方,传递给下一个服务。

比如HTTP协议中定义了Header与Body,Header一般放请求的长度手机定位追踪系统原理框图,请求IP等非业务的信息。业务数据通常放在Body中。于是Agent就可以把TraceID,ParentSpanID悄悄地“藏到”Header中,这样既不会对Body中的业务数据产生制约,又可以把跟踪所需的数据传递给下一个服务了。

你的脑海中或许早已想到Agent的实现原理了,这个Agent可以这样来实现:

指定微服务中的“RPC调用的公用程序”(比如Dubbo中的MonitorFilter.invoke方法),然后在运行时,通过动态更改字节码的方法来增强它:

当服务A调用服务B时,Agent就可以做点儿手脚,修改header了:

数据收集

Agent虽然监控、生成了足够多的数据,但是单个Agent无法获取全局视图,我们必须一个全局的收集器来把Agent的数据收集上来,这样就能生成全局的调用链。

数据收集器获取了全局的数据之后,就可以画出好看的调用链的图了,例如这个:

小结

经过一番探索,一个分布式调用链平台的核心部件和推动原理浮出水面,当然,其中也有众多细节必须处理,例如采样的频度,全局唯一ID的生成算法,UI界面之类。市面上有不少开源的分布式跟踪平台,如SkyWalking、Zipkin、Pinpoint等等,感兴趣的可以再次深入探究。


本文地址:http://www.tonghuachaxuns.com//chanpin/11559.html