gor实现线上HTTP流量复制压测引流
一、使用背景
gor 是一款go语言实现的简单的http流量复制工具,它的主要目的是使你的生产环境HTTP真实流量在测试环境和预发布环境重现。只需要在 代理例如nginx入口服务器上执行一个进程,就可以把生产环境的流量复制到任何地方,
完美解决了HTTP 层实时流量复制和压力测试的问题。常见的HTTP流量copy工具还有另外一款tcpcopy。将机器A上的http请求复制转发到指定机器B上去,
通过线上流量复制引流,通过将真实请求流量放大N倍来进行压测,能对服务有一个较为全面的检验。
二、安装
前往官方下载:https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0_x64.tar.gz

例如,现在将测试环境的流量拷贝到我的性能测试环境中
测试环境的:
http://zichan-manage.xxxxx.com:8080

性能测试环境:
http://dh-manage.xxxx.com:8080

环境结构说明:
172.20.20.111为性能测试环境的nginx服务器
172.20.20.114为性能测试环境的tomcat网关服务器
172.20.20.115为性能测试环境的app后端服务
在Linux服务器上直接执行以下命令即可:
安装方法很简单:
wget https://github.com/buger/goreplay/releases/download/v0.16.1/gor_0.16.1_x64.tar.gz
tar -xf gor_0.16.1_x64.tar.gz
cp gor /usr/bin/ #将解压后的gor文件复制到/usr/bin下,就可以开始使用了
gor -h


gor --input-raw :80 --output-stdout
三、应用场景
3.1 流量实时复制引流(--input-raw 拦截端口配合--output-http输出)
3.1.1 当对服务功能进行了改造,不能直接上线,需要真实请求来做验证,可以用流量复制引流
gor --input-raw : --output-http "http://target_server:8080"
#将本机8080端口的HTTP流量复制到targer_server:

在测试环境执行登录操作:

在性能测试环境172.20.20.111环境的nginx中日志查看请求日志:

说明171上的数据已经被copy过来
同时查看111环境后的web tomcat环境的日志:

说明请求也copy到tomcat层
为了验证的问题更加简明扼要,我只抓取其中一个登录的接口:
首先在功能测试环境开启gor监控

--http-allow-method POST --http-allow-url /debtoauth2/user/login
然后在tail一下172.20.20.111环境的日志,查看从171上copy过来的日志,是否copy过来

查看111:
尾号是0006的手机号

114环境:

115后端处理成功了

监控app端登录接口的处理入参和出参:
com.xxx.xxx.debtoauth2.web.controller.UserController.userLogin

到这里,请求从功能测试环境直接copy到了我的性能测试环境
如果在线上环境开启gor的监控,那么是不是也可以将线上的流量导入到压测环境,这样就可以起到类似压测线上的,对线上的流量预估更加准确
3.1.2 如果目标服务器使用的库与线上机器一样,需要只引流Get方法,不应该复制上行方法(POST等)
gor --input-raw :80 --http-allow-method GET --output-http "http://target_server:8080"
3.1.3 当需要对线上服务进行整体性能压测时,可将线上请求扩大N倍,进行引流
gor --input-raw :80 --http-allow-method GET --output-http "http://target_server:8080|200%" #将请求扩大1倍,也可缩小,调整"|"后面的百分比即可
3.1.4 只复制某个URL请求,--http-allow-url参数
gor --input-raw :8080 --http-allow-method GET --output-http "http://target_server:8080" --http-allow-url mall.*hotword
#--http-allow-url参数可用正则表达式
#--output-http-url-regexp在gor 0.16已经过期,使用--http-allow-url代替
3.1.5 多目标服务器的流量复制引流,有点类似nginx的mirror
gor --input-raw :80 --output-http "http://target_server:8080" --output-http "http://target_server2:8080"
其他参数:


gor --input-raw :80 --output-http 'http://192.168.0.100:8080' --http-rewrite-url /v1/user/([^\\/]+)/ping:/v2/user/$1/ping
3.2 录制与回放
适合在夜深人静的时候,偷摸干一些和谐的事(≧∀≦)
3.2.1 录制,只是gor输出目标改为本地文件,使用--output-file参数
gor --input-raw :80 --output-file gor_request.log
3.2.2 回放
gor --input-file "gor_request.log|200%" --output-http "http://target_server:8080"
四、最后
通过案例发现,gor目前的只能使用较为简单的无鉴权的操作,同时要求线下环境的数据要和线上的数据保持一致,不然会出现线上的请求参数,copy到测试环境出现空指针等异常
2。对于类似APP端的接口,基本都存在API鉴权操作,即请求头都会携带唯一标识
如果从从线上环境的请求,header中的token是123456,那么这个token的值也会被copy到线下测试环境,但是这个用户没有做登录操作,所以也没有token,这个时候拿线上的token肯定操作失败:

其实这些登录已失效,都是因为copy过来的请求,都是带的线上的token,肯定在测试环境不行
如果将这个token替换到测试环境的toekn:

gor --input-raw :8080 --http-allow-method POST --output-http "http://172.20.20.111:8080" --input-raw-realip-header "X-Real-IP" --http-set-header "Host: dh-manage.xiaoniu88.com:8080" --http-set-header "Origin: dh-manage.xiaoniu88.com:8080" --http-set-header "accessToken: c7d7646b45194c34982d4de2a7bc505f"

