Github地址:https://github.com/alibaba/jvm-sandbox-repeater.git
源码下载下来后,可以通过源码目录下 /bin中的install-local.sh来生成repeater文件。
建议通过cmd命令执行,双击shell脚本执行,看不到报错信息。
执行完成后,会在用户根目录生成两个文件夹/sandbox
,/.sandbox-module
,sandbox中放的是启动脚本和sandbox的默认jar包,repeater生成的jar包和配置文件都放在/.sandbox-module目录下。
提示:在windows环境下执行shell脚本,可以使用git提供的sh.exe程序。使用步骤入下:
1,将git安装目录下的bin目录配置到环境变量中
2,使用 sh filename.sh 格式执行shell脚本
console代码在idea中启动时,不会报错,但是使用jar包启动时,页面会报异常,需要做如下调整。
1,把 repeater-console/repeater-console-start/src/main/resources/velocity
下面的所有文件,查找 #parse("/blocks
,统一改替换为 #parse("blocks
。原有代码最前面带上 /
会导致引用找不到报错
2,修改 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/page/ReplayController.java
中的 return "/replay/detail";
,改为 return "replay/detail";
,去掉双引号里面第一个 /
3,修改 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/test/RegressPageController.java
中的 return "/regress/index";
,改为 return "regress/index";
,去掉双引号里面第一个 /
获取路径的函数,在window下执行会有差异,需做适当调整。如果是在Linux上部署,则无需修改:
1,修改~/sandbox/bin/sandbox.sh
文件的中关于sandbox根目录的声明,直接指定,而不使用自动获取,获取到的路径在windows下不适用
# 修改为实际路径
typeset SANDBOX_HOME_DIR="C:\Users\raoyu\sandbox"
# [[ -z ${SANDBOX_HOME_DIR} ]] \
# && SANDBOX_HOME_DIR=$(cd `dirname $0`; pwd)/..
2,检查java安装路径
检查环境变量JAVA_HOME
是否配置,如果配置,检查目录中是否带空格。如果安装目录在默认的program file
目录下,中间带空格,会导致脚本执行失败,将Java更换路径,另外,目录中也不要带中文。
数据库初始化的ddl脚本在repeater-console
下的repeater-console-dal
模块的resources
目录下。
启动类在repeater-console
下的repeater-console-start
模块中。
修改该模块下的application.properties
文件中的数据库配置信息。
# 本地mysql数据源测试
spring.datasource.url=jdbc:mysql://172.16.17.12:3306/repeater?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=ztesoft123
分两种方式
1,直接idea启动
指定启动类后,直接启动,不多说。
2,使用jar包启动
idea中使用maven命令clean,然后install打包。打包出来的jar包在repeater-console-start
模块下。
注意:pom文件已经配置好,无需修改pom文件。install打包后,直接使用start模块下的jar包就可以启动console服务。
如果部署到远程服务端,可使用打包好的jar包,在主机上构建成镜像,然后运行docker容器启动。
操作顺序如下:
1,启动目标应用,此处以dct为例。
2,使用命令获取到dct的PID
windows
netstat -ano | findstr 8081
8081为dct服务启动端口,返回结果的最后一列即为dct的PID。
Linux
ps -aux | grep dct
使用该命令获取dct的进程id
3,修改console地址
打开~/.sandbox-module/cfg/repeater.properties
文件,修改请求地址为console环境地址,如果是本机,则配置成127.0.0.1或lcoalhost,如果是远程主机部署,则配置成服务IP端口。
# 录制消息投递地址
broadcaster.record.url=http://172.16.18.105:8001/facade/api/record/save
# 回放结果投递地址
broadcaster.repeat.url=http://172.16.18.105:8001/facade/api/repeat/save
# 回放消息取数据地址
repeat.record.url=http://172.16.18.105:8001/facade/api/record/%s/%s
# 配置文件拉取地址
repeat.config.url=http://172.16.18.105:8001/facade/api/config/%s/%s
# 心跳上报配置
repeat.heartbeat.url=http://172.16.18.105:8001/module/report.json
# 是否开启脱机工作模式
repeat.standalone.mode=false
# 是否开启spring advice拦截
repeat.spring.advice.switch=false;
3,cd到~/sandbox/bin/
目录下,使用如下命令启动埋点。
windows
sh ./sandbox.sh -p 13176 -P 12580
-p:目标应用PID,即dct的PID
-P:探针启动端口,指定为12580
Linux
./sandbox.sh -p 13176 -P 12580
参数含义和windows一致
1,使用host网络模式,可以打通容器网络,但生产环境不建议使用这种方式。
如果需要mock功能,则需要修改配置,下面以mock整个数据库服务为例。
修改配置内容,javaSubInvokeBehaviors增加需要mock的对象。此处也可以配置到具体类的具体方法上。
同时,pluginIdentities启用mock模块,即增加java-subInvoke值。
"javaSubInvokeBehaviors" : [
{
"classPattern": "com.ztesoft.zsmart.paas.dct.*",
"methodPatterns": [ "*" ],
"includeSubClasses": false
}
],
"pluginIdentities" : [ "http", "java-subInvoke", "mybatis", "ibatis" ],
使用此配置,重启repeater服务,或者页面上点推送按钮,推送到各个环境下。然后在环境A上录制的请求,到环境B上回放,回放时,勾选mock按钮。可以看到,尽管两个环境数据库内容不一致,但是返回的数据结果是一样的,也就是在环境B上回放时,数据库交互操作被mock掉了,直接返回了环境A上录制的结果。