调用链系统很多:Dapper,鹰眼,hydra,cat,zipkin,skywalking。其实不管是任何一个调用链系统,底层的实现都是一致的。一起了解下它的底层实现。

(一)调⽤链系统的本质

  • ⼀张⽹⻚,要经历怎样的过程,才能抵达⽤户⾯前?

这是阿里早期面试最喜欢问的问题,问这个问题就是要了解你对技术的宽度。

  • ⽹络传输层

# 该命令可直接跟踪网络通信所经过的节点
tracert www.baidu.com

  • 负载均衡层

早期的监控系统只监控网络服务。

  • 系统服务层

现在的监控系统直接深入系统的内部。应用系统,数据库,第三方的资源服务,请求第三方api的接口。

  • 调⽤链基本元素

基本所有的调用系统都是这些元素,可能名称叫法不同。

1.事件

请求处理过程当中的具体动作
2.节点
请求所经过的系统节点,即事件的空间属性。
3.时间
事件的开始和结束时间
4.关系
事件与上⼀个事件关系。
0.1和0.1.1,0.1.2是父子关系
02和0.2.3,0.2.1,0.2.2是是父子关系。
吃饭是一个事件,夹筷子是吃饭的子事件,张嘴是吃饭的子事件。嘴动是吃饭的子事件。都是嵌套关系。

  • 调⽤链系统本质上就是⽤来回答这⼏问题

跟写作文一样,时间,地点,任务,事件。(事件是一个串一个,还要保证他们之间的关系不是错综复杂的,还要并发的情况这些调用事件不是错乱的才算完成,理论很简单,但是真正要搞明白,在生产环境使用还要解决很多很多问题。)

1.什么时间?
2.在什么节点上?
3.发⽣了什么事情?
4.这个事情由谁触发?

  • 事件捕捉

其实就是输出信息

1.硬编码埋点捕捉
2.AOP埋点捕捉
3.公开组件埋点捕捉
4.字节码插桩捕捉

  • 事件串联

事件串联的⽬的

1.所有事件都关联到同⼀个调⽤
2.各个事件之间是有层级关系的

为了到达这两个⽬的地,⼏乎所有的调⽤链系统都会有以下两个属性:
trackID:在整个系统中唯⼀,该值相同的事件表示同⼀次调⽤。
eventID(spanID):在⼀次调⽤中唯⼀、并展出事件的层级关系

1、怎么⽣成TrackID
2、怎么传递参数
3、怎么并发情况下不允响传递的结果

  • 串联的过程:
    1.由跟踪的起点⽣成⼀个TrackId, ⼀直传递⾄所有节点,并保存在事件属性值当中。
    2.由跟踪的起点⽣成初始EventId(SpanID),每捕捉⼀个事件ID加1,每传递⼀次,层级加1。

  • trackId与eventId 的传递

  • eventId ⾃增⽣成⽅式

埋在具体某个实现⽅法类,当多线程调⽤该⽅法时如何保证⾃增正确性?

解决办法是每个跟踪请求创建⼀个互相独⽴的会话,EventId的⾃增都基于该会话实现。通常会话对象的存储基于ThreadLocal实现。

  • 事件的开始与结束

我们知道⼀个事件是⼀个时间段内系统执⾏的若⼲动作,所以对于事件捕捉必须包含开启监听和结束监听两个动作?如果⼀个事件在⼀个⽅法内完成的,这个问题是⽐较好解决的,我们只要在⽅法的开始创建⼀个Event对象,在⽅法结束时调⽤该对像的close ⽅法即可。

public void addUser(){
// 方法的开始处,开启一个监听
Event event=new Event();
//业务代码执行
.....
.....
// 方法的结束处,关闭一个监听
event.close();
}

但如果⼀个事件的开始和结束触发分布在多个对象或⽅法当中,情况就会变得异常复杂。⽐如⼀个JDBC执⾏事件,应该是在构建 Statement 时开始,在Statement 关闭时结束。怎样把这两个触发动作对应到同⼀个事件当中去呢(即传递Event对象)?在这⾥的解决办法是对返回结果进⾏动态代理,把Event放置到代理对象的属性当中,以达到付递的⽬标。当这个⽅法只是适应JDBC这⼀个场景,其它场景需要重新设计Event 传递路径,⽬前还没有通⽤的解决办法。

// JDBC事件开始
Connection.prepareStatement(String sql);
//JDBC 事件结束
PreparedStatement.close();
  • 上传
  1. 基于Http请求直接上传
  2. 打印⽇志,然后在基于Flume或Logstash采集上传。
    第⼀种相对简单,直接把数据发送服务进⾏持久化,但如果系统流量较⼤的情况下,会影响系统本身的性能,造成压⼒。第⼆种相对复杂,但可以应对⼤流量,通常情况下会采⽤第⼆种解决办法

(二)项⽬部署

  • 调⽤链Agent 如何部署
  1. 下载 agent.zip ⾄应⽤系统
  2. 解压缩 agent.zip
  3. 添加jvm 参数 -javaagent: <cbt-agent-bootstrap-1.0-SNAPSHOT.jar 路径>
  4. 重启应⽤

1.下载Agent.zip
2.在你启动项⽬的JVM参数⾥添加 -javaagent:cbt-agent-bootstrap-1.0-SNAPSHOT.jar
3.重启你的应⽤,观察你的应⽤⽇志,如果发现以下⽇志代表启动成功了

[2018-06-12:10:32:42]加载藏宝图配置文件来自G:\git\cbt-
agent\out\conf\cbt.properties
[2018-06-12:10:32:43]藏宝图服务登陆成功!
[2018-06-12:10:32:43]藏宝图服务启动成功!

