[转帖]回放线上流量利器-GoReplay

回放,流量,利器,goreplay · 浏览次数 : 0

小编点评

**GoReplay 常用实践场景** **1. 流量实时复制引流** ``` gor --input-raw :8080 --output-http \"http://target_server:8080\"2 ``` **2. 前往保存后回放** ``` gor --input-file requests.gor --output-http=\"http://localhost:8081\" ``` **3. 基于Header或Url的参数限制请求** ``` gor --input-raw :80 --output-tcp \"replay.local:28020|10%\" --http-header-limiter \"X-API-KEY: 10%\" ``` **4. 流量加压** ``` gor --input-raw :80 --http-allow-method GET --output-http \"http://target_server:8080|200%\"8 ``` **5. 多目标服务器的流量复制引流** ``` gor --input-raw :80 --output-http \"http://target_server:8080\" --output-http \"http://target_server2:8080\"10 ``` **6. 性能压力测试** ``` gor --input-raw :80 --output-http \"http://staging.com\" --output-http-timeout 30s13 ``` **7.基本身份验证** ``` gor --input-raw :80 --output-http \"http://user:pass@staging.com\"14 ```

正文

https://www.cnblogs.com/Chary/p/16829396.html

 

一. 线上引流产生背景

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

  • 用户访问行为比较复杂,模拟很难和用户行为一致,模拟不够真实。
  • 线下模拟场景有限,会出现业务覆盖不全的情况。

线上引流方案的出现为上述问题提供了很好的解题思路,线上引流本质是:通过把线上的真实流量复制到线下环境,解决测试环境模拟不够真实,或覆盖不够全面的问题。

二. 线上引流常见方案

目前不少公司都对线上引流方案进行了许多实践探索,常见的有以下4种引流方式(不限):

alt

上述的几种引流方式各有利弊,有的是需要自己开发相应的工具来支持。而今天给大家 介绍的是另外一款简单易用,学习成本低的引流工具GoReplay。

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

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

注:Golang 是采用Gor 实现且开源的,意味着可以方便的集成到自己的架构中,可以用在压力测试平台、实时流量分析、应用层防火墙等方面。

四. GoReplay工作流程

下面是goreplay官方之前公布的工作流程图,简单来讲就是goreplay捕捉线上流量,并将捕捉到的释放到指定测试服务器上。

alt

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

alt

上述流程图展示的已经很详细了,我就不过多解释。

注: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/goreplay/releases下载最新的Gor二进制文件(支持Windows,Linux x64和Mac OS提供预编译的二进制文件),或者可以自行编译。

获取gor版本: https://github.com/buger/goreplay/releases 源码地址: https://github.com/buger/goreplay 官方使用文档: https://github.com/buger/gor/wiki

七. 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/goreplay/wiki/Getting-Started

转载 https://developer.aliyun.com/article/936247

与[转帖]回放线上流量利器-GoReplay相似的内容:

[转帖]回放线上流量利器-GoReplay

https://www.cnblogs.com/Chary/p/16829396.html 一. 线上引流产生背景 日常大部分的测试工作都是在测试环境下,通过模拟用户的行为来对系统进行验证,包括功能以及性能。在这个过程中,你可能会遇到以下问题: 用户访问行为比较复杂,模拟很难和用户行为一致,模拟不够

[转帖]自动化回归测试工具 —— AREX 上手实践

https://my.oschina.net/arextest/blog/8589156 AREX 是一款开源的自动化测试工具平台,基于 Java Agent 技术与比对技术,通过流量录制回放能力实现快速有效的回归测试。同时提供了接口测试、接口比对测试等丰富的自动化测试功能,无需编程能力也可快速上手

[转帖]Cat导致内存不足原因分析

背景 线上几亿的数据在回刷的时候容器服务会出现OOM而重启,导致任务中断 内存泄露分析 jmap -histo pid 找出了有几十亿的java.lang.StackTraceElement对象,找不到被谁引用了 jmap -dump:format=b,file=heapdump.hprof pid

[转帖]命令行窗口下重复执行shell命令

1、命令操作录制和回放 #script -t 2> timing.log -a output.session # 开始录制 #scriptreplay timing.log output.session #回放 2、操作终端共享 通过管道来传输信息实现。需要一个pipe文件,并在需要展示的终端打开这

[转帖]RabbitMQ 消费者回执和发布确认

为了保证数据安全,消费者和生产者的回执(ack)都是非常重要的。 由于我们无法保证消息都能像我们期望的那样,正常到达另一端或者被 Consumer 消费成功。因此,publisher 和 consumer 都需要一种机制,来确保消息投递成功了和消息消费成功了。 在 AMQP 0-9-1 中,消费者处

[转帖]UseG1GC垃圾回收技术解析

https://www.cnblogs.com/yuanzipeng/p/13374690.html 介绍 G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用。G1收集器是工作在堆内不同分区上的收集器,分区既可以是年轻代也可以是老年

[转帖]新一代垃圾回收器ZGC的探索与实践

1. 引入 1.1 GC之痛 很多低延迟高可用Java服务的系统可用性经常受GC停顿的困扰。GC停顿指垃圾回收期间STW(Stop The World),当STW时,所有应用线程停止活动,等待GC停顿结束。以美团风控服务为例,部分上游业务要求风控服务65ms内返回结果,并且可用性要达到99.99%。

[转帖]一代更比一代强!一文带你回顾DDR内存的前世今生

根据冯诺·依曼结构,计算机中要有存储器。所以直到今天,内存和硬盘仍然在电脑中占有非常重要的地位。与大容量的硬盘不同,内存在存取速度上有着非常惊人的表现,但是断电后又不能保存存入的信息。因此在电脑硬件长期的发展过程中,内存一直扮演着中转站的角色。和其他硬件一样,内存遵循着摩根定律,从最远古的SIMM到

[转帖]JVM(3)之垃圾回收(GC垃圾收集器+垃圾回收算法+安全点+记忆集与卡表+并发可达性分析......)

《深入理解java虚拟机》+宋红康老师+阳哥大厂面试题2总结整理 一、堆的结构组成 堆位于运行时数据区中是线程共享的。一个进程对应一个jvm实例。一个jvm实例对应一个运行时数据区。一个运行时数据区有一个堆空间。 java堆区在jvm启动的时候就被创建了,其空间大小也就被确定了(堆是jvm管理的最大

[转帖]jvm学习一-垃圾回收算法

1 复制算法:新生代(MinorGC) 复制->清空->互换。 复制:当伊甸区满的时候会触发第一次gc,把还活着的对象拷贝到from区,当eden区再次触发gc的时候会扫描eden和from两个区进行垃圾回收,经过这次,回收还存活的对象进入to区或者老年代(年龄>=15)。同时把这些对象年龄+1 清