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

在前一段时间,测试团队也提到阿里开源的流量回放工具 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入门篇——服务部署的更多相关文章

  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. CHAR 和 VARCHAR 的区别?

    1.CHAR 和 VARCHAR 类型在存储和检索方面有所不同 2.CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255 当 CHAR 值被存储时,它们被用空格填充到特定长度,检索  ...

  2. memcached 是原子的吗?

    所有的被发送到 memcached 的单个命令是完全原子的.如果您针对同一份数据 同时发送了一个 set 命令和一个 get 命令,它们不会影响对方.它们将被串行化. 先后执行.即使在多线程模式,所有 ...

  3. Java 中,Comparator 与 Comparable 有什么不同?

    Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户 定制的顺序.Comparable 总是只有一个,但是可以有多个 comparator 来定义 对象的顺序.

  4. Flask-Migrate使用教程

    功能:flask-migrate是flask的一个扩展模块,主要是扩展数据库表结构的. 项目准备:一个干净的Flask项目,下载连接地址: https://pan.baidu.com/s/1WqdIN ...

  5. 11_滞后补偿器_Lag Compensator_Matlab_Simulink

    下图中左边没有补偿器的稳态误差,右边是有只猴补偿器的稳态误差,H(s)为滞后补偿器的原因是H(s)bode图的相位图是负的 其中黄线是没有滞后补偿器的,蓝线是滞后补偿器中p = 1 ,q = 9的曲线 ...

  6. jq与js的写法,示例回到顶部div滚动显示隐藏

    jq:var top_icon = $('.top_icon')[0]; id写法$('#id'),类写法$('.class'),标签写法$('div') 如:join=document.getEle ...

  7. 【小程序开发】 点击button按钮,引导用户授权

    一. 前言 小程序官方文档,上面说明 wx.getUserInfo(OBJECT) 注意:此接口有调整,使用该接口将不再出现授权弹窗,请使用 <button open-type="ge ...

  8. Override,Overload,Overwrite到底有什么区别?

    Override,Overload,Overwrite的区别[新手可忽略不影响继续学习] 方法的覆盖(Override)是指子类重写从父类继承来的一个同名方法(参数.返回值也同),马克-to-win: ...

  9. 掌握JavaScript中的迭代器和生成器,顺便了解一下async、await的原理

    掌握JavaScript中的迭代器和生成器,顺便了解一下async.await的原理 前言 相信很多人对迭代器和生成器都不陌生,当提到async和await的原理时,大部分人可能都知道async.aw ...

  10. SSRF——介绍利用(不全)

    1. SSRF介绍 SSRF(Server-side Request Forge, 服务端请求伪造). 由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务. 2. SSR ...