HTTP引流神器Goreplay详解【官译】

时间:2021-09-29 06:22:05

0.背景

校验系统的正确性和可靠性时,仅靠用例场景无法覆盖全生产环境下的所有场景,需要一套引流工具,在系统正式上线前,用线上的请求测试待上线系统,在正常请求下,是否有报错;在数倍请求下,系统的性能瓶颈。引流工具有goreplay, tcpcopy等,下面介绍goreplay,原名叫gor,因为其易上手,且功能比较全。

关于

GoReplay是在投入生产之前使用真实流量测试您的应用的最简单和最安全的方式。

随着应用程序的增长,测试所需的工作量也呈指数增长。GoReplay为您提供了重复使用现有流量进行测试的简单想法,这使得它非常强大。我们的先进技术可让您分析和记录您的应用程序流量,而不会对其造成影响。这消除了将第三方组件置于关键路径中带来的风险。

GoReplay增加了您对代码部署,配置更改和基础设施更改的信心。我们有没有提到不需要编码?

这里是基本的工作流程:侦听器服务器捕获http流量并将其发送到重放服务器或保存到文件。重播服务器将流量转发给给定的地址。

HTTP引流神器Goreplay详解【官译】

检查最新的文档

安装

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

入门

最基本的设置将是sudo ./gor --input-raw :8000 --output-stdouttcpdump。如果你已经有测试环境,你可以开始重播:sudo ./gor --input-raw :8000 --output-http http://staging.env:80。如果要保留domain/host,请用:

./goreplay --input-raw :80 --output-http  x.x.x.x:port --http-original-host

有关更多信息,请参阅我们的文档入门页面。

通讯

订阅我们的通讯,随时了解Gor项目的最新功能和变化。

想要升级?

我们创建了一个GoReplay PRO扩展,它提供了其他功能,例如支持Thrift或ProtocolBuffers等二进制协议,从云存储中进行保存和重放,TCP会话复制等.PRO版本还包括适用于商业的许可证,专用支持和它也可以让你支持高质量的开源开发。

问题?

如果您遇到问题,请查看FAQ故障排除 wiki页面。为问题搜索问题也是一个好主意。

所有的错误报告和建议应该通过Github问题或我们的Google小组(您可以发送电子邮件到gor-users@googlegroups.com)。如果您有私人问题,请随时发送电子邮件至support@gortool.com

特约

  1. 把它叉起来
  2. 创建你的功能分支(git checkout -b my-new-feature)
  3. 提交您的更改(git commit -am'添加了一些功能')
  4. 推到分支(git push origin my-new-feature)
  5. 创建新的请求

依赖

要开始使用Gor,您需要在您的机器上运行Web服务器,并且需要终端来运行命令。如果您只是在四处漫游,您可以通过调用快速启动服务器gor file-server :8000,这将启动当前目录在端口上的简单文件服务器8000

安装Gor

https://github.com/buger/gor/releases下载最新的Gor二进制文件(我们为Windows,Linux x64和Mac OS提供预编译的二进制文件),或者您可以自己编译编译

一旦档案被下载并解压缩,您可以从当前目录运行Gor,或者您可能想要将二进制文件复制到您的PATH(可用于Linux和Mac OS /usr/local/bin)。

捕获网络流量

现在在终端中运行这个命令: sudo ./gor --input-raw :8000 --output-stdout

该命令表示监听端口8000上发生的所有网络活动并将其记录到stdout。如果您熟悉tcpdump,我们将实施类似的功能。

您可能会注意到它使用sudo并要求输入密码:要分析网络,Gor需要只有超级用户才能使用的权限。但是,可以将Gor配置为针对非root用户运行

通过http://localhost:8000在浏览器中打开或通过在终端中调用curl来发出一些请求curl http://localhost:8000。您应该看到将gor所有HTTP请求输出到正在运行的终端窗口。请注意,默认GoReplay不会跟踪回复,您可以使用--output-http-track-response选项启用它们。

Gor不是代理人:你不需要将第三方工具放到关键路径上。相反,Gor只是默默地分析你的应用程序的流量,并不影响它。

重播

现在是时候将您的原始流量重放到其他环境。让我们开始使用同一个文件Web服务器,但是在不同的端口上:gor file-server :8001

而不是--output-stdout我们将使用--output-http并提供第二台服务器的URL:sudo ./gor --input-raw :8000 --output-http="http://localhost:8001"

