JVM-SandBox-Repeater 初體驗 環(huán)境搭建
環(huán)境信息
操作系統(tǒng):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 結(jié)構(gòu)參考:(安裝后的結(jié)構(gòu))
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 工程結(jié)構(gòu)參考:(源碼)
jvm-sandbox-repeater git:(master) ? tree -L 2
.
├── LICENSE
├── Readme.md
├── bin
│ ├── bootstrap.sh
│ ├── health.sh
│ ├── install-local.sh # 本地的啟動腳本
│ ├── install-repeater.sh
│ ├── package.sh # 本地的編譯腳本 ,負責(zé)編譯并把編譯好的包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 進行的修改,這個地方使用的時候可以針對自己的業(yè)務(wù)進行修改
│ ├── hessian-lite.iml
│ ├── pom.xml
│ └── src
├── pom.xml
├── repeater-aide # 這是diff 相關(guān)的東西
│ ├── pom.xml
│ └── src
├── repeater-client # 這里放了spring容器相關(guān)的操作
│ ├── pom.xml
│ └── src
├── repeater-console # 這是一個web服務(wù),主要是用于錄制數(shù)據(jù)的接收、存儲,提供配置頁面服務(wù)
│ ├── Readme.md
│ ├── pom.xml
│ ├── repeater-console-common # 這是console的 工具包
│ ├── repeater-console-dal # 這是JPA的Dao層
│ ├── repeater-console-service # 主要是JPA的相關(guān)操作
│ ├── repeater-console-start # 這是console的controller
├── repeater-module # 這里就比較有意思了,是加載配置信息的,屬于自定義的東西
│ ├── pom.xml
│ └── src
├── repeater-plugin-api # 這是插件api,主要是一些Bean對象的定義
│ ├── pom.xml
│ └── src
├── repeater-plugin-core # 這是核心,錄制、回放、Mock、序列化等相關(guān)的實現(xiàn)都是這里
│ ├── 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
源碼下載下來后,可以執(zhí)行源碼目錄下 /bin中的install-local.sh編譯并把編譯好的包copy到.sandbox-module下面去
1、jvm-sandbox-console 調(diào)整配置 并 啟動
1、console源碼調(diào)整:
console代碼在idea中啟動時,不會報錯,但是使用jar包啟動時,頁面會報異常,需要做如下調(diào)整。
- 位置 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";
解決跳轉(zhuǎn)頁面的問題
- 位置 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/test/RegressPageController.java
替換 return "/regress/index"; 為 return "regress/index";
解決跳轉(zhuǎn)頁面的問題
2、 數(shù)據(jù)庫配置
位置:/repeater/repeater-console/repeater-console-start/src/main/resources
spring.datasource.url=jdbc:mysql://數(shù)據(jù)庫IP/域名:數(shù)據(jù)庫端口/數(shù)據(jù)庫名?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=用戶名
spring.datasource.password=密碼
3、編譯腳本
位置:repeater/bin/package.sh
如果你的maven沒有設(shè)置環(huán)境變量,那么這里可以修改一下直接指定
# 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,如果是遠程主機部署,則配置成服務(wù)IP端口
# 錄制消息投遞地址
broadcaster.record.url=http://127.0.0.1:8001/facade/api/record/save
# 回放結(jié)果投遞地址
broadcaster.repeat.url=http://127.0.0.1:8001/facade/api/repeat/save
# 回放消息取數(shù)據(jù)地址
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、環(huán)境變量
啟動參數(shù)中的 -Dapp.name=repeater -Dapp.env=daily
對應(yīng)應(yīng)用名和環(huán)境,是需要啟動時添加的,不然jvm-sandbox啟動后找不到對應(yīng)的環(huán)境信息
代碼一下位置讀取了這個環(huán)境變量信息
com.alibaba.jvm.sandbox.repeater.plugin.core.util.PropertyUtil
getSystemPropertyOrDefault
通過讀代碼我理解這個東西應(yīng)該是通過在被測的jvm機器上設(shè)置環(huán)境變量來搞
6、編譯啟動
執(zhí)行 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
調(diào)試啟動:
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

image.png
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 應(yīng)用
調(diào)試啟動被測試應(yīng)用
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={當(dāng)前主機IP} \
app_xxx.jar \
"$@" >${LogPath}app_xxx.log 2>&1 &
在被測jvm應(yīng)用啟動中添加agent配置,用于和console通訊使用
-Dapp.name=RouteVrs -Dapp.env=testA -javaagent:/home/admin/sandbox/lib/sandbox-agent.jar=server.port={jvm-sandbox控制端口}\;server.ip={當(dāng)前主機IP} \
jvm-sandbox attach 啟動模式
# 進入沙箱執(zhí)行腳本 attach方式進入被測jvm
cd sandbox/bin
# 目標(biāo)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、遠程調(diào)試
新建遠程Remote JVM Debug 填入IP及端口
image
對比 attach 和 agent 啟動模式的優(yōu)缺點
- attach 模式
優(yōu)點
- 可插拔,隨時加載或卸載
- 更新插件或配置時,不需要重啟應(yīng)用
- 調(diào)試方便,可同時遠程調(diào)試repeater以及被測應(yīng)用,因為可以起兩個remote debug 端口
- 適合臨時使用
缺點
- 部分場景回放會失敗,如Java回放時無法獲取實例,會出現(xiàn)反射實例對象失敗,不能進行回放
- 不能緩存Java實例,需要被測應(yīng)用加載鉤子才可以使用。
- agent 模式
優(yōu)點
- 回放流暢,基本 java 錄制都可以回放
- 適合長期使用,隨應(yīng)用部署
缺點
- 更新插件,需要重啟應(yīng)用
- 不適合同時調(diào)試repeater以及被測應(yīng)用
接下來就是 JVM-SandBox-Repeater 錄制、回放、Mock