流量复制重放工具gor、与diffy结合使用

结合使用示例图:

 

使用场景:

serverA为线上服务      服务1、2、3为测试环境下的不同版本

 

从线上服务引流到测试环境,通过diffy  判断不同版本下响应结果是否一致   判断是否存在BUG

 

 

 

 

 

 

 

工具具体介绍如下:

 

gor:

从线上环境复制流量,为测试环境提供数据,可以用于功能、性能测试;

 

从网上搜了一通,复制流量大概为以下几种方式:1、nginx+lua脚本     2、tcpcopy      3、gor     

1的操作较为复杂;

参考:

http://www.crackedzone.com/testing-service-with-nginx-copy-request.html#

2和3整体差不多,感觉还是3简单好用

tcpcopy:https://www.cnblogs.com/yuyijq/p/4541660.html

 

gor      用GO语音编写的工具,需要root权限启动;Gor 支持流量的放大和缩小、频率限制

相关文档:

https://studygolang.com/articles/10205

http://tyrion.iteye.com/blog/2311987

 

获取gor版本:https://github.com/buger/goreplay/releases

源码地址:https://github.com/buger/goreplay

官方使用文档:https://github.com/buger/gor/wiki

 

 

 

下载安装包,比如:

wget  https://github.com/buger/goreplay/releases/download/v0.16.0.2/gor_0.16.0_x64.tar.gz


解压缩:

tar -zxvf  gor_0.16.0_x64.tar.gz


解压完之后 只有一个可执行文件gor

 

常用使用方法:

简单的 HTTP 流量复制:
gor –input-raw :80 –output-http “http://staging.com”
HTTP 流量复制频率控制:
gor –input-tcp :28020 –output-http “http://staging.com|10″
HTTP 流量复制缩小:
gor –input-raw :80 –output-tcp “replay.local:28020|10%”
HTTP 流量记录到本地文件:
gor –input-raw :80 –output-file requests.gor
HTTP 流量回放和压测:
gor –input-file “requests.gor|200%” –output-http “staging.com”
HTTP 流量过滤复制:
gor –input-raw :8080 –output-http staging.com –output-http-url-regexp ^www.

 

