简介:

测试 HTTP 服务,为了覆盖更多的场景,可以考虑录制线上流量,在测试环境进行重放。之前用 tcpcopy 比较多,最近遇到一些需求,需要在 HTTP 层做一些过滤,例如只录制指定 URL 的请求。

经过调研,发现 goreplay,其前称是 gor,很适合这个场景,有以下优点。

  1. 支持 HTTP 请求的录制和重放,可以在线上录制请求,在测试环境进行重放。
  2. 支持 HTTP 层面的流量过滤,可以只挑选我们感兴趣的流量。
  3. 支持请求放大,用于性能测试。

1. 用法

免 root 运行,抓包并不需要 root 权限,同样的方法适用于 tcpdump,其实 goreplay 和 tcpdump 一样,都用 libpcap 来抓包。

$ sudo setcap "cap_net_raw,cap_net_admin+eip" ./goreplay

抓取 80 端口的 HTTP 请求,只抓请求 URL 是 /api/v1 的,并输出到终端。这个比 tcpdump 更直观,打印到终端的是我们熟悉的 HTTP 协议。

第一行是 goreplay 自定义的 header,平常使用可以不必理会,不是实际抓到的包,从第二行开始才是实际抓到的包。

$ ./goreplay --input-raw :80 --http-allow-url '/api/v1' --output-stdout

抓取 80 端口的所有请求,并保存到文件。实际会分批保存为 request_0.gor,request_1.gor 这种文件名。

$ ./goreplay --input-raw :80 --output-file 'request.gor'

重放请求,例如 host2.com 是我们的新机房域名。这种重放,会根据请求的时间戳,按照抓取时的请求顺序重放。

例如抓取的时候,第一秒 10 个请求,第二秒 20 个请求,那么重放的时候,也会按照这个顺序。并且读完 request.gor 文件,就会停止。

上面我们看到了 goreplay 自定义的 header,其第三个字段,是一个纳秒级的时间戳,根据这个来保证重放的顺序和速率。

$ ./goreplay --input-file 'request.gor' --output-http 'http://host2.com'

如果是性能测试,可以不考虑请求的顺序和速率,并且要求无限循环。

# --input-file 从文件中获取请求数据,重放的时候 100x 倍速# --input-file-loop 无限循环,而不是读完这个文件就停止# --output-http 发送请求到 http://host2.com# --output-http-workers 并发 100 发请求# --stats --output-http-stats 每 5 秒输出一次 TPS 数据

$ ./goreplay --input-file 'request.gor|10000%' --input-file-loop --output-http 'http://host2.com' --output-http-workers 100 --stats --output-http-stats

更多的命令行参数及用法,可以查看 goreplay 源码的 settings.go 文件。

2. 坑

  1. 如果 HTTP 请求不符合规范,可能会抓不到包。遇到过 HTTP 请求头里面的 Content-Length 不等于实际的 Body 大小,goreplay 认为其请求未结束。
  2. input-file 是单 goroutine 在跑,会有性能瓶颈。测试的时候,读取的 RPS 在 1.7w - 1.8w 左右,如果压测需求大于这个,需要开多个进程同时跑。

3. 深入

goreplay 是用 golang 编写的,抓包的时候调用 gopacket,后者通过 cgo 来调用 libpcap。从编译开始,从源码层面学习一下其实现。

TL;DR

3.1 编译

由于 goreplay 使用了第三方 C 代码,不能使用 Go 的交叉编译功能来跨平台编译。只能在 Linux 下编译 Linux 使用的可执行文件。

在 Redhat 系发型版下,可以使用 yum 来安装依赖。

$ sudo yum install libpcap libpcap-devel

或者从源码编译 libpcap。

# 安装依赖

$ sudo yum install gcc flex byacc bison

$ wget http://www.tcpdump.org/release/libpcap-1.8.1.tar.gz && tar xzf libpcap-1.8.1.tar.gz

$ cd libpcap-1.8.1

$ ./configure

$ sudo make install

cd 到 goreplay 的源码目录,执行命令。

# 纯静态编译

$ go build -ldflags '-extldflags "-static"'

如果编译成功,在当前目录会生成一个 goreplay 文件,试运行一下。

[vagrant@localhost goreplay]$ ./goreplay

Version:

2021/09/23 08:18:22 Required at least 1 input and 1 output

不依赖任何库。

[root@localhost goreplay]$ ldd goreplay

not a dynamic executable

一个合法的可执行文件。

[root@localhost goreplay]$ file goreplay

goreplay: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=e334de401c00057ca56a33c0136dc5c86debee61, not stripped

如果遇到以下编译错误。

[root@localhost goreplay]$ go build -ldflags '-extldflags "-static"'# github.com/buger/goreplay

/e/vagrant/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1

/usr/bin/ld: cannot find -lpthread

/usr/bin/ld: cannot find -lc

collect2: error: ld returned 1 exit status

需要安装 glibc 的静态库。

$ sudo yum install glibc-static.x86_64

如果不是通过 go get 来获取 goreplay,而是通过 git clone 下来的,那么会缺少一些第三方库的依赖,通过 go get 命令补充就好。

$ go get github.com/Shopify/sarama

3.2 input 和 output

input 和 output 是 goreplay 对数据流的抽象,在源码目录有很多 input_xxx.go 和 output_xxx.go,实现了 goreplay 的核心功能。

在启动的时候,会解析命令行参数中指定的 input 和 output,接着启动 emitter,从 input 中读数据,写到 output 中。

