通过iMock学习Jvmsandbox

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的能力了

相关推荐

  1. 通过例子学习golang的Goroutine

    2024-04-29 17:04:03       52 阅读
  2. 【Git命令】通过在线demo学习

    2024-04-29 17:04:03       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 17:04:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 17:04:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 17:04:03       87 阅读
  4. Python语言-面向对象

    2024-04-29 17:04:03       96 阅读

热门阅读

  1. Yarn的安装和使用

    2024-04-29 17:04:03       34 阅读
  2. 写一个在创建css文件之后的初始化样式

    2024-04-29 17:04:03       34 阅读
  3. 各个GPT能力测试

    2024-04-29 17:04:03       26 阅读
  4. 【Android 实现AES-CMAC加密】

    2024-04-29 17:04:03       34 阅读
  5. Android 在AMS中拦截某个指定Activity的启动

    2024-04-29 17:04:03       31 阅读
  6. CMUS狮身人面像(七)-Android 上的 PocketSphinx

    2024-04-29 17:04:03       38 阅读
  7. golang变量常见问题总结

    2024-04-29 17:04:03       31 阅读
  8. go圣经 ——方法

    2024-04-29 17:04:03       38 阅读
  9. 【AI大模型】Prompt Engineering 基础知识与挑战

    2024-04-29 17:04:03       35 阅读
  10. 【Spring AI】03. 图像生成 API

    2024-04-29 17:04:03       31 阅读
  11. git版本控制基础工作流

    2024-04-29 17:04:03       31 阅读
  12. k8s的PV/PVC详解以及使用范例

    2024-04-29 17:04:03       29 阅读
  13. Android面试

    2024-04-29 17:04:03       32 阅读