回放線上流量利器-GoReplay

# 一. 線上引流產(chǎn)生背景 日常大部分的測試工作都是在測試環(huán)境下,通過模擬用戶的行為來對系統(tǒng)進行驗證,包括功能以及性能。在這個過程中,你可能會遇到以下問題: - 用戶訪問行為比較復(fù)雜,模擬很難和用戶行為一致,模擬不夠真實。 - 線下模擬場景有限,會出現(xiàn)業(yè)務(wù)覆蓋不全的情況。 線上引流方案的出現(xiàn)為上述問題提供了很好的解題思路,線上引流本質(zhì)是:通過把線上的真實流量復(fù)制到線下環(huán)境,解決測試環(huán)境模擬不夠真實,或覆蓋不夠全面的問題。 # 二. 線上引流常見方案 目前不少公司都對線上引流方案進行了許多實踐探索,常見的有以下4種引流方式(不限): ![](https://upload-images.jianshu.io/upload_images/28338950-fb0a867bfc472be7.png) 上述的幾種引流方式各有利弊,有的是需要自己開發(fā)相應(yīng)的工具來支持。而今天給大家 介紹的是另外一款簡單易用,學(xué)習(xí)成本低的引流工具GoReplay。 # 三. 推薦一款引流工具:GoReplay Gor,又稱為GoReplay,是采用Golang 編寫的一個開源的 HTTP 實時流量復(fù)制工具。它只需要在 LB 或者 入口服務(wù)器上執(zhí)行一個進程,就可以把生產(chǎn)環(huán)境的流量復(fù)制到任何地方,比如 Staging 環(huán)境、Dev 環(huán)境。常用于壓測及線上問題復(fù)現(xiàn)。 > 注:Golang 是采用Gor 實現(xiàn)且開源的,意味著可以方便的集成到自己的架構(gòu)中,可以用在壓力測試平臺、實時流量分析、應(yīng)用層防火墻等方面。 # 四. GoReplay工作流程 下面是goreplay官方之前公布的工作流程圖,簡單來講就是goreplay捕捉線上流量,并將捕捉到的釋放到指定測試服務(wù)器上。 ![](https://upload-images.jianshu.io/upload_images/28338950-acb8d88dd2146643.png) 最新GoReplay 官網(wǎng)上更新了一張更高逼規(guī)格的圖解說明,如下圖所示: ![](https://upload-images.jianshu.io/upload_images/28338950-c159523f9138e031.png) 上述流程圖展示的已經(jīng)很詳細(xì)了,我就不過多解釋。 > 注:Gor不是代理人,不需要將第三方工具放到關(guān)鍵路徑上。相反,Gor只是默默地分析你的應(yīng)用程序的流量,并不影響本身程序。 # 五. GoReplay支持的常用功能 1. Gor 支持流量的放大和縮小、頻率限制,這樣不需要搭建和生產(chǎn)環(huán)境一致的服務(wù)器集群也可以正確測試。 2. Gor 還支持根據(jù)正則表達式過濾流量,這意味著可以單獨測試某個 API 服務(wù)。 3. Gor還可以修改 HTTP 請求頭,比如替換 User-Agent, 或者增加某些 HTTP Header 。 4. Gor 還可以把請求記錄到文件,以備回放和分析。Gor 支持和 ElasticSearch 集成,將流量存入 ES 進行實時分析。 5. 上線前在預(yù)發(fā)布環(huán)境,使用線上真實的請求,檢查是否準(zhǔn)備發(fā)布的版本,是否具備發(fā)布標(biāo)準(zhǔn)。 6. 壓力測試完成后,用線上真實的請求,加速后回放至測試環(huán)境,檢查是否有報錯等問題。 7. 用線上的流量轉(zhuǎn)發(fā)到預(yù)發(fā)布或測試環(huán)境,檢查相同流量下一些指標(biāo)的反饋情況,檢查核心數(shù)據(jù)是否需要改善。 8. 等等。 # 六. 下載安裝GoReplay 顧名思義,GoReplay是基于go語言實現(xiàn)的,要在目標(biāo)服務(wù)器上安裝go環(huán)境。安裝參考可見 :https://golang.org/doc/install,準(zhǔn)備好go語言環(huán)境后,GoReplay直接提供了編譯好的版本,十分方便,直接解壓即可,可參考以下步驟: ``` #下載包 wget https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0_x64.tar.gz #解壓 tar xvf gor_1.0.0_x64.tar.gz ``` 也可以進入到官網(wǎng)下載地址:https://github.com/buger/goreplay/releases下載最新的Gor二進制文件(支持Windows,Linux x64和Mac OS提供預(yù)編譯的二進制文件),或者可以自行編譯。 獲取gor版本: https://github.com/buger/goreplay/releases 源碼地址: https://github.com/buger/goreplay 官方使用文檔: https://github.com/buger/gor/wiki # 七. GoReplay 常用命令用法 輸入?yún)?shù): ? --input-raw 用于捕獲HTTP流量,需要指定IP地址或接口和應(yīng)用程序端口。 ? --input-file 接收通過--output-file保存流量的文件 ? --input-tcp 將多個 Goreplay 實例獲取的流量聚集到一個 Goreplay 實例。 輸出參數(shù): ? --output-http 重放HTTP流量到給定的端點,接受基礎(chǔ)URL。 ? --output-file 錄制流量時指定的存儲文件 ? --output-tcp 將獲取的流量轉(zhuǎn)移至另外的 Goreplay 實例,并與其一起使用--input-tcp。 ? --output-stdout 用于調(diào)試,輸出所有數(shù)據(jù)到stdout。 ? --http-allow-method 根據(jù)請求方式過濾。 ? --http-allow-url url白名單,其他請求將會被丟棄。 ? --http-disallow-url 遇上一個url相反,黑名單,其他的請求會被捕獲到。 輸入?yún)?shù): - –input-raw :用來捕捉http流量,需要指定ip地址和端口 - –input-file :接收流量方式 接收通過--output-file保存流量的文件 - –output-file:保存流量的文件 - –input-tcp:將多個Goreplay實例獲取的流量聚集到一個Goreplay實例 輸出參數(shù): - –output-stdout:終端輸出 - –output-http:重放HTTP流量到給定的端點,接受基礎(chǔ)URL。 - --output-tcp 將獲取的流量轉(zhuǎn)移至另外的 Goreplay 實例,并與其一起使用--input-tcp。 - –output-file:錄制流量時指定的存儲文件 其它參數(shù): - –http-disallow-url :不允許正則匹配的URL - –http-allow-header :允許的Header頭 - –http-disallow-header:不允許的Header頭 - –http-allow-method:允許的請求方法,傳入值為GET,POST,OPTIONS等 - –input-file-loop:無限循環(huán),而不是讀完這個文件就停止了 - –output-http-workers:并發(fā)請求數(shù) - –stats --out-http-stats 每5秒輸出一次TPS數(shù)據(jù)(查看統(tǒng)計信息) - –split-output true: 按照輪訓(xùn)方式分割流量 - –output-http-timeout 30s:http超時30秒時間設(shè)置,默認(rèn)是5秒 # 八. GoReplay 常用實踐場景 1、流量實時復(fù)制引流(--input-raw 攔截端口配合--output-http輸出),例如將本機80端口的HTTP流量實時復(fù)制到targer_server:8080。 ``` gor --input-raw :80 --output-http "http://target_server:8080" ``` 2?控制臺輸出,獲取經(jīng)過本地8080端口的請求流量,然后打印到控制臺。 ``` gor --input-raw :8080 --output-stdout ``` 上述命令將監(jiān)控8080端口上所有的流量,并通過終端stdout輸出。你可以通過瀏覽器或者curl訪問8080端口,然后在終端查看gor輸出所有的http請求。 3?先錄制后回放,將捕捉流量保存到文件中,然后釋放到其它機器,有時候?qū)崟r同步流量是很難做到的, 所以Goreplay提供了這種先保存后回放的模式: 第一步, 通過--output-file保存流量: ``` gor --input-raw :8080 --output-file=requests.gor ``` 上述命令將8080端口的流量,保存到requests.gor文件中(必須是.gor后綴,其它后綴經(jīng)測釋放時有問題)。 第二步,回放保存的流量: ``` gor --input-file requests.gor --output-http="http://localhost:8081" ``` 上述命令將釋放所有保存在requests.gor中的請求通過相同的時間順序釋放到服務(wù)器[http://localhost:8081](http://localhost:8081) 4、過濾指定請求方法,如果目標(biāo)服務(wù)器使用的庫與線上機器一樣,且只需要引流Get方法的請求。 ``` gor --input-raw :80 --http-allow-method GET --output-http "http://target_server:8080" ``` 5?請求過濾,當(dāng)你需要捕捉指定路徑的請求流量時,可以使用該機制, 如只同步/api路徑下的請求 ``` gor --input-raw :8080 --output-http staging.com --http-allow-url /api 只收集請求頭中符合 api-version 為 1.0x 的請求 gor --input-raw :8080 --output-http staging.com --http-allow-header api-version:^1\.0\d ``` 6?限速機制,由于生產(chǎn)服務(wù)器配置一般遠(yuǎn)高于測試服務(wù)器配置,所以直接將生產(chǎn)服務(wù)器全部流量同步到測試服務(wù)器是不可行的,goreplay提供了兩種策略: a. 限制每秒的請求數(shù) ``` gor --input-tcp :28020 --output-http "http://staging.com|10"# (每秒請求數(shù)限制10個以內(nèi)) gor --input-raw :80 --output-tcp "replay.local:28020|10%" # (每秒請求數(shù)限制10%以內(nèi)) ``` b. 基于Header或Url的參數(shù)限制一些請求,為指定的header或者url的請求設(shè)定限制的百分比。 ``` gor --input-raw :80 --output-tcp "replay.local:28020|10%" --http-header-limiter "X-API-KEY: 10%" gor --input-raw :80 --output-tcp "replay.local:28020|10%" --http-param-limiter "api_key: 10%" ``` 7、流量加壓,當(dāng)需要對線上服務(wù)進行整體性能壓測時,可將線上請求擴大N倍,進行引流,將請求擴大1倍,也可縮小,調(diào)整"|"后面的百分比即可。 ``` gor --input-raw :80 --http-allow-method GET --output-http "http://target_server:8080|200%" ``` 8、只復(fù)制某個URL請求,--http-allow-url參數(shù),-http-allow-url參數(shù)可用正則表達式(--output-http-url-regexp在gor 0.16已經(jīng)過期,使用--http-allow-url代替)。 ``` gor --input-raw :8080 --http-allow-method GET --output-http "http://target_server:8080" --http-allow-url mall.*hotword ``` 9、多目標(biāo)服務(wù)器的流量復(fù)制引流,有點類似nginx的mirror。 ``` gor --input-raw :80 --output-http "http://target_server:8080" --output-http "http://target_server2:8080" ``` 10、將流量轉(zhuǎn)發(fā)到多個端點,默認(rèn)情況下,它會將相同的流量發(fā)送到所有輸出。 ``` gor --input-tcp :28020 --output-http "http://staging.com" --output-http "http://dev.com" ``` 11、將相同的流量發(fā)送到多個站點,并且平分所有流量。 ``` gor --input-raw :80 --output-http "http://staging.com" --output-http "http://dev.com" --split-output true ``` 12、HTTP超時,默認(rèn)情況下,http請求和響應(yīng)的超時時間為5秒。你可以像這樣覆蓋它: ``` gor --input-tcp replay.local:28020 --output-http http://staging.com --output-http-timeout 30s ``` 13、基本身份驗證,如果您的開發(fā)或登臺環(huán)境受基本身份驗證保護,那么可以在重放期間注入這些憑據(jù): ``` gor --input-raw :80 --output-http "http://user:pass@staging.com" ``` 14、性能壓力測試,可以將流量復(fù)制到文件,然后再對他們進行回放?;胤诺臅r候,流量會維持原始的時間間隔。如果你使用了百分比來進行速率限制,那么回放的速率會相應(yīng)的增加或減少。有了這種速率限制,gor就可以用來進行壓力測試。 ``` gor --input-file "requests.gor|200%" --output-http "staging.com" ``` 目前,input-file僅在使用基于百分比的限制器時才支持此功能。與默認(rèn)限制器不同input-file,它不會降低請求速度,而會減慢速度或加速請求發(fā)射。 15 、錄制與回放 ``` ./gor --input-raw :8000 --output-file=requests.gor ``` 執(zhí)行錄制命令后,將會創(chuàng)建新文件并不斷向其寫入所有捕獲的請求。 16、流量回放,重播來自文件的請求。 ``` ./gor --input-file requests.gor --output-http="http://localhost:8001" ``` 您應(yīng)該看到所有記錄到http://localhost:8001的請求,并且它們將以相同的順序重播,并且與錄制的時間完全相同。 GoReplay更多用法可參考官方文檔:https://github.com/buger/goreplay/wiki/Getting-Started > 轉(zhuǎn)載 https://developer.aliyun.com/article/936247 關(guān)注 獲取更多好文 ![](https://upload-images.jianshu.io/upload_images/28338950-272dafba8104d18b.png) 本文由[mdnice](https://mdnice.com/?platform=6)多平臺發(fā)布
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 校驗系統(tǒng)的準(zhǔn)確性和可靠性時,僅靠用例場景無法覆蓋全生產(chǎn)環(huán)境的所有場景,需要一套引流工具,在系統(tǒng)正式上線前,用線上的...
    jinjin1009閱讀 605評論 0 0
  • 一. 線上引流產(chǎn)生背景 日常大部分的測試工作都是在測試環(huán)境下,通過模擬用戶的行為來對系統(tǒng)進行驗證,包括功能以及性能...
    狂師閱讀 1,249評論 0 1
  • Gor概述Gor 是用 Golang 寫的一個 HTTP 實時流量復(fù)制工具。只需要在 LB 或者 Varnish ...
    Lu離塵閱讀 10,390評論 1 7
  • Gor,又稱為GoReplay,是采用Golang 編寫的一個開源的 HTTP 實時流量復(fù)制工具。它只需要在 LB...
    FMD彩虹閱讀 1,315評論 0 0
  • goreplay介紹 下載: 項目地址:https://github.com/buger/goreplay/rel...
    愛上吃榴蓮皮的人閱讀 9,281評論 1 3

友情鏈接更多精彩內(nèi)容