为了账号安全,请及时绑定邮箱和手机立即绑定

『互联网架构』调⽤链系统工程结构

标签:
Java

上次说了这个源码的调用链设计的是如何如何好,现在开始说说他的工程机构,也一起本地的运行下调用链系统。

(一)⼯程结构

目前4个包

  1. angent.bootstrap 这个是部署在客户端的。这里面的内容其实很少,添加更新和登录的逻辑。
  2. 真正的逻辑是下面画虚线的地方。
  3. agent.base 是用来校验的,整个插件的核心。
  4. 下面是对应的插件2个项目,对应的采集功能。
  5. agent-collects 是采集器里面目前包括:jms,dubbo,jdbc,http等
  6. agent-collects-servlet 是采集器只采集servlet。
  7. 为什么不写在一起,因为agent-collects是在应用的classpath目录下的。
    agent-collects-servlet是在tomcat下的lib下的。所以需要分开。

想了解结构,然后运行起来在通过debug的方式一起看源码。因为代码不是一行两行,直接看源码很容易晕的。

总体的设计思路总结:

  1. ⽅便扩展的插件机制
  2. 提⾼体验的中⼼化配置
  3. 可运维的⾃动化更新

(二)插桩机制设计

  • 为什么要进行插桩

发现要进行埋点的时候,必须指定的方法插桩到指定的系统中才可以完成监控。

  • 插桩机制设计要点:
    1.插桩前环境准备

通过自动更新机制,已经下载了指定的lib文件,其实就是指定jar包。在实际项目中保存在temp目录下。

这个agent-bootstrap完成准备工作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aXD5s5Ag-1655086445563)(https://upload-images.jianshu.io/upload_images/11223715-4905cad49525f216.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

  • 启动流程

用到了Java agent,解释下java-agent。

在 JDK 1.5 中,Java 引入了 java.lang.Instrument 包,该包提供了一些工具帮助开发人员在 Java 程序运行时,动态修改系统中的 Class 类型。其中,使用该软件包的一个关键组件就是 Java agent。从名字上看,似乎是个 Java代理之类的,而实际上,他的功能更像是一个Class 类型的转换器,他可以在运行时接受重新外部请求,对Class 类型进行修改。
参数 javaagent 可以用于指定一个 jar 包,并且对该 java 包有2个要求:
这个 jar 包的MANIFEST.MF 文件必须指定 Premain-Class 项。
Premain-Class 指定的那个类必须实现 premain()方法。
重点就在 premain 方法,也就是我们今天的标题。从字面上理解,就是运行在 main 函数之前的的类。当Java 虚拟机启动时,在执行 main 函数之前,JVM 会先运行 -javaagent 所指定 jar 包内 Premain-Class 这个类的 premain 方法,其中,该方法可以签名如下:
public static void premain(String agentArgs, Instrumentation inst)
public static void premain(String agentArgs)

  • 源码分析(一)agent-bootstrap的分析
    1.1.pom指定maven打包后的jar【Premain-Class】,这是java-agent的规范。

2.1.添加META-INF中添加MANIFEST.MF,这是java-agent的规范。

3.1.分析主类的流程AgentBootMain

premain 入口

2.埋点过程

(三)埋点与采集机制

调⽤链其实就把系统间的调⽤关系整合成⼀个链条,那怎么捕获这些调⽤信
息呢?就是在⽅法的关键调⽤节点进⾏埋点捕获调⽤信息(参数、⽤时、结果、异常等)。就是埋点,即把监控逻辑动态的埋在业务⽅法⾥,并监控该⽅法的执⾏情况。

  • 开关跟踪会话

通常是在系统的⼊⼝处,开启会话,在等结束调⽤后关闭会话,类似JDBC事物。那么⼀个系统⼊⼝处理有哪些呢?

  • 开关监控事件

在监控会话期内发⽣的事件进⾏埋点捕捉。

  • 对象说明
  1. Context :开启关闭监控会话和存储配置信息。
  2. Session:存储监控会话信息(traceId、parentId、当前rpcID)
  3. Event:存储事件即单次调⽤信息
  4. request:上游调⽤节点信息(parentId,属性)

PS:建议跟踪下代码。好好的了解下代码的逻辑。特别是AgentBootMain,
下次会把这个项目搭建的截图。可以按照我的截图完成本地的搭建。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消