背景

最近在学习 jvm-sandbox 以及 jvm-sandbox-repeater。学习过程中,每次启动 sandbox 都是通过 sandbox.sh 脚本启动,感觉非常的方便😀 。但尝试了在多台虚拟机上安装使用以及频繁的启停操作后,考虑能不能有一个解决方案来更好的管理 sandbox,于是有了这篇帖子。

目前实现的功能:
暂时有考虑但还未实现的功能:

部分页面样式借 (c) 鉴 (x) 了帖子:
流量回放框架 jvm-sandbox-repeater 实践二

发帖的初衷是希望能更多的交流 jvm-sandbox 以及 repeater 的工具使用。(虽然本文并没有涉及到工具的落地使用 ...)

有相关讨论群的求带
顺便附上项目地址:test-services

功能展示

项目结构

web 代码暂时未分享,是基于公司其他项目上直接改造的。有部分相关业务代码还未删除。反正都是用的 element 组件,大家自己组装一下就搞定;项目中提供了构建后的 zip 文件

简单介绍一下项目

test-sandbox-aide

部署在每台应用服务器上,负责启动指定应用服务的 sandbox,目前这种方式只能是 attach 启动 sandbox

test-services-core

负责 web 交互以及和 aide 服务 交互

服务部署

  1. fork jvm-sandbox-repeater;

    修改 java 文件 RepeaterModule.java

    /**
    * 新增这个方法
    */
    private void setSystemProp(){
        //偷个懒,把app.name 设置为当前应用服务的进程id;这样就不用启动的时候额外的设置了
        System.out.println(">>>> repeater module 开始加载, 设置属性app.name && app.env <<<<");
        RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
        System.setProperty("app.name", runtimeMXBean.getName().split("@")[0]);
        System.setProperty("app.env", String.valueOf(configInfo.getServerAddress().getPort()));
    }
    
    /**
    * 在这里加上刚刚新增的方法
    */
    @Override
    public void onLoad() throws Throwable {
        // 初始化日志框架
        LogbackUtils.init(PathUtils.getConfigPath() + "/repeater-logback.xml");
        setSystemProp(); //这里我先设置app.name:应用服务的进程id 和 app.env:sandbox的server端口
        Mode mode = configInfo.getMode();
        log.info("module on loaded,id={},version={},mode={}", com.alibaba.jvm.sandbox.repeater.module.Constants.MODULE_ID, com.alibaba.jvm.sandbox.repeater.module.Constants.VERSION, mode);
        /* agent方式启动 */
        if (mode == Mode.AGENT && Boolean.valueOf(PropertyUtil.getPropertyOrDefault(REPEAT_SPRING_ADVICE_SWITCH, ""))) {
            log.info("agent launch mode,use Spring Instantiate Advice to register bean.");
            SpringContextInnerContainer.setAgentLaunch(true);
            SpringInstantiateAdvice.watcher(this.eventWatcher).watch();
            moduleController.active();
        }
    }
    
  2. repeater-plugin-api & repeater-plugin-core 打包上传 maven 私服

  3. 新建 Mysql 数据库:test_platform,执行 sql:test-services-core/src/main/resource/test_platform.sql

  4. 修改test-services-core/src/main/resources/application.properties 中的数据库配置

  5. 打包 test-sandbox-adie && test-services-core

  6. nginx 部署 website,dist.zip 路径:test-services-core/src/main/resource/dist.zip

  7. 启动被测 Demo 应用; 文件路径--> test-core-services/src/main/resource/jvmTest-0.0.1-SNAPSHOT.jar java -jar jvmTest-0.0.1-SNAPSHOT.jar|| 启动自己的应用服务

  8. 启动 test-services-core 服务 java -jar test-services-core-1.0.0.jar

  9. 在 web 页面 [sandbox 列表] 添加应用服务对应的 sandbox 配置;

  10. 在被测应用服务器上启动 test-sandbox-aide 服务 java -jar -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ test-sandbox-aide-1.0.0.jar (如果启动失败,请检查 ${user.hoem}/coreServices.properties 中的 services 服务地址是否正确 || 检查 ${JAVA_HOME})

  11. web 页面 [Sandbox 列表] 新增 jvmTest 应用的 repeater 录制规则; 例: 上面的 [repeater 录制管理示图]

  12. web 页启动 jvmTest 应用的 sandbox

  13. 录制流量:curl -s http://${jvmTest-ip}:${port}/api/test10 (接口有 10 个:test1-test10)


↙↙↙阅读原文可查看相关链接,并与作者交流