php 流量回放,使用goreplay流量回放实践

What

关于goreplay

首先什么是goreplay?

参照官方介绍

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

GoReplay提供了重用现有流量进行测试的简单想法。

大致工作流程如下:

501218e0beb1

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的流量

截图可以看到生成了一个文件

501218e0beb1

reuqest.gor.png

转发文件中流量至测试环境

sudo ./gor --input-file ./recommend_you_like_0.gor --output-http="http://172.1.1.1:2051"

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

性能测试

501218e0beb1

image.png

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

将请求以2倍的速度发出去

同时也支持限速

10% 20%等

关于限速还有另一种方法——指定每秒的请求数

501218e0beb1

limit.png

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