這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Gor概述
Gor 是用 Golang 寫的一個 HTTP 即時資料流量複製工具。只需要在 LB 或者 Varnish 入口伺服器上執行一個進程,就可以把生產環境的流量複製到任何地方,比如 Staging 環境、Dev 環境。完美解決了 HTTP 層即時資料流量複製和壓力測試的問題。
Image.png
Gor的功能
Gor 支援流量的放大和縮小、頻率限制,這樣不需要搭建和生產環境一致的伺服器叢集也可以正確測試。Gor 還支援根據Regex過濾流量,這意味著可以單獨測試某個 API 服務。還可以修改 HTTP 要求頭,比如替換 User-Agent, 或者增加某些 HTTP Header 。
Gor 還可以把請求記錄到檔案,以備回放和分析。Gor 支援和 Elasticsearch 整合,將流量存入 ES 進行即時分析。
Gor的安裝
二進位版本
官方先行編譯版本使用比較簡單,開箱即用。
通過以下地址下載最新版本
https://github.com/buger/gor/releases
Linux
$ wget https://github.com/buger/gor/releases/download/v0.12.1/gor_0.12.1_x64.tar.gz$ tar xzvf gor_0.12.1_x64.tar.gz$ cp gor /usr/local/bin
Mac
$ wget https://github.com/buger/gor/releases/download/v0.12.1/gor_0.12.1_mac.tar.gz$ tar xzvf gor_0.12.1_mac.tar.gz
編譯安裝
搭建標準的Go語言環境,可參考http://golang.org/doc/code.html
並設定$GOPATH環境變數
擷取原始碼
$ go get github.com/buger/gor
編譯
$ cd $GOPATH/src/github.com/buger/gor$ go build
編譯完成會產生一個gor二進位檔案。
Gor實踐
效能測試
可以將流量複製到檔案,然後再對他們進行回放。回放的時候,流量會維持原始的時間間隔。如果你使用了百分比來進行速率限制,那麼回放的速率會相應的增加或減少。有了這種速率限制,gor就可以用來進行壓力測試。
#write to filegor --input-raw :80 --output-file requests.log#read from filegor --input-file requests.gor --output-http"http://staging.com"
- 流量複製到檔案
可以使用時間戳命名錄製檔案,預設情況下,檔案是按“塊”儲存的,即檔案大小到達上限後,添加尾碼,並建立另一個檔案,如下gor ... --output-file %Y%m%d.log#append false20140608_0.log20140608_1.log20140609_0.log20140609_1.log
預設是按“塊”隱藏檔的方式,但是可以參數配置,--output-file-append,使用之後如下gor ... --output-file %Y%m%d.log --output-file-append#append true20140608.log20140609.log
時間格式檔案名的配置說明:%Y: year including the century (at least 4 digits)%m: month of the year (01..12)%d: Day of the month (01..31)%H: Hour of the day, 24-hour clock (00..23)%M: Minute of the hour (00..59)%S: Second of the minute (00..60)
預設格式是%Y%m%d%H
- 流量回放
目前,這種方式只支援"input-file",而且只能用百分比去控制回放速率。請注意,這個回放的速率比例是相對於input的。即按照錄下來的流量的時間戳記去進行回放。# Replay from file on 2x speedgor --input-file "requests.gor|200%" --output-http "staging.com"
上面的命令例子,是以2倍的速率回放。如果“input-flie”是多個檔案,可以用正則去匹配,如“request*.gor|200%”
配合如下配置參數,可以更好的體現壓力測試的效果。
--input-file-loop 重複迴圈執行input-file
--exit-after 30s 在30s後停止,可以控制壓力測試的時間。分鐘的單位是m
效能測試是gor比較常見的用途,其他常用命令參考“Gor常見命令”
Gor常用命令
簡單的HTTP流量複製
$ gor --input-raw :80 --output-http "http://staging.com"
HTTP流量複製頻率控制(擷取每秒超過10個請求)
$ 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.
自訂一些流量複製的參數
$ gor --input-raw :80 --output-http 192.168.2.6:8000 --http-allow-method POST --http-set-header 'User-Agent: Gor' -output-http-workers=1 -http-allow-url test.php
將流量複製兩份到不同的測試服務
$ gor --input-tcp :28020 --output-http "http://staging.com" --output-http "http://dev.com"
將流量像負載平衡一樣分配到不同的伺服器
$ gor --input-tcp :28020 --output-http "http://staging.com" --output-http "http://dev.com" --split-output true
Gor配置參數
$ gor --help-cpuprofile stringwrite cpu profile to file-debug verbose開啟debug模式,顯示所有介面的流量-http-allow-header value用一個Regex來匹配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一個Regex用來匹配url, 用來過濾完全符合的的url,在此之外的都被過濾掉gor --input-raw :8080 --output-http staging.com --http-allow-url ^www. (default [])-http-disallow-header value用一個Regex來匹配http頭部,匹配到的請求會被拒絕掉gor --input-raw :8080 --output-http staging.com --http-disallow-header "User-Agent: Replayed by Gor" (default [])-http-disallow-url value用一個Regex來匹配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 valueTakes 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 valueRewrite 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 valueInject additional headers to http reqest:gor --input-raw :8080 --output-http staging.com --http-set-header 'User-Agent: Gor' (default [])-http-set-param valueSet 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 valueUsed 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 9000gor --input-http :9000 --output-http staging.com (default [])-input-raw valueCapture traffic from given port (use RAW sockets and require *sudo* access):# Capture traffic from 8080 portgor --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 staginggor --input-tcp :28020 --output-http staging.com (default [])-memprofile stringwrite memory profile to this file-middleware stringUsed 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 addressgor --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 intgor預設是動態擴充工作者數量,你也可以指定固定數量的工作者-output-tcp value用來在多個gor之間流轉流量# Listen for requests on 80 port and forward them to other Gor instance on 28020 portgor --input-raw :80 --output-tcp replay.local:28020 (default [])-output-tcp-stats每5秒鐘報告一次tcp輸出隊列的狀態-split-output trueBy default each output gets same traffic. If set to true it splits traffic equally among all outputs.-stats開啟輸出隊列的狀態-verboseTurn on more verbose output