所以,gor适用于没有任何token鉴权验证的,同时要求线上和线下数据一致的环境
参考文档:
https://cloud.tencent.com/developer/article/1491793
https://www.cnblogs.com/playboysnow/articles/9759366.html
https://www.cnblogs.com/mithrandirw/p/8468910.html
https://blog.csdn.net/weixin_33825683/article/details/92585462
https://blog.csdn.net/weixin_34345560/article/details/87986675
https://www.houyang.org/detail/292465674.html
gor实现线上HTTP流量复制压测引流的更多相关文章
- 线上应用接入sentinel的第一个流控规则
sentinel接入第1个应用A以及控制台,已经上线一段时间了,本周接入了第2个应用B: 因为测试同学只有几个,没有压测团队.测试平台.. 各接口能承载的最大qps不确定 ,接入的应用暂时都没有配置规 ...
- 推荐一款简单易用线上引流测试工具:GoReplay
一. 引流测试产生背景 日常大部分的测试工作都是在测试环境下,通过模拟用户的行为来对系统进行验证,包括功能以及性能.在这个过程中,你可能会遇到以下问题: 用户访问行为比较复杂,模拟很难和用户行为一致, ...
- 使用tcpcopy拷贝线上流量压测测试环境
tcpcopy项目地址:https://github.com/session-replay-tools/tcpcopy 作者地址:http://blog.csdn.net/wangbin579 1:环 ...
- Nginx流量复制
1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问: 这跟灰度发布还 ...
- 真刀真枪压测:基于TCPCopy的仿真压测方案
郑昀 基于刘勤红和石雍志的实践报告 创建于2015/8/13 最后更新于2015/8/19 关键词:压测.TCPCopy.仿真测试.实时拷贝流量 本文档适用人员:技术人员 提纲: 为什么要做仿真测试 ...
- 京东全链路压测军演系统(ForceBot)架构解密
摘要:全链路压测是应对电商大促容量规划最有效的手段,如何有效进行容量规划是其中的架构关键问题.京东在全链路压测方面做过多年尝试,本文转载京东商城基础平台技术专家文章,介绍其最新的自动化压测 Force ...
- 全链路压测平台(Quake)在美团中的实践
背景 在美团的价值观中,以“客户为中心”被放在一个非常重要的位置,所以我们对服务出现故障越来越不能容忍.特别是目前公司业务正在高速增长阶段,每一次故障对公司来说都是一笔非常不小的损失.而整个IT基础设 ...
- 高德全链路压测平台TestPG的架构与实践
导读 2018年十一当天,高德DAU突破一个亿,不断增长的日活带来喜悦的同时,也给支撑高德业务的技术人带来了挑战.如何保障系统的稳定性,如何保证系统能持续的为用户提供可靠的服务?是所有高德技术人面临的 ...
- 腾讯云开放云压测“黑科技“,产品上线从此不再“压力山大"
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 能否解决"高并发"问题一直是检验一个产品后台是否稳定,架构是否合理,性能是否强大的核心标准.对于产品而言,多高的并发 ...
随机推荐
- 前后端分离及Element的使用
1. 前后端分离 1.1 什么是前后端分离 在传统的web应用开发中,大多数的程序员会将浏览器作为前后端的分界线.将浏览器中为用户进行页面展示的部分称之为前端,而将运行在服务器,为前端提供业务逻辑和数 ...
- 一个故事搞懂Java并发编程
最近在给别人讲解Java并发编程面试考点时,为了解释锁对象这个概念,想了一个形象的故事.后来慢慢发现这个故事似乎能讲解Java并发编程中好多核心概念,于是完善起来形成了了这篇文章.大家先忘记并发编程, ...
- Fabric-Ca使用
Fabric-Ca的概念不再解释了,这里只说明使用方法: 前置条件 Go语言1.10+版本 GOPATH环境变量正确设置 已安装libtool和libtdhl-dev包 Ubuntu系统 通过以下命令 ...
- C# 使用.net core 驱动树莓派的IO信号
如何使用.net core来驱动树莓派的IO信号?是我们的实际项目需求中,可能就会有这种小项目,我们要输出一个IO信号,此处我们拿了树莓派4做测试 一共有两排引脚,引脚的顺序定义及功能如下: 我们就参 ...
- 1.编译spring源码
本文是作者原创,版权归作者所有.若要转载,请注明出处 下载spring源码,本文用的是版本如下: springframework 5.1.x, IDE工具idea 2019.2.3 JAVA ...
- 一起学Spring之三种注入方式及集合类型注入
本文主要讲解Spring开发中三种不同的注入方式,以及集合数据类型的注入,仅供学习分享使用,如有不足之处,还请指正. 概述 Spring的注入方式一共有三种,如下所示: 通过set属性进行注入,即通过 ...
- 微信小程序-强制手机端更新
小程序的更新机制 开发者在管理后台发布新版本的小程序之后,如果某个用户本地有小程序的历史版本,此时打开的可能还是旧版本.微信客户端会有若干个时机去检查本地缓存的小程序有没有更新版本,如果有则会静默更新 ...
- SpringMVC通过Redis实现缓存主页
这里说的缓存只是为了提供一些动态的界面没办法作静态化的界面来减少数据库的访问压力,如果能够做静态化的话的还是采用nginx来做界面的静态化,这样可以承受高并发的访问能力. 好了,废话少说直接看实现代码 ...
- C lang:Pointer operation
Xx_Pointer opteration Do not dereference initialized Pointers Ax_Code #include<stdio.h> int ma ...
- python部署mariadb主从架构
主机部署: import configparser import os def config_mariadb_yum(): exists = os.path.exists('/etc/yum.repo ...