JVM沙箱容器,一种JVM的非侵入式运行期AOP解决方案
Real - time non-invasive AOP framework container based on JVM
官方有使用文档,可以先看官方的,下面的文档只是简要说明和注意事项。
1 安装步骤
1.1 安装
参考 :https://github.com/alibaba/jvm-sandbox/wiki/QUICK-START
或者解压压缩包,按以下目录规则放置就可以。
./sandbox/ +--bin/ | +--sandbox.sh | +--cfg/ | +--sandbox-logback.xml | +--sandbox.properties | `--version | +--lib/ | +--sandbox-agent.jar | +--sandbox-core.jar | `--sandbox-spy.jar | +--provider/ | `--sandbox-mgr-provider.jar | +--module/ | `--sandbox-mgr-module.jar +--sandbox-module/ `--**-module.jar |
基于sandbox开发的模块放置在${SANDBOX_HOME}/sandbox-module/ 或者 ${user.home}/.sandbox-module/下
日志查看路径: ${user.home}/logs/sandbox/
2.2 修改配置cfg/sandbox.properties
参考 :https://github.com/alibaba/jvm-sandbox/wiki/CONFIG
配置server.ip 和 server.port, sandbox对外提供http接口来进行操作控制,不配置的话端口随机,测试比较麻烦。。
2 项目使用
参考:https://github.com/alibaba/jvm-sandbox/wiki/INSTALL
sandbox支持attach和javaagent两种启动模式。
其中sandbox.sh脚本是attach的使用方式,通过不同命令参数调用sandbox不同的http接口,从而达到控制的目的。
3 相关接口介绍
3.1 version 查看环境信息
http://${server.ip}:${server.port}/sandbox/${namespace:default}/module/http/sandbox-info/version
3.2 list 查看加载的模块
http://${server.ip}:${server.port}/sandbox/${namespace:default}/module/http/sandbox-module-mgr/list
3.3 其他
http://${server.ip}:${server.port}/sa
ndbox/${namespace:default}/module/http/${@Information#id}/${@Command#value}
4 ClassLoader机制
4.1. Module加载逻辑
sandbox: ModuleJarLoader#loadingModules(...)
→ sandbox: DefaultCoreModuleManager$InnerModuleLoadCallback#onLoad(...)
→ sandbox: DefaultCoreModuleManager#load(...)
→ sandbox: DefaultCoreModuleManager#callAndFireModuleLifeCycle(CoreModule, ModuleLifeCycleType)
→ repeater: RepeaterModule#loadCompleted()
→ repeater: RepeaterModule#initialize(RepeaterConfig)
→ repeater: InvokePlugin#watch(...)
→ repeater: AbstractInvokePluginAdapter#watchIfNecessary()
→ sandbox: IbuildingForBehavior#onWatch(...)
→ sandbox: EventWatcher#build(EventListener, Progress, Event.Type[])
→ sandbox: ModuleEventWather#watch(EventWatchCondition, EventListener, Progress, Event.Type[])
→ sandbox:DefaultModuleEventWathcher#watch(..)
→ sandbox: EventListenerHandler.getSingleton().active(listenerId, EventListener, Event.Type[])
→ sandbox: 放入Spy相关的map中
4.2. 关键数据
1个EnhanceModel 对应 1个EventListener, 对应一个listenerId
Spy.class : Map<namespace, SpyHandler>
SpyHandler(EventSpyHandler): Map<ListenerId, EventProcessor>
4.3. 代码执行
Spy#spyMethodOnBefore( Object[] argumentArray,
String namespace,
int listenerId,
int targetClassLoaderObjectID,
String javaClassName,
String javaMethodName,
String javaMethodDesc,
Object target)
通过listenerId, 获取到EventListener, 执行onEvent(Event event)方法
版权声明:《 JVM-sandbox源码分析 》为Saber原创文章,转载请注明出处!
最后编辑:2022-7-29 09:07:42