結合使用示例圖:
使用場景:
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命令的時候,如果服務也設置在本機,訪問代理端口的時候,沒有轉發流量,可能與機器轉發配置有關,待確定