蓝印花布的历史由来


蓝印花布的历史由来

1、概述在分布式服务时代 , 服务之间的请求域调用不再是简单的直连方式 , 注册中心的出现,让服务治理更加便利,也对服务之间的链路追踪提出了更高的要求 。
分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等
理论支撑 。目前比较主流的链路追踪产品都是启发于google发表的Dapper , Dapper阐述了分布式系统 , 特别是微服务架构中链路追踪的概念、数据表示、埋点、传递、收集、存储与展示等技术细节 。
标准化 。OpenTracing(http://opentracing.io/)是一个分布式跟踪框架 。OpenTracing通过提供平台无关、厂商无关的API,使得开发人员能够方便的添加(或更换)追踪系统的实现 。目前OpenTracing正在为全球的分布式追踪,提供统一的概念和数据标准 。
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 详细介绍
https://segmentfault.com/a/1190000015977174
2. Skywalking分析
https://blog.csdn.net/Saphulot/article/details/81739411
3. zipkin的工作原理浅析
https://blog.csdn.net/shida_hu/article/details/89450177
4. Istio 调用链埋点原理剖析—是否真的“零修改”?
https://mp.weixin.qq.com/s?src=https://www.masfls.com/knowledge/11×tamp=1581385567&ver=2151&signature=msOWkdym*Cm-1XIXl6VFAlsjQlTOFmXZB4NjcMuXVnTw1iV*SE3Nbew4rGsKhPCQdxg6vfKZ18jeVA2JoqrFNOnscHI21R3JCcNYK-2jub5DMYeDoW43iM4*Xx5PDBEX&new=1
5. google dapper论文 中文
【蓝印花布的历史由来】 https://blog.csdn.net/yangzishiw/article/details/79402084
,

猜你喜欢