JVM-SandBox-Repeater 初体验 环境搭建
环境信息
操作系统:Mac OS 、Linux(相同)
下载源码
- jvm-sandbox Github源码地址(说明中有安装方法):
https://github.com/alibaba/jvm-sandbox.git - jvm-sandbox-repeater Github源码地址:
https://github.com/alibaba/jvm-sandbox-repeater.git
JVM-SandBox 结构参考:(安装后的结构)
Linux:/home/用户名/
Mac:/Uaers/用户名/
├── logs
│ └── sandbox
│ ├── repeater
│ │ ├── repeater.log
│ ├── sandbox-mgr.log
│ ├── sandbox.log
├── .sandbox-module
│ ├── cfg
│ ├── plugins
│ ├── repeater-bootstrap.jar
│ └── repeater-module.jar
├── .sandbox.token
├── sandbox
│ ├── bin
│ ├── cfg
│ ├── example
│ ├── install-local.sh
│ ├── lib
│ ├── module
│ ├── provider
│ └── sandbox-module
JVM-SandBox-Repeater 工程结构参考:(源码)
jvm-sandbox-repeater git:(master) ✗ tree -L 2
.
├── LICENSE
├── Readme.md
├── bin
│ ├── bootstrap.sh
│ ├── health.sh
│ ├── install-local.sh # 本地的启动脚本
│ ├── install-repeater.sh
│ ├── package.sh # 本地的编译脚本 ,负责编译并把编译好的包copy到.sandbox-module下面去
│ ├── repeater-config.json # 默认的配置文件
│ ├── repeater-logback.xml #日志配置
│ └── repeater.properties # 配置文件 配置录制投递、回放地址、配置文件获取等信息
├── docs # 文档使用
│ ├── plugin-development.md
│ ├── slogan-demo.md
│ └── user-guide-cn.md
├── hessian-lite # 针对hessian 进行的修改,这个地方使用的时候可以针对自己的业务进行修改
│ ├── hessian-lite.iml
│ ├── pom.xml
│ └── src
├── pom.xml
├── repeater-aide # 这是diff 相关的东西
│ ├── pom.xml
│ └── src
├── repeater-client # 这里放了spring容器相关的操作
│ ├── pom.xml
│ └── src
├── repeater-console # 这是一个web服务,主要是用于录制数据的接收、存储,提供配置页面服务
│ ├── Readme.md
│ ├── pom.xml
│ ├── repeater-console-common # 这是console的 工具包
│ ├── repeater-console-dal # 这是JPA的Dao层
│ ├── repeater-console-service # 主要是JPA的相关操作
│ ├── repeater-console-start # 这是console的controller
├── repeater-module # 这里就比较有意思了,是加载配置信息的,属于自定义的东西
│ ├── pom.xml
│ └── src
├── repeater-plugin-api # 这是插件api,主要是一些Bean对象的定义
│ ├── pom.xml
│ └── src
├── repeater-plugin-core # 这是核心,录制、回放、Mock、序列化等相关的实现都是这里
│ ├── pom.xml
│ └── src
├── repeater-plugins # 这是官方提供的插件,但是用的时候需要自己改改
│ ├── dubbo-plugin
│ ├── hibernate-plugin
│ ├── http-plugin
│ ├── ibatis-plugin
│ ├── java-plugin
│ ├── mybatis-plugin
│ ├── redis-plugin
│ ├── repeater-plugins.iml
│ ├── socketio-plugin
│ └── spring-data-jpa-plugin
│ ├── pom.xml
└── travis.sh
源码下载下来后,可以执行源码目录下 /bin中的install-local.sh编译并把编译好的包copy到.sandbox-module下面去
1、jvm-sandbox-console 调整配置 并 启动
1、console源码调整:
console代码在idea中启动时,不会报错,但是使用jar包启动时,页面会报异常,需要做如下调整。
- 位置 repeater-console/repeater-console-start/src/main/resources/velocity
全局替换 #parse("/blocks 为 #parse("blocks
解决资源文件引用找不到报错,这个替换有多处,都替换了就可以了
- 位置 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/page/ReplayController.java
替换 return "/replay/detail"; 为 return "replay/detail";
解决跳转页面的问题
- 位置 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/test/RegressPageController.java
替换 return "/regress/index"; 为 return "regress/index";
解决跳转页面的问题
2、 数据库配置
位置:/repeater/repeater-console/repeater-console-start/src/main/resources
spring.datasource.url=jdbc:mysql://数据库IP/域名:数据库端口/数据库名?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=用户名
spring.datasource.password=密码
3、编译脚本
位置:repeater/bin/package.sh
如果你的maven没有设置环境变量,那么这里可以修改一下直接指定
# maven package the sandbox
/maven/apache-maven-3.5.3/bin/mvn clean package -Dmaven.test.skip=true -f ../pom.xml || exit_on_err 1 "package repeater failed."
4、配置文件修改
位置:repeater/bin/repeater.properties
如果你是本机器则配置成127.0.0.1或lcoalhost,如果是远程主机部署,则配置成服务IP端口
# 录制消息投递地址
broadcaster.record.url=http://127.0.0.1:8001/facade/api/record/save
# 回放结果投递地址
broadcaster.repeat.url=http://127.0.0.1:8001/facade/api/repeat/save
# 回放消息取数据地址
repeat.record.url=http://127.0.0.1:8001/facade/api/record/%s/%s
# 配置文件拉取地址
repeat.config.url=http://127.0.0.1:8001/facade/api/config/%s/%s
# 心跳上报配置
repeat.heartbeat.url=http://127.0.0.1:8001/module/report.json
# 是否开启脱机工作模式
repeat.standalone.mode=false
# 是否开启spring advice拦截
repeat.spring.advice.switch=false
5、环境变量
启动参数中的 -Dapp.name=repeater -Dapp.env=daily
对应应用名和环境,是需要启动时添加的,不然jvm-sandbox启动后找不到对应的环境信息
代码一下位置读取了这个环境变量信息
com.alibaba.jvm.sandbox.repeater.plugin.core.util.PropertyUtil
getSystemPropertyOrDefault
通过读代码我理解这个东西应该是通过在被测的jvm机器上设置环境变量来搞
6、编译启动
执行 bin/install-local.sh 编译并copy代码后
说明:
jvm-sandbox-repeater的web工程repeater-console被改名为repeater-bootstrap.jar
修改来自package.sh脚本
../repeater-console/repeater-console-start/target/repeater-console.jar ${REPEATER_TARGET_DIR}/repeater-bootstrap.jar \
正常启动:
java -jar -Dapp.name=repeater -Dapp.env=daily repeater-bootstrap.jar
调试启动:
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
访问地址:
http://127.0.0.1:8001/config/list.htm
2、下载 并 解压 jvm-sandbox
# 下载最新版本的 jvm-sandbox
wget http://ompc.oss-cn-hangzhou.aliyuncs.com/jvm-sandbox/release/sandbox-stable-bin.zip
# 解压
unzip sandbox-stable-bin.zip
启动被测 jvm 应用
调试启动被测试应用
nohup "$JAVACMD" $JAVA_OPTS \
$OPTS_MEMORY \
-classpath "$CLASSPATH" \
-Dbasedir="$BASEDIR" \
-Dfile.encoding="UTF-8" \
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9173 \
app_xxx.jar \
"$@" >${LogPath}app_xxx.log 2>&1 &
jvm-sandbox agent 启动模式
nohup "$JAVACMD" $JAVA_OPTS \
$OPTS_MEMORY \
-classpath "$CLASSPATH" \
-Dbasedir="$BASEDIR" \
-Dfile.encoding="UTF-8" \
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9173 \
-Dapp.name=RouteVrs -Dapp.env=testA -javaagent:/home/admin/sandbox/lib/sandbox-agent.jar=server.port={jvm-sandbox控制端口}\;server.ip={当前主机IP} \
app_xxx.jar \
"$@" >${LogPath}app_xxx.log 2>&1 &
在被测jvm应用启动中添加agent配置,用于和console通讯使用
-Dapp.name=RouteVrs -Dapp.env=testA -javaagent:/home/admin/sandbox/lib/sandbox-agent.jar=server.port={jvm-sandbox控制端口}\;server.ip={当前主机IP} \
jvm-sandbox attach 启动模式
# 进入沙箱执行脚本 attach方式进入被测jvm
cd sandbox/bin
# 目标JVM进程33342
./sandbox.sh -p 33342 -P 55756
挂载成功后会提示
./sandbox.sh -p 33342
NAMESPACE : default
VERSION : 1.2.0
MODE : ATTACH
SERVER_ADDR : 0.0.0.0
SERVER_PORT : 55756
UNSAFE_SUPPORT : ENABLE
SANDBOX_HOME : /Users/vlinux/opt/sandbox
SYSTEM_MODULE_LIB : /Users/vlinux/opt/sandbox/module
USER_MODULE_LIB : ~/.sandbox-module;
SYSTEM_PROVIDER_LIB : /Users/vlinux/opt/sandbox/provider
EVENT_POOL_SUPPORT : DISABLE
卸载沙箱
./sandbox.sh -p 33342 -S
jvm-sandbox[default] shutdown finished.
3、远程调试
新建远程Remote JVM Debug 填入IP及端口
对比 attach 和 agent 启动模式的优缺点
- attach 模式
优点
- 可插拔,随时加载或卸载
- 更新插件或配置时,不需要重启应用
- 调试方便,可同时远程调试repeater以及被测应用,因为可以起两个remote debug 端口
- 适合临时使用
缺点
- 部分场景回放会失败,如Java回放时无法获取实例,会出现反射实例对象失败,不能进行回放
- 不能缓存Java实例,需要被测应用加载钩子才可以使用。
- agent 模式
优点
- 回放流畅,基本 java 录制都可以回放
- 适合长期使用,随应用部署
缺点
- 更新插件,需要重启应用
- 不适合同时调试repeater以及被测应用
接下来就是 JVM-SandBox-Repeater 录制、回放、Mock