流量录制与回放工具--GoReplay

1 简介

简单来说就是goreplay抓取线上真实的流量,并将捕捉到的流量转发到测试服务器上。《github源码》 : https://github.com/buger/goreplay

2 原理

在这里插入图片描述

3 使用场景

什么时候可以试用goreplay?
简单写几点场景,具体还是根据实际需求来。

Case 1
上线前在预发布环境,使用线上真实的请求,检查是否准备发布的版本,是否具备发布标准
Case 2
压力测试完成后,用线上真实的请求,加速后回放至测试环境,检查是否有报错等问题
Case 3
abtest
用线上的流量转发到预发,检查相同流量下一些指标的反馈情况,检查核心数据是否有改善、优化
等等
具体case还需要根据自己的需求,灵活改变。
case 4
系统重构时,复制真实线上环境流量到被测试环境进行回归,相当于在不影响业务的情况下提前上线检测系统潜在的问题。

case 5
可以将录制的流量作为用例管理起来进行日常自动化归回。

case6
录制线下开发和测试的第一次执行的用例,以后可以用第一次录制的用例反复回放测试,避免重复造用例,节省测试与开发时间。
优势

低成本:无需编写测试用例,通过流量录制形成丰富的测试用例。

高覆盖:一方面线上大量真实流量确保覆盖率,另一方面支持中间过程的验证,例如发送消息的内容、中间计算过程等等的全对象的对比验证,传统手工编写验证点很难实现。

代码侵入:是通过抓取http包获取的流量,不需要再代码中加入埋点。

4 安装

4.1 使用root用户安装(开发和测试环境)

# mkdir -p /Data/apps/gor
# cd /Data/apps/gor
# wget https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0_x64.tar.gz
# tar xvf  gor_1.0.0_x64.tar.gz
开启普通用户也可以取网络权限,默认只有root有权限抓取套接字。(CAP_NET_RAW:允许使用原始套接字,CAP_NET_ADMIN:允许执行网络管理任务)
# setcap "cap_net_raw,cap_net_admin+eip" /Data/apps/gor/gor
建立gor日志目录
# mkdir -p /Data/logs/gor
授权所有用户都可以写
# chmod 777 /Data/logs/gor

4.2 使用root用户安装(生产环境)

生产环境,限制只有root和特定用户组有/Data/apps/gor/gor命令的执行权限。这里只允许root和gor组用户对/Data/apps/gor/gor有执行权限

# mkdir -p /Data/apps/gor
# cd /Data/apps/gor
# wget https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0_x64.tar.gz
# tar xvf  gor_1.0.0_x64.tar.gz
新建gor用户
# useradd gor
设置gor用户密码
# passwd gor
修改/Data/apps/gor/gor用户为root,组为gor
# chown root:gor /Data/apps/gor/gor
只允许root和gor组用户对/Data/apps/gor/gor有执行权限,其他用户没有权限执行/Data/apps/gor/gor命令
# chmod 0750 /Data/apps/gor/gor
开启普通用户也可以抓取网络权限,默认只有root有权限抓取套接字。(CAP_NET_RAW:允许使用原始套接字,CAP_NET_ADMIN:允许执行网络管理任务)
# setcap "cap_net_raw,cap_net_admin+eip" /Data/apps/gor/gor
建立gor日志目录
# mkdir -p /Data/logs/gor
只能gor用户可以写这个目录
# chown gor:gor /Data/logs/gor

4.3 安装其他说明

《使用非root用户运行gor》: https://github.com/buger/goreplay/wiki/Running-as-non-root-user

《cap_net_raw,cap_net_admin说明》: https://blog.csdn.net/mark20170902/article/details/53422384/

《setcap用法》: https://blog.csdn.net/u011294519/article/details/88244391

5 使用

5.1 抓取流量,实时终端显示

–input-raw :8000 表示监听http协议8000端口

–output-stdout 表示输出到终端

–input-raw-track-response 输出相应的http头部和包体信息

