40

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

 4 years ago
source link: https://www.tuicool.com/articles/jUBFra
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

源码:https://github.com/limingios/netFuture/tree/master/源码/『互联网架构』调⽤链系统架构设计(109)/

MZfii2v.png!web

(一)⼯程结构

目前4个包

MZfii2v.png!web

  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完成准备工作

IfaM32a.png!web

  • 启动流程

    > 用到了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的规范。

    FZ3UR3U.png!web

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

FVJrMvy.png!web

3.1.分析主类的流程AgentBootMain

premain 入口

yMrIvay.png!web

2.埋点过程

ZrAZN3q.png!web

(一)埋点与采集机制

调⽤链其实就把系统间的调⽤关系整合成⼀个链条,那怎么捕获这些调⽤信

息呢?就是在⽅法的关键调⽤节点进⾏埋点捕获调⽤信息(参数、⽤时、结果、异常等)。就是埋点,即把监控逻辑动态的埋在业务⽅法⾥,并监控该⽅法的执⾏情况。

I7bmYfi.png!web

  • 开关跟踪会话

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

vmYb6rU.png!web

  • 开关监控事件

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

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

NNZNZfN.png!web

PS:建议跟踪下代码。好好的了解下代码的逻辑。特别是AgentBootMain,

下次会把这个项目搭建的截图。可以按照我的截图完成本地的搭建。

>>原创文章,欢迎转载。转载请注明:转载自,谢谢!>>原文链接地址:上一篇:

已是最新文章


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK