返回

SkyWalking Java Agent 插件加载机制(下)

后端

插件查找

在上一篇文章中,我们了解了插件加载机制的整体流程,以及 AgentClassLoader 的作用。在本文中,我们将深入研究插件查找和实例化这两个关键步骤。

目录结构

SkyWalking Java Agent 的插件位于 agent/core/src/main/resources/META-INF/services 目录下,每个插件对应一个文件,文件名即插件接口的类名,文件内容为插件类的全限定名。

例如,http 插件的目录结构如下:

agent/core/src/main/resources/META-INF/services/io.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.ClassEnhancePluginDefine

其中,io.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.ClassEnhancePluginDefine 为插件接口的类名,http 插件的文件名为:

io.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.httpasynclient4.HttpClientPlugin

该文件的内容为:

io.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.httpasyncclient4.HttpClientPluginDefine

这意味着 http 插件的类名为 io.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.httpasyncclient4.HttpClientPluginDefine

插件查找算法

AgentClassLoader 在加载插件时,会遍历 META-INF/services 目录下的所有文件,并读取文件内容。如果文件内容与插件接口的类名匹配,则认为该文件对应的插件需要被加载。

例如,当 AgentClassLoader 加载 http 插件时,它会遍历 META-INF/services 目录下的所有文件,并读取文件内容。当它遇到 io.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.ClassEnhancePluginDefine 文件时,它会发现文件内容与插件接口的类名匹配,因此认为 http 插件需要被加载。

插件实例化

在插件查找之后,AgentClassLoader 会实例化找到的插件。插件实例化过程如下:

  1. AgentClassLoader 会使用反射创建一个插件类的实例。
  2. AgentClassLoader 会调用插件类的构造方法,并传入必要的参数。
  3. AgentClassLoader 会将插件实例添加到插件列表中。

例如,当 AgentClassLoader 实例化 http 插件时,它会使用反射创建一个 io.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.httpasyncclient4.HttpClientPluginDefine 类的实例。然后,它会调用该类的构造方法,并传入必要的参数。最后,它会将 http 插件实例添加到插件列表中。

总结

本文介绍了 SkyWalking Java Agent 插件加载机制中的插件查找和实例化过程。通过对这两个步骤的深入理解,读者可以更好地理解 Agent 的工作原理。