好了,了解完了录制和回放两个流程,可能会发现出现了好多陌生的类名、陌生的实体名称,由于对这些类和实体都不是非常了解,这个不了解甚至导致你看录制和回放过程的解析时无法读懂某个步骤而想不明白。
那么接下来,来看看源码吧!先停一停,大致的流程都知道了,那就补充一些细节的信息让自己对整个流程更加了解吧。
该系列笔记前序章节导航:
入门使用篇
原理说明篇 - 录制流程
原理说明篇 - 回放流程
可以看看这篇文档: jvm-sandbox-repeater 源码阅读笔记 -- 起始篇。
以下内容为摘抄。
模块结构
elesgongdeMac-mini:jvm-sandbox-repeater gongying$ tree -L 1 . ├── LICENSE ├── Readme.md ├── bin ├── docs ├── hessian-lite ├── pom.xml ├── repeater-client ├── repeater-console ├── repeater-module ├── repeater-plugin-api ├── repeater-plugin-core ├── repeater-plugins └── travis.sh
核心模块
repeater-module
repeater 模块,负责的是模块对外的交互、插件装配以及一些 spring 的类信息捕捉。
repeater-plugin-api
repeater 插件 api 库,主要定义了一些实体类、api、spi 和 exception,这里的每个类以及方法都有详细注释说明用途,是一个非常重要的阅读源码入口
repeater-plugin-core
repeater 插件 core 库,实现了 api 中的接口逻辑,是 repeater 中最核心模块,从这里可以了解到 api 中不同用途的接口是怎么样实现的,并且可以从这里了解整个录制回放过程的实现链路。
repeater-plugins
repeater 的插件库,以 repeater-plugin-core 为基础,针对不同类型的协议、不同类型的中间件进行拓展形成插件。每一个插件都是一个模块,而且实现代码非常少。官方有提供插件开发解析(传送门),从这篇解析我不得不感叹这个 repeater 插件 api 库的设计真是太棒了!少量的代码就能实现有效的拓展。
辅助模块
repeater-console
repeater 服务端模式下的服务端应用,提供内存模式下的保存录制记录、回放记录的方法。
另外也包含了官方文档示例中使用的应用接口。repeater-client
从 java 回放器的备注信息上来看,是在一个为了支持在 attach 模式下也能获取到 spring 内部 bean 的模块,需要引入应用代码中使用。
hessian-lite
序列化工具库,repeater 主要使用的序列化类型是 hessian 序列化,录制结果保存与读取、回放结果保存与读取都使用到了这个工具库。
bin
脚本库,包含打包脚本、健康检查脚本以及一些 standlone 模式下的配置文件等。
本地开发可以直接使用install-local.sh
完成打包 + 本地部署。
从bootstrap.sh
中可以看到如何启用调试模式,如果以 agent 模式启动,建议将 suspend=n 改为 suspend=y 即可${JAVA_HOME}/bin/java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 \ -javaagent:${HOME}/sandbox/lib/sandbox-agent.jar=server.port=8820\;server.ip=0.0.0.0 \ -Dapp.name=repeater \ -Dapp.env=daily \ -jar ${HOME}/.sandbox-module/repeater-bootstrap.jar
docs
使用说明文档。
核心的类基本上都在 repeater-plugins-api、repeater-plugins-core 包中。由于源码结构清晰,可读性强,笔记前序章节已对录制和回放的流程作说明,所以这里仅对核心代码做个简单说明去哪里看,不做详细解析。
录制回放过程中涉及实体对象主要集中在 repeater-plugins-api 模块的com.alibaba.jvm.sandbox.repeater.plugin.domain
包中。比如前文提到的 mock 选择结果(SelectResult)、mock 调用(MockInvocation)、调用信息(Invocation)等。
其他的实体类还有:repeater-plugins-core 模块的com.alibaba.jvm.sandbox.repeater.plugin.core.model
包、repeater-console-dal 模块的com.alibaba.repeater.console.dal.model
包、还有一个比较特殊的包装类com.alibaba.jvm.sandbox.repeater.plugin.core.wrapper.RecordWrapper
。
代码中基本每一个实体类都有类的作用以及字段含义的注释。通过阅读这个包中的代码即可理解实体类的模型。
通过理解实体类的含义,能够帮助我们理解在各个流程中的操作目的、操作结果以及操作的关注点。
与录制回放过程相关的类主要有
类名/包名 | 相关流程 |
---|---|
com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultEventListener | 调用事件处理入口,事件过滤、事件处理的主流程,根据不同的事件以及录制和回放的情况进行不同的处理。 |
com.alibaba.jvm.sandbox.repeater.plugin.core.impl.AbstractInvocationProcessor | 调用处理器,主要实现将调用事件中的信息转换成 Invocation 对象的转换处理、回放流程中的 mock 执行以及 mock 结果处理。 |
com.alibaba.jvm.sandbox.repeater.plugin.core.impl.AbstractRepeater | 抽象回放器实现,执行回放流程 |
com.alibaba.jvm.sandbox.repeater.plugin.core.impl.AbstractMockStrategy | 执行 mock 的流程,如何跟踪回放流量以及保存回放的 mock 结果 |
com.alibaba.jvm.sandbox.repeater.plugin.core.impl.spi.ParameterMatchMockStrategy | 默认使用的 mock 子调用匹配策略 |
com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultBroadcaster | 默认消息广播器,主要实现与 repeater-console 进行交互的逻辑,包块保存录制记录、回放结果、获取录制记录等 |
com.alibaba.jvm.sandbox.repeater.plugin.core.cache.RecordCache | 录制缓存,录制过程中如何记录各个调用之间的关系 |
com.alibaba.jvm.sandbox.repeater.plugin.core.cache.RepeatCache | 回放缓存,回放过程中如何保存回放的 mock 调用 |
com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultFlowDispatcher | 回放流量分流器,初始化回放上下文、选择回放器执行回放。 |
com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultInvocationListener | 调用处理完成后进行序列化,判断需要上传到 repeater-console 还是存放为子调用 |
repeater-plugins 各个插件中的所有类 | 不同的插件如何实现录制、mock、回放 |
com.alibaba.jvm.sandbox.repeater.plugin.core.trace | 实现线程跟踪的相关类 |
com.alibaba.jvm.sandbox.repeater.plugin.core.spring | 获取 spring 应用中的 bean 到内部容器,java 回放器会用到 |
com.alibaba.jvm.sandbox.repeater.plugin.core.eventbus、com.alibaba.jvm.sandbox.repeater.plugin.core.impl.spi.RepeatSubscribeSupporter | 回放事件总线以及订阅处理入口 |
与插件挂载流程相关的类主要有
类名/包名 | 流程说明 |
---|---|
com.alibaba.jvm.sandbox.repeater.module.RepeaterModule | repeater 模块的初始化,插件挂载、插件初始化流程。提供回放接口、更新配置接口入口 |
com.alibaba.jvm.sandbox.repeater.module.impl.JarFileLifeCycleManager | 服务/插件挂载的方法,在这里可以通过服务注解 |
com.alibaba.jvm.sandbox.repeater.module.util.SPILoader | 调用这个方法可以通过@MetaInfServices 注解将插件中 SPI 接口的实现类加载 |
com.alibaba.jvm.sandbox.repeater.plugin.core.impl.AbstractInvokePluginAdapter | RepeaterConfig 解析并转换成观察事件。 |
即使每个类都细细读完了,还是有部分类和方法的含义不是很理解?可以通过阅读那些类所实现的接口类来帮助理解。
接口类主要在 repeater-plugins-api 模块的com.alibaba.jvm.sandbox.repeater.plugin.spi
和com.alibaba.jvm.sandbox.repeater.plugin.api
包。
在这两个接口包中的所有接口类都带有非常详细的类说明和方法说明,读完可以很好地理解整个框架的设计。
包括一些在录制回放中非常规的干涉步骤,在流程的接口类中都提供了对应的方法接口。可以说是非常棒了。
一些在录制回放流程中比较主要的工具类。
类名/包名 | 说明 |
---|---|
com.alibaba.jvm.sandbox.repeater.plugin.core.bridge.ClassloaderBridge | 类加载桥接器,可以通过类名和类加载器找到已加载的实例,在 java 回放以及各种场景都非常有用 |
com.alibaba.jvm.sandbox.repeater.plugin.core.wrapper.SerializerWrapper | 序列化工具 |