趋于当前技术不断更新、产品功能多元化之下,流量回放的热度也是越来越高。

在前一段时间,测试团队也提到阿里开源的流量回放工具 jvm-sandbox-repeater

我个人就先尝试一下,期间还是遇到一些问题,通过咨询和度娘的帮助下,整体功能的使用流程是跑通了。

jvm-sandbox-repeater简介

在聊之前,我们先来了解下jvm-sandbox-repeater,其实在官网上也有详细的介绍,这里就直接搬官网的吧

jvm-sandbox-repeater是JVM-Sandbox生态体系下的重要模块,它具备了JVM-Sandbox的所有特点,插件式设计便于快速适配各种中间件,封装请求录制/回放基础协议,也提供了通用可扩展的各种丰富API。

目标人群

  • 线上有个用户请求一直不成功,我想在测试环境Debug一下,能帮我复现一下吗?

  • 压测流量不知道怎么构造,数据结构太复杂,压测模型也难以评估,有什么好的办法吗?

  • 不想写接口测试脚本了,我想做一个流量录制系统,把线上用户场景做业务回归,可能会接入很多服务系统,不想让每个系统都进行改造,有好的框架选择吗?

  • 我想做一个业务监控系统,对线上核心接口采样之后做一些业务校验,实时监控业务正确性。

如果你有以上的想法或需求,jvm-sandbox-repeater 都将是你的不二选择方案;框架基于JVM-Sandbox,拥有JVM-Sandbox的一切特性,同时封装了以下能力:

  • 录制/回放基础协议,可快速配置/编码实现一类中间件的录制/回放
  • 开放数据上报,对于录制结果可上报到自己的服务端,进行监控、回归、问题排查等上层平台搭建

repeater的核心能力

  • 通用录制/回放能力

    无侵入式录制HTTP/Java/Dubbo入参/返回值录制能力(业务系统无感知)

    基于TTL提供多线程子调用追踪,完整追踪一次请求的调用路径

    入口请求(HTTP/Dubbo/Java)流量回放、子调用(Java/Dubbo)返回值Mock能力

  • 快速可扩展API实现

    录制/回放插件式架构

    提供标准接口,可通过配置/简单编码实现一类通用插件

  • standalone工作模式

    无需依赖任何服务端/存储,可以单机工作,提供录制/回放能力

repeater的应用场景

  • 业务快速回归

    基于线上流量的录制/回放,无需人肉准备自动化测试脚本、准备测试数据

  • 线上问题排查

    录制回放提供"昨日重现"能力,还原线上真实场景到线下做问题排查和Debug

    动态方法入参/返回值录制,提供线上快速问题定位

  • 压测流量准备

    0成本录制HTTP/Dubbo等入口流量,作为压测流量模型进行压测

  • 实时业务监控

    动态业务监控,基于核心接口数据录制回流到平台,对接口返回数据正确性进行校验和监控

jvm-sandbox-repeater服务部署

环境准备

建议在Linux环境下使用,windows下可能会出现路径不一致的情况,我使用的环境如下:

  • Linux
  • JDK 1.8
  • Maven 3.2
  • Mysql 5.7

如果只是想简单体验下,则用不到Mysql,可以参考官网的用户手册

安装repeater

克隆源码

git clone https://github.com/alibaba/jvm-sandbox-repeater.git

安装repeater

进入到jvm-sandbox-repeater项目bin目录下,执行命令./install-repeater.sh

界面展示如下所示,则说明安装成功

修改repeater配置

路径为:~/.sandbox-module/cfg/repeater.properties

主要修改2个值

  • repeat.standalone.mode,修改为false
  1. # 是否开启脱机工作模式
  2. repeat.standalone.mode=false
  • url主机地址和端口,这个按需修改,每个人的服务器地址都不一样
  1. # 录制消息投递地址
  2. broadcaster.record.url=http://127.0.0.1:8001/facade/api/record/save
  3. # 回放结果投递地址
  4. broadcaster.repeat.url=http://127.0.0.1:8001/facade/api/repeat/save
  5. # 回放消息取数据地址
  6. repeat.record.url=http://127.0.0.1:8001/facade/api/record/%s/%s
  7. # 配置文件拉取地址
  8. repeat.config.url=http://127.0.0.1:8001/facade/api/config/%s/%s

说到这里,可能会疑问,为什么要修改这2个配置?原因如下:

repeat.standalone.mode控制 repeater 是否以 standalone 模式启动,我们要与 repeater-console 结合使用,所以配置为false

