流量復制重放工具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命令的時候,如果服務也設置在本機,訪問代理端口的時候,沒有轉發流量,可能與機器轉發配置有關,待確定

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM