流量录制回放工具jvm-sandbox-repeater入门篇——服务部署
趋于当前技术不断更新、产品功能多元化之下,流量回放的热度也是越来越高。
在前一段时间,测试团队也提到阿里开源的流量回放工具 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
# 是否开启脱机工作模式
repeat.standalone.mode=false
- url主机地址和端口,这个按需修改,每个人的服务器地址都不一样
# 录制消息投递地址
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
说到这里,可能会疑问,为什么要修改这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/
# 使用本地数据源进行测试
console.use.localCache =false
# 示例回放地址(工程使用需要维护repeater插件的ip:port替换,指定ip发起回放)
repeat.repeat.url=http://%s:%s/sandbox/default/module/http/repeater/repeat
# 示例配置地址(工程使用需要维护repeater插件的ip:port替换,指定ip发起回放)
repeat.config.url=http://%s:%s/sandbox/default/module/http/repeater/pushConfig
# 示例重载地址(工程使用需要维护repeater插件的ip:port替换,指定ip发起回放)
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,语句如下所示:
CREATE DATABASE IF NOT EXISTS repeater
DEFAULT CHARSET utf8
COLLATE utf8_general_ci;
DROP TABLE IF EXISTS repeater.record;
CREATE TABLE repeater.record
(
id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
COMMENT '主键',
gmt_create DATETIME NOT NULL
COMMENT '创建时间',
gmt_record DATETIME NOT NULL
comment '录制时间',
app_name VARCHAR(255) NOT NULL
COMMENT '应用名',
environment VARCHAR(255) NOT NULL
COMMENT '环境信息',
host VARCHAR(36) NOT NULL
COMMENT '机器IP',
trace_id VARCHAR(32) NOT NULL
COMMENT '链路追踪ID',
entrance_desc VARCHAR(2000) NOT NULL
COMMENT '链路追踪ID',
wrapper_record LONGTEXT NOT NULL
COMMENT '记录序列化信息',
request LONGTEXT NOT NULL
COMMENT '请求参数JSON',
response LONGTEXT NOT NULL
COMMENT '返回值JSON'
)
ENGINE = InnoDB
COMMENT = '录制信息'
DEFAULT CHARSET = utf8
AUTO_INCREMENT = 1;
DROP TABLE IF EXISTS repeater.replay;
CREATE TABLE repeater.replay
(
id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
COMMENT '主键',
gmt_create DATETIME NOT NULL
COMMENT '创建时间',
gmt_modified DATETIME NOT NULL
comment '修改时间',
app_name VARCHAR(255) NOT NULL
COMMENT '应用名',
environment VARCHAR(255) NOT NULL
COMMENT '环境信息',
ip VARCHAR(36) NOT NULL
COMMENT '机器IP',
repeat_id VARCHAR(32) NOT NULL
COMMENT '回放ID',
status TINYINT NOT NULL
COMMENT '回放状态',
trace_id VARCHAR(32)
COMMENT '链路追踪ID',
cost BIGINT(20)
COMMENT '回放耗时',
diff_result LONGTEXT
COMMENT 'diff结果',
response LONGTEXT
COMMENT '回放结果',
mock_invocation LONGTEXT
COMMENT 'mock过程',
success BIT
COMMENT '是否回放成功',
record_id BIGINT(20)
COMMENT '外键'
)
ENGINE = InnoDB
COMMENT = '回放信息'
DEFAULT CHARSET = utf8
AUTO_INCREMENT = 1;
DROP TABLE IF EXISTS repeater.module_info;
CREATE TABLE repeater.module_info
(
id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
COMMENT '主键',
gmt_create DATETIME NOT NULL
COMMENT '创建时间',
gmt_modified DATETIME NOT NULL
comment '修改时间',
app_name VARCHAR(255) NOT NULL
COMMENT '应用名',
environment VARCHAR(255) NOT NULL
COMMENT '环境信息',
ip VARCHAR(36) NOT NULL
COMMENT '机器IP',
port VARCHAR(12) NOT NULL
COMMENT '链路追踪ID',
version VARCHAR(128) NOT NULL
COMMENT '模块版本号',
status VARCHAR(36) NOT NULL
COMMENT '模块状态'
)
ENGINE = InnoDB
COMMENT = '在线模块信息'
DEFAULT CHARSET = utf8
AUTO_INCREMENT = 1;
DROP TABLE IF EXISTS repeater.module_config;
CREATE TABLE repeater.module_config
(
id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
COMMENT '主键',
gmt_create DATETIME NOT NULL
COMMENT '创建时间',
gmt_modified DATETIME NOT NULL
comment '录制时间',
app_name VARCHAR(255) NOT NULL
COMMENT '应用名',
environment VARCHAR(255) NOT NULL
COMMENT '环境信息',
config LONGTEXT NOT NULL
COMMENT '配置信息'
)
ENGINE = InnoDB
COMMENT = '模块配置信息'
DEFAULT CHARSET = utf8
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入门篇——服务部署的更多相关文章
- 流量录制回放工具jvm-sandbox-repeater入门篇——录制和回放
在上一篇文章中,把repeater服务部署介绍清楚了,详细可见:流量录制回放工具jvm-sandbox-repeater入门篇--服务部署 今天在基于上篇内容基础上,再来分享下流量录制和回放的相关内容 ...
- JVM基础快速入门篇
Java是一门可以跨平台的语言,但是Java本身是不可以实现跨平台的,需要JVM实现跨平台.javac编译好后的class文件,在Windows.Linux.Mac等系统上,只要该系统安装对应的Jav ...
- SpringBoot入门篇--热部署
在项目的开发过程中我们难免会涉及到对代码的修改,有bug我们也需要对代码进行修改,这时候我们就需要重启服务器.但是,我们知道的是这个过程是相当的痛苦的,重启服务器涉及到了所有资源的重新加载,过程那是相 ...
- 如何把Java代码玩出花?JVM Sandbox入门教程与原理浅谈
在日常业务代码开发中,我们经常接触到AOP,比如熟知的Spring AOP.我们用它来做业务切面,比如登录校验,日志记录,性能监控,全局过滤器等.但Spring AOP有一个局限性,并不是所有的类都托 ...
- 流量录制与回放在vivo的落地实践
一.为什么要使用流量录制与回放? 1.1 vivo业务状况 近几年,vivo互联网领域处于高速发展状态,同时由于vivo手机出货量一直在国内名列前茅,经过多年积累,用户规模非常庞大.因此,vivo手机 ...
- Jmeter(二十八) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy1(详解教程)
1.简介 在使用jmeter自动录制脚本时会产生很多无用的请求,所以推荐使用badboy录制脚本之后保存为jmx文件,在jmeter中打开使用.因此宏哥在这里介绍一下Badboy这款工具,本来打算不做 ...
- 【Android测试】【第十节】MonkeyRunner—— 录制回放
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4861693.html 前言 在实际项目进行过程中,频繁的需 ...
- Linux终端回话记录和回放工具 - asciinema使用总结
目前linux终端回放工具常见的就是asciinema和script了, 这两种工具都有那种类似于视频回放的效果.虽然这样做的代价是录制过程中需要占用一定的cpu资源以及录制后可能会因为视频文件太大而 ...
- 【SoloPi】SoloPi使用2-功能使用,录制回放
Soloπ是什么Soloπ是一个无线化.非侵入式的Android自动化工具,公测版拥有录制回放.性能测试.一机多控三项主要功能,能为测试开发人员节省宝贵时间. 录制回放功能在Soloπ的录制模式对应用 ...
随机推荐
- thrift使用和源码分析
1 前言 thrift的官方文档比较差,很多细节没有介绍清楚,比如require.optional和default字段的区别是什么,为什么字段前面要写序号等,带着这些疑问,我们需要阅读生成的源码来了解 ...
- 为什么 redis 需要把所有数据放到内存中?
答Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数 据写入磁盘.所以 redis 具有快速和数据持久化的特征.如果不将数据放在内存中, 磁盘 I/O 速度为严重影响 redi ...
- vue中ajax请求发送
示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- Vue报错之"[Vue warn]: Invalid prop: type check failed for prop "jingzinum". Expected Number with value NaN, got String with value "fuNum"."
一.报错截图 [Vue warn]: Invalid prop: type check failed for prop "jingzinum". Expected Number w ...
- servlet中的ServletConfig对象
ServletConfig对象对应web.xml文件中的<servlet>节点.当Tomcat初始化一个Servlet时,会创建ServletConfig对象,并将该Servlet的配置信 ...
- BMZCTF WEB_ezeval
WEB_ezeval 进入环境,源码给出 <?php highlight_file(__FILE__); $cmd=$_POST['cmd']; $cmd=htmlspecialchars($c ...
- linux命令手册
常⻅系统服务命令 常用命令 作用 chkconfig --list 列出系统服务 service <服务名> status 查看某个服务 service <服务名> start ...
- node-webkit文档翻译#package.json
title: node-webkit文档翻译#package.json date: 2013-12-07 21:38:25 tags: node-webkit 基本示例 { "main&qu ...
- 【网易云信】H5 容器技术方案
Native 开发原生应用是手机操作系统厂商(目前主要是苹果的 iOS 和 Google 的 Android)对外界提供的标准化的开发模式,他们对于 Native 开发提供了一套标准化实现和优化方案. ...
- 将HTML页面转换为PDF文件并导出
目前,在大多数的管理系统中,都会有这样一个功能:根据相关的条件查询相应的数据,并生成可视化报表,然后可导出为PDF文件.本文只展现生成可视化报表之后导出PDF文件的过程,生成可视化的报表可使用Echa ...