开源测试工具 [jvm-sandbox-repeater 学习笔记][原理说明篇] 3 源码导读

ELes for PPmoney · November 06, 2019 · 360 hits

好了,了解完了录制和回放两个流程,可能会发现出现了好多陌生的类名、陌生的实体名称,由于对这些类和实体都不是非常了解,这个不了解甚至导致你看录制和回放过程的解析时无法读懂某个步骤而想不明白。

那么接下来,来看看源码吧!先停一停,大致的流程都知道了,那就补充一些细节的信息让自己对整个流程更加了解吧。

该系列笔记前序章节导航:
入门使用篇
原理说明篇-录制流程
原理说明篇-回放流程

3.1 模块介绍

可以看看这篇文档: 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

使用说明文档。

3.2 核心类导读

核心的类基本上都在repeater-plugins-api、repeater-plugins-core包中。由于源码结构清晰,可读性强,笔记前序章节已对录制和回放的流程作说明,所以这里仅对核心代码做个简单说明去哪里看,不做详细解析。

3.2.1 实体模型类

录制回放过程中涉及实体对象主要集中在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

代码中基本每一个实体类都有类的作用以及字段含义的注释。通过阅读这个包中的代码即可理解实体类的模型。

通过理解实体类的含义,能够帮助我们理解在各个流程中的操作目的、操作结果以及操作的关注点。

3.2.2 录制回放过程实现相关类

与录制回放过程相关的类主要有

类名/包名 相关流程
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 回放事件总线以及订阅处理入口

3.2.3 插件挂载流程相关类

与插件挂载流程相关的类主要有

类名/包名 流程说明
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解析并转换成观察事件。

3.2.3 接口类

即使每个类都细细读完了,还是有部分类和方法的含义不是很理解?可以通过阅读那些类所实现的接口类来帮助理解。

接口类主要在repeater-plugins-api模块的com.alibaba.jvm.sandbox.repeater.plugin.spicom.alibaba.jvm.sandbox.repeater.plugin.api包。

在这两个接口包中的所有接口类都带有非常详细的类说明和方法说明,读完可以很好地理解整个框架的设计。

包括一些在录制回放中非常规的干涉步骤,在流程的接口类中都提供了对应的方法接口。可以说是非常棒了。

3.2.4 其他核心类

一些在录制回放流程中比较主要的工具类。

类名/包名 说明
com.alibaba.jvm.sandbox.repeater.plugin.core.bridge.ClassloaderBridge 类加载桥接器,可以通过类名和类加载器找到已加载的实例,在java回放以及各种场景都非常有用
com.alibaba.jvm.sandbox.repeater.plugin.core.wrapper.SerializerWrapper 序列化工具
No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up