jvm-sandbox-repeater部署实践

下载源码

源码下载

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代码调整:

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"; ,去掉双引号里面第一个 /

repeater脚本调整:

获取路径的函数,在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更换路径,另外,目录中也不要带中文。

启动console

创建数据库

数据库初始化的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

启动console

分两种方式

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一致

改进点

docker容器化部署网络问题

1,使用host网络模式,可以打通容器网络,但生产环境不建议使用这种方式。

有状态请求流量子调用mock

如果需要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上录制的结果。

你可能感兴趣的:(Java,解决方案,中间件,java,docker)