乐趣区

关于后端:回放线上流量利器GoReplay

一. 线上引流产生背景

日常大部分的测试工作都是在测试环境下,通过模仿用户的行为来对系统进行验证,包含性能以及性能。在这个过程中,你可能会遇到以下问题:

  • 用户拜访行为比较复杂,模仿很难和用户行为统一,模仿不够实在。
  • 线下模仿场景无限,会呈现业务笼罩不全的状况。

线上引流计划的呈现为上述问题提供了很好的解题思路,线上引流实质是:通过把线上的实在流量复制到线下环境,解决测试环境模拟不够实在,或笼罩不够全面的问题。

二. 线上引流常见计划

目前不少公司都对线上引流计划进行了许多实际摸索,常见的有以下 4 种引流形式(不限):

上述的几种引流形式各有利弊,有的是须要本人开发相应的工具来反对。而明天给大家
介绍的是另外一款简略易用,学习成本低的引流工具 GoReplay。

三. 举荐一款引流工具:GoReplay

Gor,又称为 GoReplay,是采纳 Golang 编写的一个开源的 HTTP 实时流量复制工具。它只须要在 LB 或者 入口服务器上执行一个过程,就能够把生产环境的流量复制到任何中央,比方 Staging 环境、Dev 环境。罕用于压测及线上问题复现。

注:Golang 是采纳 Gor 实现且开源的,意味着能够不便的集成到本人的架构中,能够用在压力测试平台、实时流量剖析、应用层防火墙等方面。

四. GoReplay 工作流程

上面是 goreplay 官网之前颁布的工作流程图,简略来讲就是 goreplay 捕获线上流量,并将捕捉到的开释到指定测试服务器上。

最新 GoReplay 官网上更新了一张更高逼规格的图解阐明,如下图所示:

上述流程图展现的曾经很具体了,我就不过多解释。

注:Gor 不是代理人,不须要将第三方工具放到要害门路上。相同,Gor 只是默默地剖析你的应用程序的流量,并不影响自身程序。

五. GoReplay 反对的罕用性能

  1. Gor 反对流量的放大和放大、频率限度,这样不须要搭建和生产环境统一的服务器集群也能够正确测试。
  2. Gor 还反对依据正则表达式过滤流量,这意味着能够独自测试某个 API 服务。
  3. Gor 还能够批改 HTTP 申请头,比方替换 User-Agent, 或者减少某些 HTTP Header。
  4. Gor 还能够把申请记录到文件,以备回放和剖析。Gor 反对和 ElasticSearch 集成,将流量存入 ES 进行实时剖析。
  5. 上线前在预公布环境,应用线上实在的申请,查看是否筹备公布的版本,是否具备公布规范。
  6. 压力测试实现后,用线上实在的申请,减速后回放至测试环境,查看是否有报错等问题。
  7. 用线上的流量转发到预公布或测试环境,查看雷同流量下一些指标的反馈状况,查看外围数据是否须要改善。
  8. 等等。

六. 下载安装 GoReplay

顾名思义,GoReplay 是基于 go 语言实现的,要在指标服务器上安装 go 环境。装置参考可见 :https://golang.org/doc/install,筹备好 go 语言环境后,GoReplay 间接提供了编译好的版本,非常不便,间接解压即可,可参考以下步骤:

# 下载包
 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

也能够进入到官网下载地址:https://github.com/buger/gore… 下载最新的 Gor 二进制文件(反对 Windows,Linux x64 和 Mac OS 提供预编译的二进制文件),或者能够自行编译。

获取 gor 版本:
https://github.com/buger/gore…
源码地址:
https://github.com/buger/gore…
官网应用文档:
https://github.com/buger/gor/…

七. GoReplay 常用命令用法

输出参数:
• –input-raw 用于捕捉 HTTP 流量,须要指定 IP 地址或接口和应用程序端口。
• –input-file 接管通过 –output-file 保留流量的文件
• –input-tcp 将多个 Goreplay 实例获取的流量汇集到一个 Goreplay 实例。
输入参数:
• –output-http 重放 HTTP 流量到给定的端点,承受根底 URL。
• –output-file 录制流量时指定的存储文件
• –output-tcp 将获取的流量转移至另外的 Goreplay 实例,并与其一起应用 –input-tcp。
• –output-stdout 用于调试,输入所有数据到 stdout。

• –http-allow-method 依据申请形式过滤。
• –http-allow-url url 白名单,其余申请将会被抛弃。
• –http-disallow-url 遇上一个 url 相同,黑名单,其余的申请会被捕捉到。
输出参数:

  • –input-raw:用来捕获 http 流量,须要指定 ip 地址和端口
  • –input-file:接管流量形式 接管通过 –output-file 保留流量的文件
  • –output-file:保留流量的文件
  • –input-tcp:将多个 Goreplay 实例获取的流量汇集到一个 Goreplay 实例
    输入参数:
  • –output-stdout:终端输入
  • –output-http: 重放 HTTP 流量到给定的端点,承受根底 URL。
  • –output-tcp 将获取的流量转移至另外的 Goreplay 实例,并与其一起应用 –input-tcp。
  • –output-file:录制流量时指定的存储文件
    其它参数:
  • –http-disallow-url : 不容许正则匹配的 URL
  • –http-allow-header : 容许的 Header 头
  • –http-disallow-header: 不容许的 Header 头
  • –http-allow-method: 容许的申请办法,传入值为 GET,POST,OPTIONS 等
  • –input-file-loop: 有限循环,而不是读完这个文件就进行了
  • –output-http-workers: 并发申请数
  • –stats –out-http-stats 每 5 秒输入一次 TPS 数据(查看统计信息)
  • –split-output true: 依照轮训形式宰割流量
  • –output-http-timeout 30s:http 超时 30 秒工夫设置, 默认是 5 秒

