Jvm-sandbox
- Jvm-sandbox
- 基于Jvm-sandbox的Mock平台iMock
- iMock的工程学习
- iMock怎么写的(sandbox的module应该怎么写)
Jvm-sandbox
Jvm-sandbox是阿里开源的一款java的沙箱,看网上的介绍在沙箱里你可以做你能想到的奇妙的事情。
基于Jvm-sandbox的Mock平台iMock
sandbox已经面世好久了,各个厂商之间也基于sandbox做了各自的能力,监控,测试,回放等等等等。
iMock是一个开源的Mock平台,由于基于sandbox,提供了方法级别的mock能力
iMock的工程学习
iMock分成了三部分 web,后台,插件
然后这部分学习重点学习插件部分
- 前端web页面
- 后端java的后台服务
- 基于sandbox开发的插件
主要学习sandbox的这个插件的开发思路。
由于前端的与插件距离较远,我在看的过程中是结合后端的服务 & 插件的代码一起来看来了解的
后端的结构:
我习惯从Controller层去看
后端的服务主要提供了三个Controller
一个是日志信息相关的Controller
一个是模块配置相关的Controller
一个是模块信息相关的Controller
通过内部提供的能力看、模块信息更像是与sandbox的agent交互的过程
那么在这个controller里面包含了哪些方法,这些方法又是如何对应到agent里面去的呢
下图中提供了一系列的方法包含了激活mock方法,冻结mock方法,还有安装,看起来就像是与agent相关的
然后我们看一下激活的相关的方法的具体实现
这里走到了一个执行器,这个执行器应该就是包含了具体要怎么与agent进行交互的地方
这个地方看起来在调用的过程中给定了三个参数:activeURI,params,还有一个枚举ACTIVE
activeURI包含了哪些的内容:
private static String activeURI = "http://%s:%s/sandbox/default/module/http/sandbox-module-mgr/active?ids=mock";
//这个地方怎么用的,这个路径又是对应的谁// 这个地方来源于sandbox里的sandbox.shell 的sandbox_debug_curl的命令,这个地方声明了怎么使用http对sandbox进行操作// 格式应该为http://${host}:${port}/sandbox/${TARGET_NAMESPACE}/${1}// host: jvmsandbox所在的ip,port: jvmsandbox所在的端口,ids: 模块id,这里为mock, ${1}是模块的id// 那么对应的TARGET_NAMESPACE对应的应该是:有一个目标的命名空间,这个命名空间是default,那么对应的${TARGET_NAMESPACE}就是default// 这里用的http后面的sandbox-module-mgr,是因为要使用sandbox-modul-mgr提供的模块管理功能,这部分来源于与jvm-sandbox对接的地方
这个执行器里面又包含了什么
我们看到这个执行器从数据库中根据需要mock的相关应用的信息获取到了具体的module信息
之后,使用http的方式请求了上面描述的那个URI那这个URI又是啥呢
我们去看一下sandbox都提供了哪些的http接口,又是如何提供的。
这个时候我们发现,在整个iMock提供的接口里面并没有发现这个URI,那么一定是在实现这个sandbox的Module的时候引入了一些依赖包,里面包含了这些信息
我们去找找sandbox的源码里有没有这些信息
https://github.com/alibaba/jvm-sandbox
把sandbox的源码down下来看一下里面究竟有没给暴露这些内容出去
通过官方的例子,我们与sandbox进行attach的时候都用的是sandbox.sh文件暴露的端口,我们看看这个里面有什么东西,是否能够提供一些有效的思路。
果然在里面发现了一个方法名:sandbox_curl 而这个方法又引用了另一个方法:sandbox_debug_curl
而这个里面有个方法真的和我们拼出来的那个链接长得好像
curl -N -s "http://${host}:${port}/sandbox/${TARGET_NAMESPACE}/${1}" ||exit_on_err 1 "target JVM ${TARGET_JVM_PID} lose response."
那我们就来比对一把看看究竟是不是一样的,这些参数携带过来的能否一一的对应上呢
这个时候我们发现了一个 【TARGET_NAMESPACE】这个是个什么东西
我们在sandbox.sh文件中找到了这部分的描述
这里有个TARGET_NAMESPACE, 还有个DEFAULT_NAMESPACE这俩都是啥
我们继续找看到了sandbox.sh里面有这部分描述
看字面意思:如果我们在请求的时候携带了ARG_NAMESPACE这个参数那么使用ARG_NAMESPACE参数,如果没有携带,那么使用的就是DEFAULT_NAMESPACE,然后这个namespace默认又是default,所以我们在看一下请求的时候的链接,传过来的就是default,那么这个就是一个default了,也就是不论你有什么空间,iMock用的就是默认的空间。
然后呢后面参数我们能对应上吗
其实我们看一下sandbox_curl方法,这个是否能够对上勒
function sandbox_curl() {sandbox_debug_curl "module/http/${1}?1=1${2}"
}
这里在调用sandbox_debug_curl的时候,增加了module/http相关的内容,但是还缺少一部分我们没有找到:sandbox-module-mgr/active?ids=mock 他在sandbox里面
如果是active我们找到active命令的地方,这里找到了sandbox-module-mgr这个地方
定位到这里,这里是sandbox的模块管理的地方,那也就对了,是否激活mock的能力确实应该在这里
这里与sandbox的链路就被梳理清楚了。但是具体的写法呢
iMock怎么写的(sandbox的module应该怎么写)
看看sandbox的官方教程怎么写的:
模块的生命周期:链接: link
模块的编写方式:链接: link
对应到iMock的里面就是MockModule,实现了Module和Module LifeCycle的接口来控制Module的具体动作和生命周期
initialize则是初始化Mock信息的地方,在这里可以完成具体的Mock工作,因为这些信息都被保存在了数据库中,把这些信息读出来找到就可以实现这部分的能力了,具体就要看怎么设计这个Mock的能力了