emitter.go 中核心代码如下:

for _, in := range Plugins.Inputs {

go CopyMulty(in, Plugins.Outputs...)

}

多个 input 之间是并行的,但单个 input 到多个 output,是串行的。所有 input 都实现了 io.Reader 接口,output 都实现了 io.Writer 接口。所以阅读代码时,input 的入口是 Read() 方法,output 的入口是 Write() 方法。

3.3 UDP 抓包

抓包是核心功能,也算是一种 input 的类型。不过 goreplay 的实现中,实现上和 HTTP 协议绑定的很死。我参考 goreplay 的代码,实现了 goreplay-udp,用法上和 goreplay 保持一致

流量回放工具gor使用经验相关推荐

  1. 流量回放工具之 Goreplay 安装及初级使用

    文章目录 一.Goreplay 介绍 二.Golang环境安装 三.Goreplay 安装 四.Goreplay 使用示例 1.准备 RESTful API 环境 2.捕获服务器一流量保存到本地文件 ...

  2. Doom流量回放工具导致的测试环境服务接口无响应的排查过程

    Doom流量回放工具导致的测试环境服务接口无响应的排查过程 现象描述: a)部分接口(A组接口)无响应 b)部分接口(B组接口)正常响应 c)还有一部分接口(C组接口),场景1无响应,场景2正常响应 ...

  3. 流量回放工具:goreplay实战

    相信做性能测试的小伙伴们一定听说过流量复制回放,没听说过也没关系,我们大都是在性能测试环境完成压测任务出具性能测试报告, 但是实际生产环境的接口压力流量往往和我们在性能测试环境预估的情况不完全一致,甚 ...

  4. 流量复制工具gor使用简介

    gor安装部署: 环境分配: 192.168.199.185 模拟线上环境 192.168.199.186模拟测试环境 192.168.199.187流量复制辅助服务器 现在要做的是把到192.168 ...

  5. 流量回放开源代码Java_流量回放框架 jvm-sandbox-repeater 的实践

    一. 前言 你是否和我一样遇到过以下的问题? 1)服务重构,一堆接口需要回归,让人头疼 2)每次迭代,都要花很多精力来进行回归测试 3)线上 bug,线下复现不了 4)接口自动化用例写辛苦,维护更辛苦 ...

  6. 流量回放框架jvm-sandbox-repeater的实践

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net 一. 前言 你是否和我一样遇到过以下的问题? 1)服 ...

  7. java化测试神器-流量回放平台

    # java化测试神器-流量回放平台 作者:佳晖,荣荣 文章结构 基本介绍 使用流程 实现方案 总结 基本介绍 背景 目前公司正在进行php java化迁移工作. Java化测试本质上是一次回归工作. ...

  8. php 压测流量回放,Web流量复制和压力测试工具Gor

    Gor概述 Gor 是用 Golang 写的一个 HTTP 实时流量复制工具.只需要在 LB 或者 Varnish 入口服务器上执行一个进程,就可以把生产环境的流量复制到任何地方,比如 Staging ...

  9. Gor 简单易用的流量回放及复制工具

    基本介绍 Gor 是一款go语言实现的简单的http流量复制工具,它的主要目的是使你的生产环境HTTP真实流量在开发环境和语言预演环境(staging  server)重现. 工具使用非常简单,只需要 ...

最新文章

  1. 【加】德鲁·卡宾森 - 质量效应3:天罚(2013年6月26日)
  2. jsonArray转换成List
  3. 新BOJ 87. 日期
  4. 普通 项目打包包含第三方jar包
  5. 1006 换个格式输出整数 (15 分)
  6. 谷歌浏览器78如何安装拓展程序
  7. 吴恩达 神经网络和深度学习 第一课 第三周 (代码)planar data classify
  8. nlp论文-《Neural Machine Translation by Jointly Learning to Align and Translate》-基于联合学习对齐和翻译的神经机器翻译(一)
  9. python经典程序实例-Python3经典100例(③)
  10. Maven修改默认JDK
  11. EasyObjects.Net
  12. SpringBoot中多种Filter配置方式
  13. Cognitive Surplus 认知盈余
  14. 生不出孩子怪天气?驳《我国工业软件失去的30年》一文 | 凌云时刻
  15. Excel怎么实现多列数据排列组合
  16. incre在c语言,longest incresing sequence
  17. c语言变量赋值字母,C语言变量定义和赋值
  18. 浙大竺可桢学院混合班计算机专业,起底黄峥毕业的浙大混合班:学霸不算牛 个个是学神...
  19. 流量不清零、可转赠,对运营商未必是坏事
  20. matlab画三维曲面有范围,matlab画三维曲面

热门文章

  1. 运放相位裕度的认识与理解
  2. 价值观的遐想---《价值观的力量——Ebay前任CEO梅格惠特曼自传》读后感
  3. Codeforces Gym 102956 C. Brave Seekers of Unicorns(位运算 + dp)
  4. 反向延长线段什么意思_平抛运动的规律为什么t时刻速度反向延长线与x轴..._报检水平_帮考网...
  5. 知乎上50个负能量段子,看完整个人都神清气爽
  6. 图像处理中的窗口、核算子、模板、结构、卷积核、高斯核、锚点究竟是什么东西?
  7. for 循环中for each 使用方法
  8. 数字孪生制造:数字孪生技术在制造业可视化中的实践与挑战
  9. 批量上传图片(文件)
  10. 解决Springboot 项目启动时,出现大量CONDITIONS EVALUATION REPORT的问题