GoReplay——流量复制、重放和负载测试

前言

1、功能开发完成之后,我们怎样在上线前复制线上的流量来进行测试(检验功能正确性)?
2、怎样对我们的服务进行压力测试(检验负载能力)?
针对上面两个问题,下面将向大家介绍一款非常简单好用的开源网络工具:GoReplay

简介

官方产品定位

GoReplay is an open-source network monitoring tool which can record your live traffic, and use it for shadowing, load testing, or detailed analysis and monitoring.
GoReplay是一个开源网络监视工具,可以记录您的实时流量,并将其用于影子,负载测试或详细的分析和监视。

Move fast without breaking things
快速行动而不会破坏事物。
随着应用程序的增长,测试它所需的工作也呈指数增长。GoReplay为您提供了一个简单的想法,可以重用现有流量进行测试,从而使其功能异常强大。我们先进的技术可让您分析和记录您的应用程序流量,而不会对其造成影响。这消除了将第三方组件置于关键路径中所带来的风险。

GoReplay增强了您对代码部署,配置和基础架构更改的信心。

GoReplay提供了独特的影子处理方法。后台GoReplay不再是代理,而是侦听网络接口上的流量,无需更改生产基础结构,而是在与服务相同的计算机上运行GoReplay守护程序。

安装

从https://github.com/buger/goreplay/releases下载最新的二进制文件或自己编译

操作

官方使用文档: https://github.com/buger/goreplay/wiki

参数解释

--input-raw      # 用来捕捉http流量,需要指定ip地址和端口
--input-file     # 接收通过--output-file保存流量的文件
--input-tcp      # 将多个 Goreplay 实例获取的流量聚集到一个 Goreplay 实例
--output-stdout  # 终端输出
--output-tcp     # 将获取的流量转移至另外的 Goreplay 实例
--output-http    # 流量释放的对象server,需要指定ip地址和端口
--output-file    # 录制流量时指定的存储文件

捕获和重放流量

  • 重播HTTP流量
sudo ./gor --input-raw:8000 --output-http = "http://staging.com"

也可以将流量转发到多个端点。

sudo ./gor --input-tcp :28020 --output-http "http://staging.com"  --output-http "http://dev.com"

如果您的开发或暂存环境受“基本身份验证”保护,则可以在重播期间注入这些凭据:

sudo ./gor --input-raw :80 --output-http "http://user:pass@staging.com"
  • 流量分割

默认情况下,它将向所有输出发送相同的流量,但是您可以选择使用--split-output选项将其平均分配(循环) 。

sudo ./gor --input-raw :80 --output-http "http://staging.com"  --output-http "http://dev.com" --split-output true
  • 追踪回应

默认情况下,input-raw不截取响应,仅截取请求。 您可以使用–input-raw-track-response选项打开响应跟踪。 启用后,您将能够访问中间件和输出文件中的响应信息。

  • 流量拦截引擎

默认情况下,Gor将libpcap用于拦截流量,它在大多数情况下应该可以使用。如果您有任何麻烦,可以尝试使用替代引擎:raw_socket

sudo ./gor --input-raw :80 --input-raw-engine "raw_socket" --output-http "http://staging.com"
  • 跟踪原始IP地址

您可以使用--input-raw-realip-headeroption指定标头名称:如果不为空,则将具有给定名称和真实IP值的标头注入请求有效负载。通常,此标头应命名为:X-Real-IP,但您可以指定任何名称。

sudo ./gor --input-raw :80 --input-raw-realip-header "X-Real-IP" ...

限速

如果仅想转发部分传入流量(例如,不使测试环境超载),则速率限制将非常有用。有两种策略:丢弃随机请求或基于标头或URL参数值丢弃请求的一部分。

  • 删除随机请求

每个输入和输出都支持随机速率限制。有两种限制算法:基于绝对值或百分比。

绝对值:如果当前秒达到指定的请求限制-忽略其余部分,则在下一秒计数器重置。

百分比:对于输入文件,它将减慢或加快请求的执行,对于其余文件,它将使用随机生成器根据您指定的机会来决定是否通过请求。

您可以使用“ |”指定所需的限制 服务器地址后面的运算符,请参见下面的示例。

使用绝对数限制重播
# staging.server will not get more than ten requests per second
sudo ./gor --input-tcp :28020 --output-http "http://staging.com|10"
使用基于百分比的限制器限制监听器
# replay server will not get more than 10% of requests 
# useful for high-load environments
sudo ./gor --input-raw :80 --output-tcp "replay.local:28020|10%"
  • 基于Header或URL参数值的一致限制

如果您在Header或URL中存储了唯一的用户ID(例如API密钥),则可以仅针对该用户的一部分持续转发指定的流量百分比。基本公式如下:FNV32-1A_hashing(value) % 100 >= chance。例子:

# Limit based on header value
sudo ./gor --input-raw :80 --output-tcp "replay.local:28020|10%" --http-header-limiter "X-API-KEY: 10%"

# Limit based on header value
sudo ./gor --input-raw :80 --output-tcp "replay.local:28020|10%" --http-param-limiter "api_key: 10%"

当基于Header或参数进行限制时,仅支持基于百分比的限制。

实践

首先下载GoReplay的二进制文件(gor)到Linux上(存放目录无限制,建议导出的请求数据也放到数据盘上)

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

监听8000端口,导出对应的请求数据包

sudo ./gor --input-raw :8000 --output-file=/data/gor_req_data/xxx_requests.gor

监听8000端口,直接将请求复制到http://test.xxx.com,并控制转发速率为原来的10%,也可以使用“|10”这种绝对值方式控制每秒最多转发10个请求。

sudo ./gor --input-raw :8000 --output-http="http://test.xxx.com|10%"

从导出的请求数据包中,复制请求到对应URL。(“|1000%”表示重放速度为原来的10倍,也可以使用绝对值控制QPS)

sudo ./gor --input-file "/data/gor_req_data/xxx_requests.gor|1000%" -input-file-loop --output-http="http://test.xxx.com"

注意事项

1、不可重放流量到正式服上,以免造成访问压力或导致数据被访问修改。

2、从线上正式服导数据导测试服时,要监控下服务器健康状况,发现有问题要及时关掉。虽然官方说不会对服务造成影响,还是要谨慎关注下,非必要情况少操作。

3、平时可以导出一些请求流量包,拷贝到测试服进行重放测试,这样可以减少对线上服务试试复制的影响。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值