一. 引流测试产生背景

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

  • 用户访问行为比较复杂,模拟很难和用户行为一致,模拟不够真实;

  • 线下模拟场景有限,会出现业务覆盖不全的情况。

引流测试的出现就是为了解决以上问题,它的本质是:通过把线上的真实流量复制到线下环境,解决测试环境模拟不够真实,或覆盖不够全面的问题。

二. 引流测试常见方案

目前不少公司对引流测试进行了实践探索,常见的有以下4种引流方式(不限):

引流方式 实现方式 优点 缺点
Nginx层流量复制 安装lua-nginx-module、ngxdevelkit、headers-more-nginx-module模块,通过lua脚本实现把请求复制给测试环境。 安装和部署还较为简单。 需要开发lua脚本,且对资源有一定占用。
基于业务代码层的引流 将业务代码的调用封装成请求对象,异步的写入缓存中。引流工具通过读缓存中的请求,向测试环境发起请求。 扩展性好,可定制化高。 需要开发流量复制工具,工作量较大,且对工作本身的性能要求较高。
基于访问日志回放 线上系统记录访问日志,引流工具通过解析日志,向测试环境发起请求。 离线方式,对线上影响小。 需要开发日志解析工具,且解析的开销会较大。
基于TCP/IP层的引流 目前已开源的工具有TcpCopy 安装、部署使用都较为简单。 仅适合无状态的业务,且对业务请求需要进行过滤。

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

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

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

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

四. Gor工作流程

监听服务器捕获http流量并将其发送到重放服务器或保存到文件,重播服务器将流量转发给给定的地址。

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

五. Gor支持的常用功能

1、Gor 支持流量的放大和缩小、频率限制,这样不需要搭建和生产环境一致的服务器集群也可以正确测试。

2、Gor 还支持根据正则表达式过滤流量,这意味着可以单独测试某个 API 服务。

3、Gor还可以修改 HTTP 请求头,比如替换 User-Agent, 或者增加某些 HTTP Header 。

4、Gor 还可以把请求记录到文件,以备回放和分析。Gor 支持和 ElasticSearch 集成,将流量存入 ES 进行实时分析。

六. Gor 下载安装

官网下载地址: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

七. Gor 常用命令用法

可用输入:

  • --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 常用实践场景

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

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

2、如果目标服务器使用的库与线上机器一样,且只需要引流Get方法的请求。

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

3、当需要对线上服务进行整体性能压测时,可将线上请求扩大N倍,进行引流,将请求扩大1倍,也可缩小,调整"|"后面的百分比即可。

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

4、只复制某个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

5、多目标服务器的流量复制引流,有点类似nginx的mirror。

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

6、将流量转发到多个端点,默认情况下,它会将相同的流量发送到所有输出。

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

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

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

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

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

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

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

10、性能压力测试

可以将流量复制到文件,然后再对他们进行回放。回放的时候,流量会维持原始的时间间隔。如果你使用了百分比来进行速率限制,那么回放的速率会相应的增加或减少。有了这种速率限制,gor就可以用来进行压力测试。

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

目前,input-file仅在使用基于百分比的限制器时才支持此功能。与默认限制器不同input-file,它不会降低请求速度,而会减慢速度或加速请求发射。

11 、录制与回放

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

执行录制命令后,将会创建新文件并不断向其写入所有捕获的请求。

12、流量回放,重播来自文件的请求。

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

您应该看到所有记录到http://localhost:8001的请求,并且它们将以相同的顺序重播,并且与录制的时间完全相同。

gor的用法也远不止上述提到的这些,更多的应用测试场景,还请读者自行挖掘。

往期精选:

TesterHome创始人思寒:如何从手工测试进阶自动化测试?十余年经验分享

月薪30K+,高薪?一文搞懂什么是测试开发!

测试应该如何处理跟开发之间的“敏感”关系?

人生苦短,我用Python,助力成为世界上最好的语言!

软件测试工程师又一大挑战:大数据测试

作为一名Tester,我是如何做到工作一年薪资Double的

一文搞定SonarQube接入C#(.NET)代码质量分析

你所需要掌握的问题排查知识

RobotFrameWork编写接口测试及如何断言

微服务下的契约测试(CDC)解读

 
 
 
 
 