4.登陆 调⽤链管理WEB⻚⾯ http://client.cbtu.pro:9978/trace/requests

PS:调用链系统并非自己原创,也是通过网络学习获得的,但是我会在上边进行改良,以达到自己需要,并会告诉大家如何搭建,最终可以在微服务项目上受用。

『互联网架构』调⽤链系统底层逻辑相关推荐

  1. 『互联网架构』软件架构-电商系统架构发展历程-1

    以之前看的一本书淘宝这十年来,一起回顾下电商系统的发展历程,其实也折射了目前很多系统的技术的发展变革.源码中有本书,[淘宝技术这十年],从单机版到目前淘宝的技术状态. 目录 (一)目的 (二)一个电商 ...

  2. 『互联网架构』埋点基础知识

    上节给整个调用链的体系结构讲述了,按照我的流程可以搭建出来调用链的项目.架构目标基本功能,可扩展性,可配置性,可运维性.识别系统的方式,就是通过唯一性的包名来完成的.就像克隆人一样的基因都是一样的被识 ...

  3. 『互联网架构』软件架构-mysql主从(二)

    通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低. 为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载. 而且如果主数据库宕机,可快速 ...

  4. 『互联网架构』软件架构-分布式架构

    分布式架构:原理,设计与实战,目前公司每个月都要出账,出账就是每个月有要把之前的一个月的账目盘算清楚,做到错误的0容忍,一笔都不能错,错一笔客户都会找你,偏准确性.4个9,5个9并不是说后面设计的,而 ...

  5. 『互联网架构』软件架构-spring源码之spring结构概述

    spring从07年接触到目前2018年也差不多10年了,一个java的框架为什么能火这么多年.很多人对spring的使用轻车熟路,但是从未解读过spring的源码,老铁跟我一起看看源码,了解下内部的 ...

  6. 『互联网架构』软件架构-深入理解Ribbon

    在国内dubbo还是使用比较多的,毕竟是阿里很早之前都开源的框架,但是dubbo的生态相对来说已经赶不上springclud了,springclud在国外应用的比较多,大家基本都是dubbo的,spr ...

  7. 『互联网架构』软件架构-git服务搭建与使用(四)

    很多跟我一样大概有十多年的同事,一直做着企业内部开发,现在还在使用svn,跟大家聊起来git,他们都知道,只是项目里用习惯了svn一直也没改变,我相信这只是时间的问题,在不久的将来必然会使用git,正 ...

  8. 系列 | 漫谈数仓第四篇NO.4 『数据应用』(BIOLAP)

    点击上方蓝色字体,置顶/星标哦 目前10000+人已关注加入我们 本文目录CONTENTS ☞ 01.可视化BI工具 [ 开源BI,商业BI,传统BI ] ☞ 02.OLAP科普 [ ROLAP  M ...

  9. 技术人的成长手册|勤思考、反内卷,史海峰关于技术人职业『高可用』的探索与实践...

    经历过谷底的低迷,也有过高潮的狂欢.也许史海峰的经历和思考,能够给那些只经历过互联网繁荣.时下正在经受所谓『互联网寒冬』的年轻工程师们一些新的职业感悟. 2022 年虽然还有 3 个月,但这已经注定是 ...

  10. 区块链系统简要架构和重点知识点梳理

    区块链几大核心: 分布式帐本,所需技术:微服务架构,高性能RPC通讯. 区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,每一个数据链表可以看作账本.它由多个区块构成了一个有 ...

最新文章

  1. 建高性能ASP.NET站点 第五章—性能调优综述(中篇)
  2. 怎么求导来着?别费劲了,试试这个Python的通用求导法
  3. IPv6 RIPng (PT)
  4. [Java基础]Lambda表达式和匿名内部类的区别
  5. Python学习week2
  6. html滚动条怎么置顶,js控制滚动条到最底端(置底)和最顶端(置顶)
  7. STMP发送邮件被当垃圾邮件处理的解决方法
  8. 【小技巧】33 个神经网络「炼丹」技巧
  9. JSP 页面实现一个计算器功能
  10. java 调用 easypr_Java程序执行Linux命令调用EasyPR程序识别车牌号
  11. 【数字逻辑】学习笔记 第三章 Part2 逻辑函数的化简
  12. 硬件工程师要学习的东西
  13. 23岁需要做到的事情
  14. 《计算机存储与外设》----2.3 DRAM
  15. 数学建模养老保险问题matlab,全国大学生数学建模竞赛C题 企业退休职工养老金制度的改革...
  16. Java由今天的日期得到前几天的日期
  17. S905L(P211)盒子刷android tv以及刷emuelec 4.4/4.5的向导/方法
  18. 安卓平板倍速_推荐:安卓上本地音频播放器,可实现5秒快进快退和倍速播放...
  19. 程序设计所遵循的一般步骤
  20. 深度学习模型处理多标签(multi_label)分类任务——keras实战

热门文章

  1. python股票回测
  2. [日推荐]『小恩故事』育儿助手!
  3. python excel表格去重_都说Excel大法好,Python大法其实也不错,批量去重处理更是神啊...
  4. 【JAVA视频压缩】-------轻量级视频压缩组件JAVE
  5. 东南大学女孩子学计算机的多吗,2019年应届南邮上岸东南大学计算机生,经验分享,希望能帮助到迷茫的你...
  6. feign.exception Connection reset executing
  7. excel之列联表分析
  8. 开源中国众包平台派活:微信小程序任务
  9. 2018-08-14 UnmarshalException: 意外的元素 (uri:, local:customer)
  10. cin.get()的用法