配置详细说明

     -cpuprofile string  
          write cpu profile to file  
    -debug verbose  
          打开debug模式,显示所有接口的流量   
    -http-allow-header value  
          用一个正则表达式来匹配http头部,如果请求的头部没有匹配上,则被拒绝   
           gor --input-raw :8080 --output-http staging.com --http-allow-header api-version:^v1 (default [])  
    -http-allow-method value  
          类似于一个白名单机制来允许通过的http请求方法,除此之外的方法都被拒绝.  
          gor --input-raw :8080 --output-http staging.com --http-allow-method GET --http-allow-method OPTIONS (default [])  
    -http-allow-url value  
          一个正则表达式用来匹配url, 用来过滤完全匹配的的url,在此之外的都被过滤掉   
           gor --input-raw :8080 --output-http staging.com --http-allow-url ^www. (default [])  
    -http-disallow-header value  
          用一个正则表达式来匹配http头部,匹配到的请求会被拒绝掉  
           gor --input-raw :8080 --output-http staging.com --http-disallow-header "User-Agent: Replayed by Gor" (default [])  
    -http-disallow-url value  
          用一个正则表达式来匹配url,如果请求匹配上了,则会被拒绝  
           gor --input-raw :8080 --output-http staging.com --http-disallow-url ^www. (default [])  
    -http-header-limiter value  
          读取请求,基于FNV32-1A散列来拒绝一定比例的特殊请求   
           gor --input-raw :8080 --output-http staging.com --http-header-imiter user-id:25% (default [])  
    -http-original-host  
          在--output-http的输出中,通常gor会使用取代请求的http头,所以应该禁用该选项,保留原始的主机头  
    -http-param-limiter value  
          Takes a fraction of requests, consistently taking or rejecting a request based on the FNV32-1A hash of a specific GET param:  
           gor --input-raw :8080 --output-http staging.com --http-param-limiter user_id:25% (default [])  
    -http-rewrite-url value  
          Rewrite the request url based on a mapping:  
          gor --input-raw :8080 --output-http staging.com --http-rewrite-url /v1/user/([^\/]+)/ping:/v2/user/$1/ping (default [])  
    -http-set-header value  
          Inject additional headers to http reqest:  
          gor --input-raw :8080 --output-http staging.com --http-set-header 'User-Agent: Gor' (default [])  
    -http-set-param value  
          Set request url param, if param already exists it will be overwritten:  
          gor --input-raw :8080 --output-http staging.com --http-set-param api_key=1 (default [])  
    -input-dummy value  
          Used for testing outputs. Emits 'Get /' request every 1s (default [])  
    -input-file value  
          从一个文件中读取请求  
          gor --input-file ./requests.gor --output-http staging.com (default [])  
    -input-http value  
          从一个http接口读取请求  
          # Listen for http on 9000  
          gor --input-http :9000 --output-http staging.com (default [])  
    -input-raw value  
          Capture traffic from given port (use RAW sockets and require *sudo* access):  
          # Capture traffic from 8080 port  
          gor --input-raw :8080 --output-http staging.com (default [])  
    -input-tcp value  
         用来在多个gor之间流转流量  
          # Receive requests from other Gor instances on 28020 port, and redirect output to staging  
          gor --input-tcp :28020 --output-http staging.com (default [])  
    -memprofile string  
          write memory profile to this file  
    -middleware string  
          Used for modifying traffic using external command  
    -output-dummy value  
          用来测试输入,打印出接收的数据. (default [])  
    -output-file value  
          把进入的请求写入一个文件中  
          gor --input-raw :80 --output-file ./requests.gor (default [])  
    -output-http value  
          转发进入的请求到一个http地址上  
          # Redirect all incoming requests to staging.com address   
          gor --input-raw :80 --output-http http://staging.com (default [])  
    -output-http-elasticsearch string  
          把请求和响应状态发送到ElasticSearch:  
          gor --input-raw :8080 --output-http staging.com --output-http-elasticsearch 'es_host:api_port/index_name'  
    -output-http-redirects int  
          设置多少次重定向被允许  
    -output-http-stats  
          每5秒钟输出一次输出队列的状态   
    -output-http-timeout duration  
         指定http的request/response超时时间,默认是5秒  
    -output-http-workers int  
          gor默认是动态的扩展工作者数量,你也可以指定固定数量的工作者  
    -output-tcp value  
          用来在多个gor之间流转流量  
          # Listen for requests on 80 port and forward them to other Gor instance on 28020 port  
          gor --input-raw :80 --output-tcp replay.local:28020 (default [])  
    -output-tcp-stats  
          每5秒钟报告一次tcp输出队列的状态  
    -split-output true  
          By default each output gets same traffic. If set to true it splits traffic equally among all outputs.  
    -stats  
          打开输出队列的状态  
    -verbose  
          Turn on more verbose output  

 

 

diffy:

 

diffy源码地址:https://github.com/twitter/diffy
使用场景:存在至少两套环境,比如线上、测试环境
使用方法:
使用gor 从线上环境 获取流量数据  可直接重放到 diffy的代理端口上,进而分发到不同版本的环境中并对结果做diff
serverA 提供原始数据,或者是模板数据
serverB、C、D ,为不同版本下的环境,接收模板数据,并对响应结果做diff

 

 

 

 

 

 

diffy使用过程:
在虚拟机使用docker执行,如下:
docker pull diffy/diffy


docker run -ti -p 7880:7880 -p 7881:7881 -7888:7888 diffy/diffy -candidate='10.99.203.109:8000' -master.primary='10.99.203.109:8100' -master.secondary='10.99.203.109:8200' -service.protocol='http' -serviceName='Test-Service' -proxy.port=:7880 -admin.port=:7881 -http.port=:7888 -rootUrl='localhost:7888'  -allowHttpSideEffects=true
 
其中:
7880为代理端口;
7881为diffy web页面
7888为diffy结果页面
服务地址:10.99.203.109;不同端口 代表不同版本的服务
启动后如下:

 

服务端所在机器显示:

 

 

此时,向diffy的代理端口发送请求:

 

此时虚拟机浏览器打开 127.0.0.1:7888,查看diffy结果

 

具体response

 

 

 

 

坑1:sbt assembly的时候  访问twitter资源问题,导致执行失败

坑2:在虚拟机执行docker命令的时候,如果服务也设置在本机,访问代理端口的时候,没有转发流量,可能与机器转发配置有关,待确定

 

posted @ 2018-12-07 18:34  踏雪无痕何处是  阅读(5515)  评论(0编辑  收藏  举报