八. GoReplay 罕用实际场景

1、流量实时复制引流(–input-raw 拦挡端口配合 –output-http 输入),例如将本机 80 端口的 HTTP 流量实时复制到 targer_server:8080。

gor --input-raw :80 --output-http "http://target_server:8080"

2、控制台输入,获取通过本地 8080 端口的申请流量,而后打印到控制台。

gor --input-raw :8080 --output-stdout

上述命令将监控 8080 端口上所有的流量,并通过终端 stdout 输入。你能够通过浏览器或者 curl 拜访 8080 端口,而后在终端查看 gor 输入所有的 http 申请。

3、先录制后回放,将捕获流量保留到文件中,而后开释到其它机器,有时候实时同步流量是很难做到的, 所以 Goreplay 提供了这种先保留后回放的模式:
第一步, 通过 –output-file 保留流量:

gor --input-raw :8080 --output-file=requests.gor

上述命令将 8080 端口的流量,保留到 requests.gor 文件中 (必须是.gor 后缀,其它后缀经测开释时有问题)。
第二步, 回放保留的流量:

gor --input-file requests.gor --output-http="http://localhost:8081"

上述命令将开释所有保留在 requests.gor 中的申请通过雷同的工夫程序开释到服务器 http://localhost:8081

4、过滤指定申请办法,如果指标服务器应用的库与线上机器一样,且只须要引流 Get 办法的申请。

gor --input-raw :80  --http-allow-method GET --output-http "http://target_server:8080"

5、申请过滤,当你须要捕获指定门路的申请流量时,能够应用该机制,如只同步 /api 门路下的申请

gor --input-raw :8080 --output-http staging.com --http-allow-url /api

只收集申请头中合乎 api-version 为 1.0x 的申请
gor --input-raw :8080 --output-http staging.com --http-allow-header api-version:^1\.0\d

6、限速机制,因为生产服务器配置个别远高于测试服务器配置,所以间接将生产服务器全副流量同步到测试服务器是不可行的,goreplay 提供了两种策略:
a. 限度每秒的申请数

gor  --input-tcp :28020 --output-http "http://staging.com|10"# (每秒申请数限度 10 个以内)

gor  --input-raw :80 --output-tcp "replay.local:28020|10%"  # (每秒申请数限度 10% 以内)

b. 基于 Header 或 Url 的参数限度一些申请,为指定的 header 或者 url 的申请设定限度的百分比。

gor  --input-raw :80 --output-tcp "replay.local:28020|10%" --http-header-limiter "X-API-KEY: 10%"

gor  --input-raw :80 --output-tcp "replay.local:28020|10%" --http-param-limiter "api_key: 10%"

7、流量加压,当须要对线上服务进行整体性能压测时,可将线上申请扩充 N 倍,进行引流,将申请扩充 1 倍,也可放大,调整 ”|” 前面的百分比即可。

gor --input-raw :80  --http-allow-method GET --output-http "http://target_server:8080|200%"

8、只复制某个 URL 申请,–http-allow-url 参数,-http-allow-url 参数可用正则表达式(–output-http-url-regexp 在 gor 0.16 曾经过期,应用 –http-allow-url 代替)。

gor --input-raw :8080 --http-allow-method GET --output-http "http://target_server:8080" --http-allow-url mall.*hotword

9、多指标服务器的流量复制引流,有点相似 nginx 的 mirror。

gor --input-raw :80 --output-http "http://target_server:8080" --output-http "http://target_server2:8080"

10、将流量转发到多个端点,默认状况下,它会将雷同的流量发送到所有输入。

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

11、将雷同的流量发送到多个站点,并且平分所有流量。

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

12、HTTP 超时,默认状况下,http 申请和响应的超时工夫为 5 秒。你能够像这样笼罩它:

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

13、根本身份验证,如果您的开发或登台环境受根本身份验证爱护,那么能够在重放期间注入这些凭据:

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

14、性能压力测试,能够将流量复制到文件,而后再对他们进行回放。回放的时候,流量会维持原始的工夫距离。如果你应用了百分比来进行速率限度,那么回放的速率会相应的减少或缩小。有了这种速率限度,gor 就能够用来进行压力测试。

gor --input-file "requests.gor|200%" --output-http "staging.com"

目前,input-file 仅在应用基于百分比的限制器时才反对此性能。与默认限制器不同 input-file,它不会升高申请速度,而会减慢速度或减速申请发射。

15、录制与回放

./gor --input-raw :8000 --output-file=requests.gor

执行录制命令后,将会创立新文件并一直向其写入所有捕捉的申请。

16、流量回放,重播来自文件的申请。

./gor --input-file requests.gor --output-http="http://localhost:8001"

您应该看到所有记录到 http://localhost:8001 的申请,并且它们将以雷同的程序重播,并且与录制的工夫完全相同。

GoReplay 更多用法可参考官网文档:https://github.com/buger/gore…

转载 https://developer.aliyun.com/…

关注 获取更多好文

本文由 mdnice 多平台公布

退出移动版