性能測試:流量回放工具 - GoReplay

介紹

GoReplay 是一個開源網絡監控工具,可以將實時 HTTP 流量捕獲並重放到測試環境。

應用成熟的過程中,測試所需的工作量往往會成倍增長。針對這個問題,GoReplay 爲使用者提供了重用現有通信量進行測試的簡單方法。它可以在不改動產品基礎結構、且不影響現有流量的情況下,對這些流量進行分析和記錄,從而增強使用者對代碼部署、配置和基礎結構進行更改的信心。

下載及安裝

下載地址:https://github.com/buger/goreplay/releases

下載後將包放到需要錄製的服務,同服務器下,並解壓

參數介紹

–input-raw#用來捕捉http流量,需要指定ip地址和端口
–input-file#接收流量
–output-file#保存流量的文件
–input-tcp#將多個Goreplay實例獲取的流量聚集到一個Goreplay實例
–output-stdout#終端輸出
–output-tcp#將獲取的流量轉移至另外的Goreplay實例
–output-http#流量釋放的對象server,需要指定IP地址和端口
–output-file#錄製流量時指定的存儲文件
–http-disallow-url#不允許正則匹配的URL
–http-allow-header#允許的Header頭
–http-disallow-header#不允許的Header頭
–http-allow-method#允許的請求方法,傳入值爲GET,POST,OPTIONS等
–input-file-loop#無限循環,而不是讀完這個文件就停止了
–output-http-workers#併發請求數
–stats --out-http-stats#每5秒輸出一次TPS數據(查看統計信息)
–split-outputtrue#按照輪訓方式分割流量
–output-http-timeout30s  #http超時30秒時間設置,默認是5秒

命令行使用

#捕捉流量,並通過終端輸出,將監控8000端口上所有的流量,並通過終端stdout輸出
sudo ./gor --input-raw:8000--output-stdout

#捕捉流量,並實時回放到另一臺服務器的相同服務上,將8000端口的流量實時同步訪問http://example:8001服務器,你在訪問第一臺服務器時,將看到流量以相同的順序請求到第二臺。
sudo ./gor --input-raw:8000--output-http="http://localhost:8001"

#將捕捉的流量存到文件中,並回放到其它服務器
#首先保存流量,將8000端口的流量,保存到requests.gor文件中(必須是.gor後綴,其它後綴回放時有問題)。
sudo ./gor --input-raw:8000--output-file= requests.gor
#然後回放保存的流量 將保存在request.gor中的請求,通過相同的時間順序回放到服務器http://localhost:8001
sudo ./gor --input-file requests.gor --output-http= "http://localhost:8001"

GoReplay 的限速和請求過濾

限速機制

#限制每秒的請求數
sudo ./gor --input-tcp :28020 --output-http "http://localhost:8001|10"# (每秒請求數限制10個以內)
sudo ./gor --input-raw :80 --output-tcp "http://localhost:8001|10%" # (每秒請求數限制10%以內)
#基於Header或URL的參數限制一些請求,爲指定的Header或者URL的請求設定限制的百分比
sudo ./gor --input-raw :80 --output-tcp "http://localhost:8001|10%" --http-header-limiter "X-API-KEY: 10%"
sudo ./gor --input-raw :80 --output-tcp "http://localhost:8001|10%" --http-param-limiter "api_key: 10%"

請求過濾

#當需要捕捉指定路徑的請求流量時,可以使用該機制,如只同步/api路徑下的請求
sudo ./gor --input-raw :8080 --output-http staging.com --http-allow-url /api

Demo

#如果是性能測試,可以不考慮請求的順序和速率,並且要求無限循環
# --input-file 從文件中獲取請求數據,重放的時候 100x 倍速
# --input-file-loop 無限循環,而不是讀完這個文件就停止
# --output-http 發送請求到 http://host2.com
# --output-http-workers 併發 100 發請求
# --stats --output-http-stats 每 5 秒輸出一次 TPS 數據
./gor--input-file'request.gor|10000%'--input-file-loop--output-http'http://localhost:8001'--output-http-workers100--stats--output-http-stats

#抓取80端口的HTTP請求,只抓取URL是/api/v1的,並輸出到終端
./gor --input-raw:80--http-allow-url'/api/v1'--output-stdout

#抓取80端口的所有請求,並保存到文件,實際會分批保存爲request_0.gor,request_1.gor這種文件名
./gor --input-raw:80--output-file'request.gor'

#流量回放到多個站點(複製引流)
./gor --input-tcp:28020--output-http"http://localhost:8001"--output-http"http://localhost:8002"

#按照輪詢方式分割流量(平分流量)

./gor --input-raw:80--output-http"http://localhost:8001"--output-http"http://localhost:8002"--split-outputtrue

#HTTP超時設置
./gor --input-tcp replay.local:80--output-http http://staging.com --output-http-timeout30s

#性能測試(表示放大2倍速度來回放)
./gor --input-file"requests.gor|200%"--output-http"http://localhost:8001"

#回放速率不超過10QPS(絕對值)
./gor --input-tcp:80--output-http"http://localhost:8001|10"

#回放不超過原流量的10%(百分比,這裏是總流量的佔比)
./gor --input-raw:80--output-tcp"http://localhost:8001|10%"

#禁止的URL正則(除/api之外的請求)
./gor --input-raw:8080--output-http"http://localhost:8001"--http-disallow-url/api

#基於方法(表示只允許GET,OPTIONS的請求)
./gor --input-raw:80--output-http"http://localhost:8001"--http-allow-method GET --http-allow-method OPTIONS

#基於請求頭
./gor --input-raw:8080--output-http"http://localhost:8001"--http-allow-header api-version:^1\.0\d
./gor --input-raw:8080--output-http"http://localhost:8001"--http-disallow-header"User-Agent: Replayed by Gor"

#重寫請求
./gor --input-raw:8080--output-http"http://localhost:8001"--http-rewrite-url/v1/user/([^\\/]+)/ping:/v2/user/$1/ping

#設置URL參數
./gor --input-raw:8080--output-http"http://localhost:8001"--http-set-param api_key=1

#設置HEADER
./gor --input-raw:80--output-http"http://localhost:8001"--http-header"User-Agent: Replayed by Gor"--http-header"Enable-Feature-X: true"

#導出到ES
./gor --input-raw:8000--output-http"http://localhost:8001"--output-http-elasticsearch localhost:9200/gor

#基於Header或URL參數值的一致限制
# Limit based on header value
./gor --input-raw:80--output-tcp"http://localhost:8001|10%"--http-header-limiter"X-API-KEY: 10%"
# Limit based on header value
./gor --input-raw:80--output-tcp"http://localhost:8001|10%"--http-param-limiter "api_key: 10%"
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/6y3o88JdD3z6I9-gQmdAIQ