概念介绍:
通过记录线上请求信息内容,在开发或者测试环境进行内容回放,来发现系统是否能够正常运行。降低代码变动整体系统带来的风险。也可用于压测,先对录制的流量进行存储,然后对流量进行编辑、过滤后通过压测引擎向被测服务发压。
背景:
最近组内探讨搭建自己的流量录制项目,期望以此为基础搭建成一个平台级项目,扩展出压测,链路分析,诊断等功能。于是进行了一番调研探索,在此总结一下。抛砖引玉如有建议或不对的地方欢迎交流指正。
框架分析:
基于现状不可能从新开发研究技术底座,搜索参考了各个论坛的经验,了解了下几个开源框架的技术文档,基于项目的技术现状,决定选用JVM-SANDBOX。对比如下:
框架 | 语言 | 优点 | 缺点 |
---|---|---|---|
GoReplay | Go |
1
.
单体持续,依赖少,无需配置,环境准备简单,
工具很轻量,易使用
2.
资源消耗少,且不侵入目标应用的
JVM
运行时环境,影响小
3.
提供了插件机制,且插件实现不限制语言,方便拓展
| 1.应用不够广泛,无大公司背书,成熟度不够 2. 问题比较多,对使用者的要求较高,出问题情况下要能自己读源码解决,官方响应速度一般 4. 只支持 HTTP 协议,拓展较麻烦 5. 只支持命令行启动,没有内置服务,不好进行集成 |
jvm-sandbox- repeater | Java | 1.通过字节码增强的方式对 Java 类方法进行录制,对业务代码透明无侵入 2. 功能比较丰富,较为符合需求,开源插件比较多基本满足使用 | 1.会对应用运行时环境有一定侵入,如果发生问题,对应用可能会造成影响 2. 社区活跃度较低,需要搭配其他的辅助系统,整合成本不低 |
ngx_http_mirror _module | C | 1. nginx 出品,成熟度可以保证 2. 配置比较简单 | 1. 不方便启停,也不支持过滤 2. 必须和 nginx 搭配只用,因此使用范围也比较受限 |
Jvm-Sandbox-Repeater
首先理解一个概念jvm-sandbox-repeater是基于jvm-sandbox框架技术扩展开发的一个实现了录制和回放功能的模块。官网中没有详细说明这个关系所以新同学很容易混淆。一个完整的录制回放的框架目录如下图(通过这个图片可以比较清晰的理解):
![](https://img-blog.csdnimg.cn/f9389db18e0d474bb97680f4761e246f.png)
jvm-sandbox-repeater源码地址:GitHub - alibaba/jvm-sandbox-repeater: A Java server-side recording and playback solution based on JVM-Sandbox
官方操作指引中的部署是针对mac或者linux系统的,如果是windows系统请参照下面的说明
windows系统部署:
打开./bootstrap.sh脚本看下,里面最关键的两步
# 如果repeater-bootstrap.jar不存在,执行这个脚本./install-local.sh
if [ ! -f "${HOME}/.sandbox-module/repeater-bootstrap.jar" ]; then
echo "repeater-bootstrap.jar not found, try to install";
sh ./install-local.sh || exit_on_err 1 "install repeater failed"
fi
# 启动sanbox
${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
打开./install -locall.sh,主要功能如下:
# 执行mvn package 打包
sh ./package.sh || exit_on_err 1 "install failed cause package failed"
# 下载jvm-sandbox文件压缩包,并解压
curl -s https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/sandbox-1.3.3-bin.tar | tar xz -C ${HOME} || exit_on_err 1 "extract sandbox failed"
# 将mvn打包出来的target,复制到sandbox/sandbox-module下面
mkdir -p ${HOME}/.sandbox-module || exit_on_err 1 "permission denied, can not mkdir ~/.sandbox-module"
cp -r ${REPEATER_TARGET_DIR}/* ${HOME}/.sandbox-module || exit_on_err 1 "permission denied, can not copy module to ~/.sandbox-module"
补充说明:install-repeater.sh是直接下载官方的jar包,组装执行成可执行文件,本地的代码改动不会生效如下图:
main(){
echo "====== begin to install sandbox and repeater module ======";
echo "====== step 0 begin to download sandbox package ======";
# 下载jvm-sanbox 版本文件,并解压
curl -s https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/sandbox-1.3.3-bin.tar | tar xz -C ${HOME} || exit_on_err 1 "extract sandbox failed"
echo "====== step 1 begin to download repeater module package ======";
if [ ! -d ${MODULE_HOME} ]; then
mkdir -p ${MODULE_HOME} || exit_on_err 1 "permission denied mkdir ${MODULE_HOME}"
fi
# 下载已有的jvm-sanbox-repeater压缩文件,并解压到jvm-sandbox的sandbox-module文件夹下
curl -s https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/repeater-stable-bin.tar | tar xz -C ${MODULE_HOME} || exit_on_err 1 "extract repeater failed"
echo "====== install finished ======";
}
经过上面的分析可以看出windows系统中,我们只需要在改完源码之后,手动打包,移动文件来组装即可。至此sanbox的最终文件已经构建完成。
JVM-SANDBOX-REPEATER深入
Sandbox-jvm-repeater中提供了一个子模块repeater-console,这是一个非常简单的控制台样例工程,可以在此基础上进行扩展开发。流量录制回放的架构可以分成两部分:跟随应用部署的repeater-service也就是我们上面构造的sandbox文件,控制台repeater-console。Repeater-service负责实际的录制和回放工作,repeater-console作为控制台负责前端展示和数据库交互等调度工作。
注意:windows系统用sandbox.sh启动会失败,如果没有多余的linux服务器建议通过本地启动docker来部署repeater-service+应用,本地docker方式部署console下发service的通知会有问题,我是通过postman来绕过。
Repeater-service有两种方式注入到被检测应用,agent和attach:
Agent方式:java-javaagent:sandbox/lib/sandbox-agent.jar=server.port=${repeater启动端口} -Dapp.name=${录制应用名} -Dapp.env=${录制环境} -jar application.jar
Attch方式:启动命令 ~/sandbox/bin/sandbox.sh -p ${被录制应用进程号} -P ${repeater启动端口}
关闭命令 ~/sandbox/bin/sandbox.sh -S ${被录制应用进程号}
录制的详细源码流程可以参考:[jvm-sandbox-repeater 学习笔记][原理说明篇] 1 录制流程 · TesterHome
回放的详细源码流程可以参考:[jvm-sandbox-repeater 学习笔记][原理说明篇] 2 回放流程 · TesterHome
repeater-console使用idea就可以在本地启动访问,界面包含三个模块如下图:
在线流量:当repeater-service开启侦测后,会按照配置管理中的录取规则,进行流量录制并回传到console中,用户可以进行单条回放或者批量回放,并查看回放结果。
配置管理:配置流量录制的具体规则,通知到所有的应用实例,规则的详细解释参阅RepeaterConfig.java 。
在线模块:可以理解成被侦测的应用实例地址,这里可以手动添加或者冻结。
实施方案
repeater-console目前只是一个非常简单的样例工程,并且没有在维护了,实际应用中需要考虑解决以下几个问题,欢迎补充:
- 录制数据存储改造,console中将所有数据存放到mysql的四张表中,大型的业务系统产生的数据是巨大的,所以需要将录制数据和回放信息存储到es中。
- 配置信息改造,repeater-service启动时会将所在的IP+port通知到控制台存储,控制台新增修改配置规则推送会通过循环机器列表的方式通知到所有的实例。实际项目中我们的应用实例ip地址会发生变动,所以应该用应用名+环境来标识。目前思路通过Apollo或者nacos做配置中心实时监听。
- 回访结果降噪处理,需要集成其他服务。
- 性能优化sandbox启动对应用的性能会造成一定影响,这个需要通过压测和实际应用不断优化。