向第一台服务器发出少量请求。你应该看到他们复制到第二个,瞧!

将请求保存到文件并稍后重播

有时候不可能实时重放请求; Gor允许您保存对文件的请求并稍后重播。

首先用它--output-file来保存它们:sudo ./gor --input-raw :8000 --output-file=requests.gor。这将创建新文件并不断向其写入所有捕获的请求。

让我们重新运行Gor,但现在重播来自文件的请求:./gor --input-file requests.gor --output-http="http://localhost:8001"。您应该看到所有记录到第二台服务器的请求,并且它们将以相同的顺序重播,并且与录制的时间完全相同。

基础

概观

Gor架构试图遵循UNIX哲学:所有东西都由管道组成,各种输入将数据复用到输出。

您可以[速率限制](速率限制),[过滤器](请求过滤),[重写](请求重写)请求,甚至使用您自己的中间件来实现定制逻辑。此外,还可以以较高的速率重播请求,以进行[负载测试](保存和从文件中重放)。

可用的输入和输出插件

可用输入:

  • --input-raw - 用于捕获HTTP流量,您应该指定IP地址或接口和应用程序端口。有关捕获和重放流量的更多信息。
  • --input-file- 接受之前使用的文件--output-file。更多关于保存和从文件重播
  • --input-tcp - 如果您决定将来自多个转发器Gor实例的流量转发给它,则由Gor聚合实例使用。阅读关于使用Aggregator-forwarder设置

可用输出:

  • --output-http - 重放HTTP流量到给定的端点,接受基础URL。阅读[关于它的更多信息](重播HTTP流量)
  • --output-file - 记录传入的流量到文件。更多关于保存和从文件重播
  • --output-tcp- 将传入数据转发给另一个Gor实例,并与其一起使用--input-tcp。阅读关于Aggregator-forwarder设置的更多信息。
  • --output-stdout - 用于调试,输出所有数据到stdout。

捕获和重放流量

 

想想Gor更像网络分析器或tcpdump类固醇,它不是代理,不会影响你的应用程序。您指定应用程序端口,它将捕获并重放传入数据。

最简单的设置将是:

#在您想要捕获流量的服务器上运行。你可以在每台“网络”机器上运行它。
sudo gor --input-raw:80 --output-http http://staging.com

它将记录和重放来自同一台机器的流量。但是,当您的Web计算机上的Gor将流量转发到在单独的服务器上运行的Gor聚合器实例时,可以使用Aggregator-forwarder设置

您可能会注意到它需要sudo:分析仅适用于root用户的网络Gor需求权限。但是,可以配置Gor [为非root用户运行beign](以非root用户身份运行)。

转发到多个地址

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

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

分割交通

默认情况下,它会将相同的流量发送到所有输出,但您可以使用选项来平分它(循环) --split-output

gor --input-raw :80 --output-http "http://staging.com"  --output-http "http://dev.com" --split-output true

跟踪回复

默认情况下input-raw不拦截回复,只是请求。您可以使用--input-raw-track-response选项打开回复跟踪。启用时,您将能够访问中间件和中间件中的响应信息output-file

交通拦截引擎

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

sudo gor --input-raw :80 --input-raw-engine "raw_socket" --output-http "http://staging.com"

您可以阅读关于重播HTTP流量的更多信息。

跟踪原始IP地址

您可以使用--input-raw-realip-header选项指定标题名称:如果不是空白,则将具有给定名称和真实IP值的标题注入请求有效内容。通常,这个标题应该被命名为:X-Real-IP,但是你可以指定任何名字。

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

重播HTTP流量

Gor可以使用--output-http选项重播HTTP流量:

sudo ./gor --input-raw:8000 --output-http = “ http://staging.env ”

您可以即时[过滤](请求过滤),[速率限制](速率限制)和[重写](请求重写)请求。

HTTP输出工作者

默认情况下,Gor创建一个动态工作池:它从10开始,并在HTTP输出队列长度大于10时创建更多的HTTP输出工作者。创建的工人数量(N)等于该工作时间的队列长度检查并发现其长度大于10.每次将消息写入HTTP输出队列时都检查队列长度。在产生N名工人的请求得到满足之前,不会再有工人产卵。如果动态工作人员当时不能处理消息,它将睡眠100毫秒。如果动态工作人员无法处理消息2秒钟,则会死亡。您可以使用--output-http-workers=20选项指定固定数量的工人 。

