SkyWalking Java Agent 插件加载机制(下)
2024-02-24 23:04:06
插件查找
在上一篇文章中,我们了解了插件加载机制的整体流程,以及 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 会实例化找到的插件。插件实例化过程如下:
- AgentClassLoader 会使用反射创建一个插件类的实例。
- AgentClassLoader 会调用插件类的构造方法,并传入必要的参数。
- AgentClassLoader 会将插件实例添加到插件列表中。
例如,当 AgentClassLoader 实例化 http
插件时,它会使用反射创建一个 io.skywalking.apm.agent.core.plugin.interceptor.enhance.v2.httpasyncclient4.HttpClientPluginDefine
类的实例。然后,它会调用该类的构造方法,并传入必要的参数。最后,它会将 http
插件实例添加到插件列表中。
总结
本文介绍了 SkyWalking Java Agent 插件加载机制中的插件查找和实例化过程。通过对这两个步骤的深入理解,读者可以更好地理解 Agent 的工作原理。