使用goreplay流量回放实践

0.666字数 548阅读 1224

What

关于goreplay
首先什么是goreplay?
参照官方介绍

GoReplay is the simplest and safest way to test your app using real traffic before you put it into production.

GoReplay提供了重用现有流量进行测试的简单想法。
大致工作流程如下:


goreplay.png

简单来说就是goreplay抓取线上真实的流量,并将捕捉到的流量转发到测试服务器上

When

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

  • Case 1
    上线前在预发布环境,使用线上真实的请求,检查是否准备发布的版本,是否具备发布标准
  • Case 2
    压力测试完成后,用线上真实的请求,加速后回放至测试环境,检查是否有报错等问题
  • Case 3
    abtest
    用线上的流量转发到预发,检查相同流量下一些指标的反馈情况,检查核心数据是否有改善、优化
    等等
    具体case还需要根据自己的需求,灵活改变。

How

上面大致说了goreplay是什么以及什么场景可以用,下面记录一下自己的实践过程。
首先需要线上服务器root权限,这个需要谨慎使用!!!

1.下载安装goreplay

参照文档,这一步很简单

wget [https://github.com/buger/goreplay/releases/download/v1.0-rc2/gor_1.0-RC2_x64.tar.gz](https://github.com/buger/goreplay/releases/download/v1.0-rc2/gor_1.0-RC2_x64.tar.gz)
tar xvf gor_1.0-RC2_x64.tar.gz

2.一些常用的命令

-input-raw 抓取指定端口的流量 gor --input-raw :8080
-output-stdout 打印到控制台
-output-file 将请求写到文件中 gor --input-raw :80 --output-file ./requests.gor
-input-file 从文件中读取请求,与上一条命令呼应 gor --input-file ./requests.gor
-exit-after 5s 持续时间
-http-allow-url url白名单,其他请求将会被丢弃
-http-allow-method 根据请求方式过滤
-http-disallow-url 遇上一个url相反,黑名单,其他的请求会被捕获到

实践一下

  • 捕获2051端口的请求打印到控制台
    隐藏了部分敏感信息
sudo ./gor --input-raw :2051 --output-stdout

Version: 1.0-RC2
1 45aea8cbxxxxxxx61a7600f384b263bb49dd60 1551432827638974877
POST /absoxxxxlar HTTP/1.1
Host: inner-xxxxxxxx.com
Accept: */*
Content-Length: 259
Content-Type: application/x-www-form-urlencoded

{"page":1,"count":10,"group":"exp_xxxxxr08","content_id":"77769a95f43438xxxx7f2e82c742","uid":"69xxxx68","device_code":"86093xxxxx2318","register_timestamp":1xxxxx75,"sex":0,"channel":"bxxxu","flavor":"","fancy":"","district":"\u5b81\u6ce2\u5e02"}
1 1944f453259c95c1cc8b4cf1227104ed791c428c 1551432827642028761
POST /sixxxxxlar HTTP/1.1
Host: inner-xxxxxx.com
Accept: */*
Content-Length: 259
Content-Type: application/x-www-form-urlencoded

{"page":1,"count":10,"group":"expxxxx07","content_id":"9142a79e98b7xxxxxa67eaecd9de1","uid":"98xxxxx459","device_code":"868xxxx34136943","register_timestamp":15xxxx5663,"sex":2,"channel":"gdt79","flavor":"","fancy":"","district":"\u8861\u9633\u5e02"}
1 28e10318f1d512f4e57b583aec4457e25daaadb6 1551432827657153296
POST /abxxxxxilar HTTP/1.1
Host: inner-xxxxxxxx.com
Accept: */*
Content-Length: 260
Content-Type: application/x-www-form-urlencoded
  • 将请求保存到本地文件中
sudo ./gor --input-raw :2051 --http-allow-url /recommend_you_like --output-file ./recommend_you_like.gor
只筛选recommend_you_like接口的请求,保存在本地文件中

这边实际上是两个实践
第一个:保存流量到文件
第二个:抓取置顶url的流量
截图可以看到生成了一个文件


reuqest.gor.png
  • 转发文件中流量至测试环境
sudo ./gor --input-file ./recommend_you_like_0.gor --output-http="http://172.1.1.1:2051"

至测试环境的服务器上,查看日志可以到流量已经转发过来

性能测试

image.png
sudo ./gor --input-file “./recommend_you_like_0.gor|200%” --output-http="http://172.1.1.1:2051"

将请求以2倍的速度发出去
同时也支持限速
10% 20%等
关于限速还有另一种方法——指定每秒的请求数


limit.png
sudo ./gor --input-file “./recommend_you_like_0.gor” --output-http="http://172.1.1.1:2051|50"

更多参考官方文档:https://github.com/buger/goreplay/wiki/Getting-Started

推荐阅读更多精彩内容