文章结尾有彩蛋
随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。而诸多的服务可能分布在了几千台服务器,横跨多个不同的数据中心。为了快速定位和解决故障,应用性能进行分析,全链路监控组件就在这样的问题背景下产生了。最出名的是谷歌公开的论文提到的Google Dapper。本文主要介绍了Spring Cloud Gateway全链路实现解决方案。主要讲解全链路原理和方案;最后分享如何实现探针全链路。
全链路原理
主流的全链路方案都是采用谷歌公开的论文提到的Google Dapper方案。
-
一个Span表示一个服务的调用开始到结束。
-
如果一个Span没有父ID则被称之为入口Span,需负责生成本次链路调用全局唯一的TxId。
-
如果服务间有调用,则透传TxId、SpanId和pSpanId,每个SpanId需重新生成,pSpanId采用调用方的SpanId。
-
被调用服务需将透传的头信息恢复,继续透传后续节点。
-
最终根据Span的关联性生成链路树。
将应用以角色进行区分,分为Server端和Client端。
Server端负责接收请求,其流程主要分为三步:
-
创建入口Span
-
解析并恢复上游头信息: TxId、SpanId和pSpanId
-
结束入口Span
Client端负责发送请求,其流程也分为三步:
-
创建子Span
-
传递给下游头信息:TxId、新的SpanId和pSpanId(上游节点的SpanId)
-
结束子Span
其中Dubbo Attachment、HttpRequest Header、MQ Property是Map类型,都可以进行头信息传输。
全链路方案
<