JVM-sandbox源码分析

JVM沙箱容器,一种JVM的非侵入式运行期AOP解决方案
Real - time non-invasive AOP framework container based on JVM

源代码地址:https://github.com/alibaba/jvm-sandbox.git

使用文档: https://github.com/alibaba/jvm-sandbox/wiki

官方有使用文档,可以先看官方的,下面的文档只是简要说明和注意事项。

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)方法

发表评论 / Comment

用心评论~