推荐一款简单易用线上引流测试工具:GoReplay的更多相关文章

  1. 简单易用的leetcode开发测试工具(npm)

    描述 最近在用es6解leetcode,当问题比较复杂时,有可能修正了新的错误,却影响了前面的流程.要用通用的测试工具,却又有杀鸡用牛刀的感觉,所以就写了个简单易用的leetcode开发测试工具,分享 ...

  2. 推荐15款最佳的响应式 Web 设计测试工具

    响应式网页设计是根据设备的屏幕尺寸,平台和方向来开发的网页,是一种对最终用户的行为和环境作出反应的方法.响应式设计使用灵活的网格和布局,图像和智能使用 CSS 媒体查询的组合.当从它们在不同设备使用的 ...

  3. 一款简单易用的.Net 断言测试框架 : Shouldly

    GitHub地址:https://github.com/shouldly/shouldly Shouldly的官方文档:http://docs.shouldly-lib.net/ Nuget安装: 在 ...

  4. 【我的Android进阶之旅】推荐一款视频转换GIF图片格式的转换工具(Video to GIF)

    一.背景 最近想把一些Android Demo的运行效果图获取下来,但是一直使用真机进行调试,在电脑上不好截取一段gif动画.而之前使用模拟器的时候可以使用 GifCam 工具进行屏幕动画截取.Gif ...

  5. [转帖]推荐一款比 Find 快 10 倍的搜索工具 FD

    推荐一款比 Find 快 10 倍的搜索工具 FD https://www.hi-linux.com/posts/15017.html 试了下 很好用呢. Posted by Mike on 2018 ...

  6. 推荐25款实用的 HTML5 前端框架和开发工具【下篇】

    快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5.HTML5 有许多新的特性功能,允许开发人员和设计师创建应用程序和网站,带给用户桌面应用程序的速度,性能和体验. ...

  7. 推荐一款非常好用的java反编译工具(转)

    源: 推荐一款非常好用的java反编译工具

  8. 推荐一款好用的文件/文件夹对比工具 —— Beyond Compare

    推荐一款好用的文件/文件夹对比工具 —— Beyond Compare! 有需要的人,用了都说好: 不知道这个是干嘛用的,说再多也没用.

  9. 设计与开发一款简单易用的Web报表工具(支持常用关系数据及hadoop、hbase等)

    EasyReport是一个简单易用的Web报表工具(支持Hadoop,HBase及各种关系型数据库),它的主要功能是把SQL语句查询出的行列结构转换成HTML表格(Table),并支持表格的跨行(Ro ...

随机推荐

  1. elasticsearch的分布式基础概念(1)

    Elasticsearch对复杂分布式机制的透明隐藏特性 Elasticsearch是一套分布式的系统,分布式是为了应对大数据量 隐藏了复杂的分布式机制 分片机制(随随便便就将一些document插入 ...

  2. jenkins之插件下载方法

    jenkins插件下载方法有两种,在线下载和离线下载方式 在线下载 就是在安装好了jenkins之后,进入jenkins的插件管理页面,搜索想要的插件,点击安装即可 例如:安装git插件 问题:有时候 ...

  3. Python学习笔记整理总结【Django】Ajax

     一.Ajax(part1) Ajax即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术,AJAX = ...

  4. 微项目:一步一步带你使用SpringBoot入门(一)

    最近放假了,休息的时候不忘写个小项目来玩玩. 如果有需要一起手动做项目的朋友可以和我一起做这个小项目. 做到哪随心所欲.也就一周的事哈哈. *** 开发环境 JDK1.8 JetBrain Intel ...

  5. if [ $# -ne 1 ] 作用

    在shell脚本中经常会使用if [ $# -ne 1 ];then...这类脚本 ];then 这段命令是用于判断参数的个数是否为1,不是则进行then的逻辑处理,其中$#表示参数个数,-ne是不等 ...

  6. 夯实Java基础系列13:深入理解Java中的泛型

    目录 泛型概述 一个栗子 特性 泛型的使用方式 泛型类 泛型接口 泛型通配符 泛型方法 泛型方法的基本用法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型方法总结 泛型上下边界 泛型常见面试 ...

  7. Bumblebee服务网关之统一请求验证

    对于微服务网关来说,统一请求验证是一个比较重要和常用的功能,通过网关验证后台服务就无须关注请求验证:对于多语言平台的服务而言制定验证方式和变更验证配置都是一件比较繁琐和工作量大的事情.Bumblebe ...

  8. Spring Boot 二十个注解

    Spring Boot 二十个注解 占据无力拥有的东西是一种悲哀. Cold on the outside passionate on the insede. 背景:Spring Boot 注解的强大 ...

  9. 新建springmvc配置文件

    新建spring或springmvc的配置文件时,需要先加入spring-bean-4.3.18.RELEASE.jar包,当然可以是其他版本,这样就可以在资源目录下,比如resources(Reso ...

  10. Dubbo学习系列之十五(Seata分布式事务方案TCC模式)

    上篇的续集. 工具: Idea201902/JDK11/Gradle5.6.2/Mysql8.0.11/Lombok0.27/Postman7.5.0/SpringBoot2.1.9/Nacos1.1 ...