首页 > 其他分享 >gor实现线上HTTP流量复制压测引流

gor实现线上HTTP流量复制压测引流

时间:2023-03-23 15:36:37浏览次数:56  
标签:8080 压测 http -- output HTTP 测试环境 gor

一、使用背景

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

<iframe data-google-container-id="a!6" data-google-query-id="CLvMjNLB8f0CFQQivAodN_IF3A" data-load-complete="true" frameborder="0" height="280" id="aswift_5" marginheight="0" marginwidth="0" name="aswift_5" scrolling="no" src="https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6527383233809815&output=html&h=280&adk=301017208&adf=3991580187&pi=t.aa~a.3097771682~rp.4&w=1120&fwrn=4&fwrnh=100&lmt=1679555991&rafmt=1&to=qs&pwprc=5621362615&format=1120x280&url=https%3A%2F%2Fwww.bbsmax.com%2FA%2F1O5E3Nn3z7%2F&fwr=0&pra=3&rpe=1&resp_fmts=3&wgl=1&fa=40&uach=WyJtYWNPUyIsIjEyLjAuMSIsIng4NiIsIiIsIjExMS4wLjU1NjMuNjQiLFtdLGZhbHNlLG51bGwsIjY0IixbWyJHb29nbGUgQ2hyb21lIiwiMTExLjAuNTU2My42NCJdLFsiTm90KEE6QnJhbmQiLCI4LjAuMC4wIl0sWyJDaHJvbWl1bSIsIjExMS4wLjU1NjMuNjQiXV0sZmFsc2Vd&dt=1679555991460&bpp=1&bdt=1553&idt=-M&shv=r20230321&mjsv=m202303160101&ptt=9&saldr=aa&abxe=1&cookie=ID%3Df6e124335b7679b3-2255777a3dd500ea%3AT%3D1658395376%3ART%3D1658395376%3AS%3DALNI_MZd1oUnYjw_TI5koEx86Wzj53Gdcw&gpic=UID%3D000007edee241795%3AT%3D1658395376%3ART%3D1679555991%3AS%3DALNI_MYJtKMNjU_0oK_o9qtmaRzX_hAb_Q&prev_fmts=0x0%2C1120x280%2C1120x280&nras=2&correlator=7963673406972&frm=20&pv=1&ga_vid=1299016726.1679555991&ga_sid=1679555991&ga_hid=818296085&ga_fc=0&u_tz=480&u_his=1&u_h=900&u_w=1440&u_ah=832&u_aw=1440&u_cd=30&u_sd=2&dmc=8&adx=153&ady=1620&biw=1425&bih=752&scr_x=0&scr_y=307&eid=44759842%2C44759875%2C44777877%2C44759926%2C31073263%2C31073270%2C44786632&oid=2&pvsid=159016860262491&tmod=923787975&uas=0&nvt=1&ref=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DigXSHzMBPFjnfAh-08bMg3uB89SsE2r1ncaU_WQId_5caYgGyn0X9XNZkQjmfoTm%26wd%3D%26eqid%3D8cf1a0b40014bfad00000006641bfd87&fc=1920&brdim=0%2C25%2C0%2C25%2C1440%2C25%2C1440%2C831%2C1440%2C752&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=128&bc=31&ifi=6&uci=a!6&btvi=1&fsb=1&xpc=Qk0V7zzLJU&p=https%3A//www.bbsmax.com&dtd=7" width="1120"></iframe>

 

例如,现在将测试环境的流量拷贝到我的性能测试环境中

测试环境的:

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服务器上直接执行以下命令即可:

安装方法很简单:

  1. wget https://github.com/buger/goreplay/releases/download/v0.16.1/gor_0.16.1_x64.tar.gz
  2. tar -xf gor_0.16.1_x64.tar.gz
  3. cp gor /usr/bin/ #将解压后的gor文件复制到/usr/bin下,就可以开始使用了
  4. gor -h

 

 

gor --input-raw :80 --output-stdout

三、应用场景

3.1 流量实时复制引流(--input-raw 拦截端口配合--output-http输出)

3.1.1 当对服务功能进行了改造,不能直接上线,需要真实请求来做验证,可以用流量复制引流

  1. gor --input-raw : --output-http "http://target_server:8080"
  2. #将本机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

标签:8080,压测,http,--,output,HTTP,测试环境,gor
From: https://www.cnblogs.com/cnsanshao/p/17247615.html

相关文章

  • 搜索式的实践-SPDY、HTTP2
    搜索式的实践-SPDYHTTP的缺陷单路连接请求抵效HTTP只允许由客户端主动发起请求HTTP头部冗余SPDY的改进多路复用请求优化支持服务器推送技术SPDY压缩了HTTP头强......
  • HTTP协议的瓶颈、WebSocket与HTTP
    影响HTTP网络请求的因素带宽延迟HTTP协议的瓶颈一条连接上只发送一个请求请求只能从客户端开始。客户端不可以接受除响应以外的指令请求/响应头部不经压缩就发送每......
  • Magento: 通过id获取类别名字等信息 get category by id
    <?php//getcategorymodelbycategoryid,assumeyouhaveknowncategoryid,$categoryId$_category=Mage::getModel('catalog/category')->load($categoryId);......
  • Magento: 获取类别所有子类别 (无限级别-目录树) Get All Sub Categories
    生成分类目录树(CategoryTree)$rootcatId=Mage::app()->getStore()->getRootCategoryId();$categories=Mage::getModel('catalog/category')->getCategories($rootca......
  • HTTPS对性能的影响、HTTPS常见问题
    HTTPS对性能的影响协议交互所增加的网络RTT加解密相关的计算耗时网络耗时 HTTPS的访问过程  计算耗时浏览器计算耗时服务器端计算耗时HTTPS常见问题https加......
  • HTTPS协议概述、HTTPS使用成本
    HTTPS协议概述 HTTPS可以认为是HTTP+TLSTLS是传输层加密协议,它的前身是SSL协议  HTTPS功能介绍内容加密1、非对称密匙交换2、对称内容加密身份认证1、......
  • .NET & Nsubstitute 模拟Http请求
    我们的代码中有时候会需要调用其他平台的接口,在做单元测试的时候,我们不需要测试这些第三方接口是否生效,接口是否有问题,但是如果我们直接调用第三方接口,这些接口的错误又会影......
  • spring,springBoot配置类型转化器Converter以及FastJsonHttpMessageConverter,StringHt
     spring,springboot等框架项目通过@RequestBody,@ResponseBody完成请求报文到响应对象及响应对象到响应报文的转换,其底层是通过消息转换器完成消息之间的转换,包括格式转化......
  • EasyCVR配置https证书后,取流集成至播放器无法播放的情况排查与解决
    EasyCVR平台可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。平台可支持多协议、多类型......
  • Go HTTP编程
    目录HTTP服务端HTTP客户端Go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务端的具体实现,使得我们可以很方便地编写HTTP客户端或服务端的程序。HTTP服......