其他 url 都是与 repeater-console 交互的 url,所以需要将 host 改为本地启动的 repeater-console 的地址

修改console配置

console配置路径:/jvm-sandbox-repeater/repeater-console/repeater-console-start/src/main/resources/

  1. # 使用本地数据源进行测试
  2. console.use.localCache =false
  3. # 示例回放地址(工程使用需要维护repeater插件的ip:port替换,指定ip发起回放)
  4. repeat.repeat.url=http://%s:%s/sandbox/default/module/http/repeater/repeat
  5. # 示例配置地址(工程使用需要维护repeater插件的ip:port替换,指定ip发起回放)
  6. repeat.config.url=http://%s:%s/sandbox/default/module/http/repeater/pushConfig
  7. # 示例重载地址(工程使用需要维护repeater插件的ip:port替换,指定ip发起回放)
  8. repeat.reload.url=http://%s:%s/sandbox/default/module/http/repeater/reload

这里主要修改ip+端口,这个也是按实际服务配置来。console.use.localCache默认为false,不修改即可

建库建表

由于我这里是结合console一起使用,所以需要用到Mysql,自然就需要建立所需的数据库和表。建库建表语句在项目中是有的,路径为:/jvm-sandbox-repeater/repeater-console/repeater-console-dal/src/main/resources/database.sql,语句如下所示:

  1. CREATE DATABASE IF NOT EXISTS repeater
  2. DEFAULT CHARSET utf8
  3. COLLATE utf8_general_ci;
  4. DROP TABLE IF EXISTS repeater.record;
  5. CREATE TABLE repeater.record
  6. (
  7. id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
  8. COMMENT '主键',
  9. gmt_create DATETIME NOT NULL
  10. COMMENT '创建时间',
  11. gmt_record DATETIME NOT NULL
  12. comment '录制时间',
  13. app_name VARCHAR(255) NOT NULL
  14. COMMENT '应用名',
  15. environment VARCHAR(255) NOT NULL
  16. COMMENT '环境信息',
  17. host VARCHAR(36) NOT NULL
  18. COMMENT '机器IP',
  19. trace_id VARCHAR(32) NOT NULL
  20. COMMENT '链路追踪ID',
  21. entrance_desc VARCHAR(2000) NOT NULL
  22. COMMENT '链路追踪ID',
  23. wrapper_record LONGTEXT NOT NULL
  24. COMMENT '记录序列化信息',
  25. request LONGTEXT NOT NULL
  26. COMMENT '请求参数JSON',
  27. response LONGTEXT NOT NULL
  28. COMMENT '返回值JSON'
  29. )
  30. ENGINE = InnoDB
  31. COMMENT = '录制信息'
  32. DEFAULT CHARSET = utf8
  33. AUTO_INCREMENT = 1;
  34. DROP TABLE IF EXISTS repeater.replay;
  35. CREATE TABLE repeater.replay
  36. (
  37. id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
  38. COMMENT '主键',
  39. gmt_create DATETIME NOT NULL
  40. COMMENT '创建时间',
  41. gmt_modified DATETIME NOT NULL
  42. comment '修改时间',
  43. app_name VARCHAR(255) NOT NULL
  44. COMMENT '应用名',
  45. environment VARCHAR(255) NOT NULL
  46. COMMENT '环境信息',
  47. ip VARCHAR(36) NOT NULL
  48. COMMENT '机器IP',
  49. repeat_id VARCHAR(32) NOT NULL
  50. COMMENT '回放ID',
  51. status TINYINT NOT NULL
  52. COMMENT '回放状态',
  53. trace_id VARCHAR(32)
  54. COMMENT '链路追踪ID',
  55. cost BIGINT(20)
  56. COMMENT '回放耗时',
  57. diff_result LONGTEXT
  58. COMMENT 'diff结果',
  59. response LONGTEXT
  60. COMMENT '回放结果',
  61. mock_invocation LONGTEXT
  62. COMMENT 'mock过程',
  63. success BIT
  64. COMMENT '是否回放成功',
  65. record_id BIGINT(20)
  66. COMMENT '外键'
  67. )
  68. ENGINE = InnoDB
  69. COMMENT = '回放信息'
  70. DEFAULT CHARSET = utf8
  71. AUTO_INCREMENT = 1;
  72. DROP TABLE IF EXISTS repeater.module_info;
  73. CREATE TABLE repeater.module_info
  74. (
  75. id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
  76. COMMENT '主键',
  77. gmt_create DATETIME NOT NULL
  78. COMMENT '创建时间',
  79. gmt_modified DATETIME NOT NULL
  80. comment '修改时间',
  81. app_name VARCHAR(255) NOT NULL
  82. COMMENT '应用名',
  83. environment VARCHAR(255) NOT NULL
  84. COMMENT '环境信息',
  85. ip VARCHAR(36) NOT NULL
  86. COMMENT '机器IP',
  87. port VARCHAR(12) NOT NULL
  88. COMMENT '链路追踪ID',
  89. version VARCHAR(128) NOT NULL
  90. COMMENT '模块版本号',
  91. status VARCHAR(36) NOT NULL
  92. COMMENT '模块状态'
  93. )
  94. ENGINE = InnoDB
  95. COMMENT = '在线模块信息'
  96. DEFAULT CHARSET = utf8
  97. AUTO_INCREMENT = 1;
  98. DROP TABLE IF EXISTS repeater.module_config;
  99. CREATE TABLE repeater.module_config
  100. (
  101. id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
  102. COMMENT '主键',
  103. gmt_create DATETIME NOT NULL
  104. COMMENT '创建时间',
  105. gmt_modified DATETIME NOT NULL
  106. comment '录制时间',
  107. app_name VARCHAR(255) NOT NULL
  108. COMMENT '应用名',
  109. environment VARCHAR(255) NOT NULL
  110. COMMENT '环境信息',
  111. config LONGTEXT NOT NULL
  112. COMMENT '配置信息'
  113. )
  114. ENGINE = InnoDB
  115. COMMENT = '模块配置信息'
  116. DEFAULT CHARSET = utf8
  117. AUTO_INCREMENT = 1;

