通用技术 关于流量回放录制工具 [jvm-sandbox-repeater ] 学习分享

alwans · 2021年05月21日 · 最后由 Ouroboros 回复于 2021年05月21日 · 4099 次阅读

背景

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

目前实现的功能:
  • sandbox 管理 (一开始主要是想实现这个)
  • 弃用 repeater 的 console 模块,重复造轮子重新实现了 console 部分目前我用到的功能以及重写了 UI (因为功能一样,所以 copy 了原 console 模块中的大量 java 文件;repeater 相关页面属性完全照搬作者。别问为什么,问就是想不到更好的展示形式)
暂时有考虑但还未实现的功能:
  • module 模块管控: 启动只加载指定的 module;可通过 web 上传更新 | 新增 module
  • 单流量回放时可选择部分子调用 mock
  • 基于 sandbox 的 mock 服务
  • 能不能更方便 debug;具体怎么个方便,还没想明白

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

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

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

功能展示

  • sandbox 管理 (启用 / 禁用)
  • sandbox 模块管理 (卸载 | 加载功能还没写)
  • 新增应用服务的 repeater 录制规则管理
  • 流量列表管理以及回放和批量回放功能


  • 回放列表及详情查看

  • 历史批量回放数据统计 (很粗糙的写了下)

项目结构

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

简单介绍一下项目

  • test-services
    • test-sandbox-aide
    • test-services-core

test-sandbox-aide

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

  • 配置 services-core 服务地址
    • 通过 coreServices.properties 配置, 默认:127.0.0.1:12309
    • coreServices.properties 文件路径 : ${user.home}
  • 获取应用服务进程 id
    • 通过 jps 命令获取当前服务器上所有的 java 应用名称以及启动相关参数信息,根据是否包含关键字 (serverName) 来查找对应的应用服务进程 id。 这种偷懒的方案是有缺陷的,所以如果是 war 包建议启动的时候加上一个自定义参数来匹配 serverName;如果是 jar 包,当我没说

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 配置;

    • 例:
    • 环境:test
    • 服务名称: jvmTest
    • host: 被测应用所在服务器 ip
      第 9 步骤一定要在 aide 服务启动之前设置好
  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)

共收到 1 条回复 时间 点赞
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册