[dev@ws1.clevercode.stage.bj1 gor]$ /Data/apps/gor/gor --input-raw :8000 --output-stdout
Version: 1.0.0
1 e5abb903ce128b446bcb2967e3b7dc35c587a607 1557477540775912597
GET /health.json HTTP/1.1
Accept: application/json, application/*+json
User-Agent: Java/1.8.0_51
Host: localhost:8000
Connection: keep-alive

输出相应的http头部和包体信息
[dev@ws1.clevercode.stage.bj1 gor]$ /Data/apps/gor/gor --input-raw :8000 --output-stdout --input-raw-track-response
在这里插入图片描述

5.2 抓取流量到日志文件

5.2.1 录制

timeout 60 表示只录制60秒后程序自动停止 ,这个一定要加上时间限制负责。如果没有时间限制,日志量过大容易把磁盘打满。
–input-raw :8000 表示监听http协议8000端口
–output-file /Data/logs/gor/basepost.gor 表示输出到的录制日志文件位置。
详细说明:https://github.com/buger/goreplay/wiki/Saving-and-Replaying-from-file

1 timeout 60 表示只录制60秒后自动停止 (只记录请求头部)
# nohup timeout 60 /Data/apps/gor/gor --input-raw :8000 --output-file /Data/logs/gor/basepost.gor > /dev/null 2>&1 &
 
2 安装小时切割日志文件,并且开启日志追加模式,不会进行日志默认小分片
# nohup timeout 60 /Data/apps/gor/gor --input-raw :8000 --output-file /Data/logs/gor/basepost-%Y-%m-%d-%H.log --output-file-append > /dev/null 2>&1 &
 
3 安装小时切割日志文件,并且开启日志追加模式,不会进行日志默认小分片,.gz压缩文件格式
# nohup timeout 60 /Data/apps/gor/gor --input-raw :8000 --output-file /Data/logs/gor/basepost-%Y-%m-%d-%H.gz --output-file-append > /dev/null 2>&1 &
 
4 timeout 60 表示只录制60秒后自动停止 (请求头部+响应头部+包体)
# nohup timeout 60 /Data/apps/gor/gor --input-raw :8000 --output-file /Data/logs/gor/basepost.gor --input-raw-track-response > /dev/null 2>&1 &

查看日志文件,可以看到1分钟的录制,它切割成为了很多个小文件,每个文件大小约200K
在这里插入图片描述

5.3.2 回放

方式1:只回放单个文件

# /Data/apps/gor/gor --input-file /Data/logs/gor/basepost_0.gor --output-http "http://localhost:8000"
# /Data/apps/gor/gor --input-file /Data/logs/gor/basepost_1.gor --output-http "http://localhost:8000"
# /Data/apps/gor/gor --input-file /Data/logs/gor/basepost_2.gor --output-http "http://localhost:8000"

方式2:回放多个文件

合并文件
# cat /Data/logs/gor/basepost_*.gor > /Data/logs/gor/basepost.gor
一起回放
# /Data/apps/gor/gor --input-file /Data/logs/gor/basepost.gor --output-http "http://localhost:8000"

方式3:指定测试环境的ip,加上指定的Host。(101.1.21.141:clevercode-test.bj1.info.net ,这加上–output-http-header “Host: intf.clevercode.info.net”,是因为录制的线下流量的日志里面的host是:localhost。但是测试机器上面nginx监听的8000端口需要指定 server_name intf.clevercode.info.net)【测试环境】

合并文件
# cat /Data/logs/gor/basepost_*.gor > /Data/logs/gor/basepost.gor
一起回放
# /Data/apps/gor/gor --input-file /Data/logs/gor/basepost.gor --output-http "http://101.1.21.141:8000" --output-http-header "Host: intf.clevercode.info.net"

5.3 抓流量直接同步到其他机器
timeout 120 录制120s
/Data/apps/gor/gor --input-raw :8000 录制本机器的8000端口
–output-http “http://clevercode-test.bj1.info.net:8000” 输出到目标机器的端口
–output-http-header “Host: intf.clevercode.info.net” header中加入Host信息

实时录制+播放
# sudo timeout 120 /Data/apps/gor/gor --input-raw :8000 --output-http "http://clevercode-test.bj1.info.net:8000" --output-http-header "Host: intf.clevercode.info.net"

6 其他参考资料

《github源码》 : https://github.com/buger/goreplay

《使用goreplay流量回放实践》 : https://www.jianshu.com/p/501218e0beb1

《流量拷贝工具-goreplay介绍》: https://www.wafunny.com/blog/go/goreplay.html

《goreplay 使用经验》: https://yq.aliyun.com/articles/609296

《goreplay-使用真实流量测试你的应用》: https://www.jianshu.com/p/858b5099a193

《携程QA-流量回放系统揭秘》:https://mp.weixin.qq.com/s/qJ9WWW04T_1lNnQkH-_5rw

《rdebug》: https://github.com/didi/rdebug/blob/master/README_zh_CN.md

技术交流

CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!
在这里插入图片描述

  • 5
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Dubbo实现流量录制回放的原理是利用Dubbo提供的拦截器机制,在调用前和调用后对请求和响应进行拦截和处理,将请求和响应的内容保存到磁盘中,然后在回放时读取磁盘中保存的请求和响应内容,再次发送给服务提供者,达到重放请求的目的。 具体来说,Dubbo实现流量录制回放的步骤如下: 1.在Dubbo服务提供者和消费者中配置流量拦截器。Dubbo提供了Filter机制,可以通过实现Filter接口来实现拦截器,拦截器可以在调用前后对请求和响应进行处理。 2.在拦截器中将请求和响应内容保存到磁盘中。可以使用类似于录制日志的方式将请求和响应内容以特定的格式保存到文件中,例如JSON格式或者二进制格式。 3.在Dubbo服务消费者中配置流量回放拦截器。在回放拦截器中读取磁盘中保存的请求和响应内容,并重新发送给服务提供者。 4.在服务消费者中配置Dubbo的路由规则,将请求路由到回放拦截器。 5.启动流量回放服务,监听指定的端口,等待服务消费者发送请求。 6.服务消费者发送请求到回放拦截器,回放拦截器读取磁盘中的请求和响应内容,并将请求发送给服务提供者。 7.服务提供者接收到请求并处理,将响应发送给回放拦截器。 8.回放拦截器将服务提供者的响应返回给服务消费者,完成请求的回放。 通过以上步骤,Dubbo实现了流量录制回放的功能。在实际应用中,可以通过流量回放来验证服务的正确性和稳定性,提高服务的可靠性和安全性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值