执行完建库建表语句后,就会生成对应的四张表了。

修改repeater项目代码

  • #parse("/blocks替换为#parse("blocks

路径为:/jvm-sandbox-repeater/repeater-console/repeater-console-start/src/main/resources/velocity,将velocity路径下的所有文件,存在#parse("/blocks的替换为#parse("blocks

这个点,我是看之前的文章有提及,但我拉取源码来看的时候,这个点的问题已经不存在的,源码中就已经是#parse("blocks

所以我这个点没有修改代码

  • 修改 ReplayController.java

路径为:/jvm-sandbox-repeater/repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/page/ReplayController.java,将return "/replay/detail";修改为return "replay/detail";,去掉双引号里面第一个 /

  • 修改 RegressPageController.java

路径为:/jvm-sandbox-repeater/repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/test/RegressPageController.java,将return "/regress/index";修改为return "regress/index";,去掉双引号里面第一个 /

启动repeater项目

进入到路径:/jvm-sandbox-repeater下,使用命令mvn clean install -Dmaven.test.skip=true && java -jar repeater-console/repeater-console-start/target/repeater-console.jar,出现如下所示内容,说明项目构建成功

出现如下所示内容,说明repeater项目启动成功

访问repeater-console页面

通过url http://ip:端口/regress/index.htm,访问页面,进入到如下测试页面,说明通过url访问也ok,服务没有问题

该页面总共三个菜单:在线流量、配置管理、在线模块

先简单讲下,在线流量就是录制的请求,配置管理就是针对要录制的应用配置,在线模块就是sandbox的心跳。后续文章会继续讲到,今天先简单描述下。

问题

./install-repeater.sh执行失败

执行命令,出现如下报错

解决办法:

通过命令 vim install-repeater.sh 将 tar xz 中的 z 删除即可,因为该压缩包没有用gzip格式压缩,所以不用加z参数

启动repeater项目空指针

启动repeater项目提示空指针,报错如下所示:

解决办法:

module_config、module_info表中的appname和environment不一致,修改为一致即可

以上就是今天分享的内容,下期再会。