重定向之后

默认情况下,Gor会忽略所有重定向,因为它们是由使用您的应用的客户端处理的,但在重播环境引入新重定向的情况下,您可以像这样启用它们:

gor --input-tcp replay.local:28020 --output-http http://staging.com --output-http-redirects 2

给出的示例将跟随每个请求最多2个重定向。

HTTP超时

默认情况下,http请求和响应的超时时间为5秒。你可以像这样覆盖它:

gor --input-tcp replay.local:28020 --output-http http://staging.com --output-http-timeout 30s

响应缓冲区

默认情况下,为了减少内存消耗,内部HTTP客户端将获取响应主体的最大200kb(在使用中间件时使用),通过使用--output-http-response-buffer选项可增加限制(接受字节数)。

基本身份验证

如果您的开发或登台环境受基本身份验证保护,那么可以在重放期间注入这些凭据:

gor --input-raw :80 --output-http "http://user:pass@staging.com"

注意:这将覆盖原始请求中的任何授权标头。

多域支持

如果你的应用程序接受来自多个域的流量,并且你想保留原始头文件,具体--http-original-host告诉Gor不要触摸Host头文件。

保存并从文件中重放

 

您可以将请求保存到文件,并在稍后重播。重播时将保留请求之间的原始时间差异。如果您在两个请求之间应用[基于百分比的限制](速率限制)时间点,则会适当减少或增加:此方法可开启负载测试等可能性,请参见下文。

#写入文件
gor --input-raw:80 --output-file requests.log #从文件读取
gor --input-file requests.gor --output-http “ http://staging.com ”

默认情况下,Gor以块的形式写入文件。这个可配置的使用--output-file-append选项:刷新的块被附加到存在文件或不附加。默认值是false。默认情况下,--output-file将每个块刷新到不同的路径。

gor ... --output-file%Y%m%d.log
# append false
20140608_0.log
20140608_1.log
20140609_0.log
20140609_1.log

这使并行文件处理变得容易。但是如果你想禁用这种行为,你可以通过添加--output-file-append选项来禁用它:

gor ... --output-file%Y%m%d.log --output-file-append
# append true
20140608.log
20140609.log

如果您多次运行gor并找到现有文件,它将从最后一个已知索引继续。

块大小

您可以使用--output-file-size-limit--output-file-queue-limit选项设置块限制。块队列的长度和每个块的大小。默认值分别是256和32mb。可以使用后缀“k”(KB),“m”(MB)和“g”(GB)output-file-size-limit。如果你只想要大小限制,你可以设置--output-file-queue-limit为0,反之亦然。

gor --input-raw:80 --output-file%Y-%m-%d.gz --output-file-size-limit 256m --output-file-queue-limit 0

在文件名中使用日期变量

例如,您可以告诉每小时创建一个新文件:--output-file /mnt/logs/requests-%Y-%m-%d-%H.log 它将为每个小时创建一个新文件:requests-2016-06-01-12.log,requests-2016-06-01-13.log,...

用作文件名称一部分的时间格式。创建文件时,以下字符将替换为实际值:

  • %Y:包括世纪在内的年份(至少4位数字)
  • %m:一年中的月份(01..12)
  • %d:月中的某天(01..31)
  • %H:一天中的小时,24小时制(00..23)
  • %M:小时(00..59)
  • %S:二分钟(00..60)

默认格式是%Y%m%d%H,每小时创建一个文件。

GZIP压缩

要读取或写入GZIP压缩文件,请确保文件扩展名以“.gz”结尾: --output-file log.gz

从多个文件重播

--input-file接受文件模式,例如:--input-file logs-2016-05-*。GoReplay足够聪明,保持请求的原始顺序。它通过并行读取所有文件并通过时间戳在多个文件之间对请求进行排序来实现。它不会读取内存中的所有文件,而是根据需要在流媒体中读取它们。

缓冲的文件输出

Gor写入文件时拥有内存缓冲区,并持续刷新文件更改。如果缓冲区已满,则每隔1秒强制刷新一次,或者如果Gor关闭,则会发生冲突至文件。您可以使用--output-file-flush-interval选项更改它。大多数情况下它不应该被触及。

文件格式

按原样存储HTTP请求,纯文本:标题和正文。请求按\n