微服务链路追踪_分布式服务链路追踪技术分析及对⽐
1、概述
在分布式服务时代,服务之间的请求域调⽤不再是简单的直连⽅式,注册中⼼的出现,让服务治理更加便利,也对服务之间的链路追踪提出了更⾼的要求。
分布式链路追踪就是将⼀次分布式请求还原成调⽤链路,将⼀次分布式请求的调⽤情况集中展⽰,⽐如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等
理论⽀撑。⽬前⽐较主流的链路追踪产品都是启发于google发表的Dapper,Dapper阐述了分布式系统,特别是微服务架构中链路追踪的概念、数据表⽰、埋点、传递、收集、存储与展⽰等技术细节。
2、追踪理论 - Dapper
为了实现链路追踪,dapper提出了trace,span,annotation的概念。
Trace的含义⽐较直观,就是链路,指⼀个请求经过后端所有服务的路径,每⼀条链路都⽤⼀个全局唯⼀的traceid来标识。
分布式和微服务的关系span之间存在着⽗⼦关系,上游的span是下游的⽗span,每个span由spanid和parentid来标识,spanid在⼀条链路中唯⼀。
⼀个span⼀般由client和server两个部分的信息组成。按照时间顺序来解释,client节点(或者是调⽤⽅)⾸先发出请求,产⽣”client send”(cs)事件,紧接着server节点(或者是提供⽅)收到请求,产⽣”server receive”(sr)事件,server处理完成之后回复给client,产⽣”server send”事件,最后client收到回复,产⽣”client receive”事件。 Client与server两个节点的span信息合并成⼀次完整的调⽤,即⼀个完整的span。
Dapper中还定义了annotation的概念,⽤于⽤户⾃定义事件。
3、通⽤架构分析
主流的链路追踪产品架构包含以下四⼤模块:采样、收集、存储与展⽰。
通⽤架构图
3.1 采样
采样包含采集埋点、链路信息的传递以及链路信息上报,⽬前主流的埋点⽅式有三种,分别是应⽤拦截埋点,探针(java agent)埋点,服务器拦截埋点。其中应⽤拦截埋点有代码侵⼊,需要⼆次开发,其他⼆者与服务的耦合度较低,⽆需侵⼊。
由于每⼀个请求就会⽣成⼀个链路,为了减少性能消耗,避免存储资源的浪费,dapper并不会上报所有的span数据,⽽是使⽤采样的⽅式。通过采集端⾃适应地调整采样率,控制span上报的数量,可以在发现性能瓶颈的同时,有效减少性能损耗。
3.2 收集
收集端服务接收采集到的链路信息并进⾏分析,链路信息的传递有两种⽅,分别是http和grpc,其中http⽅式简单易⽤、维护成本低,使⽤率较⾼,grpc性能突出,但需要客户端代码,维护成本较⾼。
3.3 存储
分布式链路追踪系统⽀持海量的数据库存储。Mysql、Hbase、ElasticSearch等关系型数据库和⾮关系
型数据库均能存储链路信息,主流的存储选择是ElasticSearch,ElasticSearch可以提供⾼效的数据检索,为数据的应⽤提供可靠的性能⽀持。
3.4 展⽰
⽬前主流的分布式链路追踪框架⼤多有⾃⼰的链路展⽰UI,内容主要有服务拓扑、调⽤链时序图和检索等。
4、主流的实现⽅式
⽬前⽐较典型的分布式链路追踪框架主要有skywalking、istio和zipkin
,三者主要的区别体现在埋点⽅式的差异上。
4.1 skywalking
SkyWalking 是观察性分析平台和应⽤性能管理系统。
提供分布式追踪、服务⽹格遥测分析、度量聚合和可视化⼀体化解决⽅案。
Skywalking采⽤探针的⽅式进⾏埋点。以java为例,Skywalking只需要在java程序启动时指定其为java agent即可,以这种⼆进制注⼊的⽅式,拦截应⽤程序的流量,截取其中的链路流转信息。Skywalking⽀持多语⾔探针,提供了Java,.NET Core和Node.JS等主流开发语⾔的探针插件。
探针埋点⽰意图
4.1 istio
Istio提供了 Service Mesh ⽅式服务治理的完整的解决⽅案,服务运⾏的监控数据可以动态获取和输出,提供了强⼤的调⽤链、监控和调⽤⽇志收集输出的能⼒,通过⾮侵⼊的⽅式提供了服务的连接、控制、保护和观测能⼒。
Envoy代理埋点。在 Istio 中,所有的治理逻辑的执⾏体都是和业务容器⼀起部署的 Envoy 这个 Sidecar,拦截所有的流⼊和流出业务程序的流量,根据收到的规则执⾏执⾏各种动作。
Iptables 脚本通过 Iptables 规则拦截 pod 中流量,并发送到 Envoy 上。Envoy 拦截到 Inbound 和 Outbound 的流量会分别作不同操作,执⾏上⾯配置的操作,另外再把请求往下发,对于 Outbound 就是根据服务发现到对应的⽬标服务后端上,对于 Inbound 流量则直接发到本地的服务实例上,Envoy在此进⾏埋点,截取Inbound和Outbound的链路信息,参照OpenTracing标准⽣成标准的调⽤链数据。
Envoy埋点⽰意图
4.1 zipkin
Zipkin分为client端和server端,client端需要应⽤系统代码引⼊,并可以进⾏灵活的⼆次开发,client端实现数据采集,server端负责链路数据的分析⼊库等。
框架埋点。应⽤系统引⼊client端代码,应⽤请求会被Trace框架拦截,将调⽤链信息添加到Header中,并传递到后续的服务调⽤中,每次跳转都会传递调⽤信息,上报trace信息(时间戳、耗时等),server端的Collecter会汇总所有的跳转信息,合并成⼀条完整的调⽤链信息。
框架埋点⽰意图
4.4 综合对⽐
综合对⽐图
5、参考⽂献
1. java agent 详细介绍
2. Skywalking分析
3. zipkin的⼯作原理浅析
4. Istio 调⽤链埋点原理剖析—是否真的“零修改”?
5. google dapper论⽂ 中⽂
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论