流量录制回放工具jvm-sandbox-repeater入门篇——服务部署的更多相关文章

  1. 流量录制回放工具jvm-sandbox-repeater入门篇——录制和回放

    在上一篇文章中,把repeater服务部署介绍清楚了,详细可见:流量录制回放工具jvm-sandbox-repeater入门篇--服务部署 今天在基于上篇内容基础上,再来分享下流量录制和回放的相关内容 ...

  2. JVM基础快速入门篇

    Java是一门可以跨平台的语言,但是Java本身是不可以实现跨平台的,需要JVM实现跨平台.javac编译好后的class文件,在Windows.Linux.Mac等系统上,只要该系统安装对应的Jav ...

  3. SpringBoot入门篇--热部署

    在项目的开发过程中我们难免会涉及到对代码的修改,有bug我们也需要对代码进行修改,这时候我们就需要重启服务器.但是,我们知道的是这个过程是相当的痛苦的,重启服务器涉及到了所有资源的重新加载,过程那是相 ...

  4. 如何把Java代码玩出花?JVM Sandbox入门教程与原理浅谈

    在日常业务代码开发中,我们经常接触到AOP,比如熟知的Spring AOP.我们用它来做业务切面,比如登录校验,日志记录,性能监控,全局过滤器等.但Spring AOP有一个局限性,并不是所有的类都托 ...

  5. 流量录制与回放在vivo的落地实践

    一.为什么要使用流量录制与回放? 1.1 vivo业务状况 近几年,vivo互联网领域处于高速发展状态,同时由于vivo手机出货量一直在国内名列前茅,经过多年积累,用户规模非常庞大.因此,vivo手机 ...

  6. Jmeter(二十八) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy1(详解教程)

    1.简介 在使用jmeter自动录制脚本时会产生很多无用的请求,所以推荐使用badboy录制脚本之后保存为jmx文件,在jmeter中打开使用.因此宏哥在这里介绍一下Badboy这款工具,本来打算不做 ...

  7. 【Android测试】【第十节】MonkeyRunner—— 录制回放

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4861693.html 前言 在实际项目进行过程中,频繁的需 ...

  8. Linux终端回话记录和回放工具 - asciinema使用总结

    目前linux终端回放工具常见的就是asciinema和script了, 这两种工具都有那种类似于视频回放的效果.虽然这样做的代价是录制过程中需要占用一定的cpu资源以及录制后可能会因为视频文件太大而 ...

  9. 【SoloPi】SoloPi使用2-功能使用,录制回放

    Soloπ是什么Soloπ是一个无线化.非侵入式的Android自动化工具,公测版拥有录制回放.性能测试.一机多控三项主要功能,能为测试开发人员节省宝贵时间. 录制回放功能在Soloπ的录制模式对应用 ...

随机推荐

  1. spring-boot-关于module自定义jar包打包无法给其他module使用

    ####世界大坑: 如果仅是使用 <build> <plugins> <plugin> <groupId>org.springframework.boo ...

  2. Netty学习摘记 —— Netty客户端 / 服务端概览

    本文参考 本篇文章是对<Netty In Action>一书第二章"你的第一款 Netty 应用程序"的学习摘记,主要内容为编写 Echo 服务器和客户端 第一款应用程 ...

  3. js技术之获取字符串中某个字符的位置(lastIndexOf()方法 和 indexOf() 方法)

    一.lastIndexOf()方法 1.作用: 方法可返回 一个指定的字符串值 在字符串中最后出现的位置.从左往右查. 2.返回: 一个正整数.或者 -1. 3.语法: stringObject.la ...

  4. char的越界赋值即其原理剖析

    思考: int ch = 'A'; int ch1 = 65; int ch2 = 321; printf("%c %c %c\n", ch, ch1, ch2);的输出结果是什么 ...

  5. 决策树算法4:CHAID

    原理: 其中 n = a+b+c+d 卡方计算(例子)使用 sklearn完成 data.csv中的部分数据 #如何使用卡方检测相关度 from sklearn.feature_selection i ...

  6. [CSS]《CSS揭秘》第四章——视觉效果

    投影 单侧投影 box-shadow:0px 10px 10px -5px black; 邻边投影 box-shadow:10px 10px 10px 2px black; 双侧投影 box-shad ...

  7. 前端进阶(8) - 前端开发需要了解的工具集合:webpack, eslint, prettier, ...

    前端开发需要了解的工具集合:webpack, eslint, prettier, ... 前端开发需要了解的一些工具,这些工具能够帮助你在项目开发中事半功倍. 1. nrm: npm registry ...

  8. Java/C++实现装饰模式---模拟手机功能的升级过程

    用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人:而JarPhone除了声音还能振动:更高级的手机(ComplexPhone)除了声音.振动外,还 ...

  9. Spring Security的使用

    spring security使用目的:验证,授权,攻击防护. 原理:创建大量的filter和interceptor来进行请求的验证和拦截,以此来达到安全的效果. Spring Security主要包 ...

  10. <wx-open-launch-weapp>详解

    demo图, h5跳转小程序 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...