JVM-SandBox-Repeater 体验部署(1/2)

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

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 应用

调试启动被测试应用

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及端口


image

对比 attach 和 agent 启动模式的优缺点

  • attach 模式

优点

  1. 可插拔,随时加载或卸载
  2. 更新插件或配置时,不需要重启应用
  3. 调试方便,可同时远程调试repeater以及被测应用,因为可以起两个remote debug 端口
  4. 适合临时使用

缺点

  1. 部分场景回放会失败,如Java回放时无法获取实例,会出现反射实例对象失败,不能进行回放
  2. 不能缓存Java实例,需要被测应用加载钩子才可以使用。
  • agent 模式

优点

  1. 回放流畅,基本 java 录制都可以回放
  2. 适合长期使用,随应用部署

缺点

  1. 更新插件,需要重启应用
  2. 不适合同时调试repeater以及被测应用

接下来就是 JVM-SandBox-Repeater 录制、回放、Mock

你可能感兴趣的:(JVM-SandBox-Repeater 体验部署(1/2))