網(wǎng)站設(shè)計(jì)與編輯網(wǎng)站推廣的技術(shù)有哪些
目錄
一、GoReplay環(huán)境搭建
1、Mac、Linux安裝GoReplay環(huán)境
二、GoReplay錄制與重播
1、搭建練習(xí)接口
2、錄制命令
3、重播命令
三、GoReplay單個(gè)命令
1、常用命令
2、其他命令
3、命令示例
4、性能測(cè)試
5、正則表達(dá)式
四、gorepaly組合命令
1、組合命令實(shí)例
2、gorepaly注意事項(xiàng)
一、GoReplay環(huán)境搭建
1、Mac、Linux安裝GoReplay環(huán)境
1,項(xiàng)目下載地址:
https://github.com/buger/goreplay/releases/tag/1.3.3
2,mac、Linux可以直接在終端輸入
curl -L -O https://github..com/buger/goreplay/releases/download/1.3.3/gor_1.3.3_mac.tar.gz
3,解壓壓縮包
tar -zxvf gor_1.3.3_mac.tar.gz
4,配置環(huán)境變量,mac、Linux修改/ect/profile文件,在末尾添加
# 配置goreplay環(huán)境變量
GOR_HOME="yourPath/goreplay"
export PATH="$GOR_HOME:$PATH"
5,驗(yàn)證環(huán)境,顯示版本號(hào)就安裝完成
gor version
二、GoReplay錄制與重播
1、搭建練習(xí)接口
你可以通過(guò)調(diào)用快速啟動(dòng)服務(wù)器gor file-server :8000
,這將在端口上啟動(dòng)當(dāng)前目錄的簡(jiǎn)單文件服務(wù)器8000
gor file-server :8000
2、錄制命令
1,錄制所有http請(qǐng)求,以下命令是錄制5000端口全部的http請(qǐng)求,接受之前的錄制文件./log/logrequests_0.gor,并且把新的錄制文件輸出到./log/logrequests.gor文件,
請(qǐng)注意,默認(rèn)情況下 GoReplay 不跟蹤響應(yīng),您可以使用--output-http-track-response
選項(xiàng)啟用它們,在文件名中使用日期變量:%Y-%m-%d-%H
sudo gor --input-raw 127.0.0.1:5000 --output-stdout --output-file='./log/logrequests.gor' -output-file-append --output-file-max-size-limit "4294967296"
--input-raw
- 用于捕獲HTTP流量,您應(yīng)該指定IP地址或接口和應(yīng)用程序端口。有關(guān)捕獲和重放流量的更多信息。--input-file
- 接受之前使用 錄制的文件--output-file
。有關(guān)從文件保存和重播的更多信息
3、重播命令
1,下列這行命令展示了使用錄制的文件重播請(qǐng)求,所有記錄的請(qǐng)求都到達(dá)第二個(gè)服務(wù)器,并且它們將以與記錄時(shí)相同的順 序和完全相同的時(shí)間重播。--input-file參數(shù)接受錄制的文件,--output-http參數(shù)接受需要重播的服務(wù)器,出現(xiàn)FileInput: end of file 提示,說(shuō)明重播完成
gor --input-file='./log/logrequests_0.gor' --output-http='http://127.0.0.1:5000'
三、GoReplay單個(gè)命令
1、常用命令
當(dāng)您需要僅捕獲流量的特定部分(例如 API 請(qǐng)求)時(shí),匹配非常有用??梢园?URL、HTTP 標(biāo)頭或 HTTP 方法進(jìn)行匹配,匹配方式使用正則表達(dá)式。
-http-allow-header value 根據(jù)請(qǐng)求頭匹配,其他內(nèi)容將被排除
-http-allow-method value 根據(jù)請(qǐng)求方式匹配,其他內(nèi)容將被排除
-http-allow-url value 根據(jù)請(qǐng)求url匹配,其他內(nèi)容將被排除
-http-disallow-header value 根據(jù)請(qǐng)求頭匹配,其他內(nèi)容將被記錄
-http-disallow-url value 根據(jù)請(qǐng)求url匹配,其他內(nèi)容將被記錄
-http-header-limiter value 根據(jù)請(qǐng)求頭,接受一部分請(qǐng)求
-http-param-limiter value 根據(jù)url,接受一部分請(qǐng)求
-http-original-host 保留原始請(qǐng)求頭,默認(rèn)gor會(huì)用--output http提供的主機(jī)替換Host http頭
-http-rewrite-header value 根據(jù)匹配的內(nèi)容重寫(xiě)請(qǐng)求頭
-http-rewrite-url value 根據(jù)匹配的內(nèi)容重寫(xiě)請(qǐng)求url
-http-set-header value 向請(qǐng)求中添加額外的請(qǐng)求頭
-http-set-param value 設(shè)置請(qǐng)求中的param參數(shù),如果已經(jīng)存在,將會(huì)被覆蓋
-input-file value 從文件讀取請(qǐng)求
-input-file-loop 循環(huán)讀取文件,一般用于性能測(cè)試
-input-raw value 從給定端口捕獲流量,需要root權(quán)限
-input-tcp-secure 啟用TLS證書(shū),需要指定證書(shū)跟密鑰
-input-tcp-certificate string TLS開(kāi)啟時(shí),指定的證書(shū)路
-input-tcp-certificate-key string TLS開(kāi)啟時(shí),指定的密鑰路徑
-output-file value 將請(qǐng)求寫(xiě)入文件
-output-file-queue-limit int?區(qū)塊隊(duì)列的長(zhǎng)度。默認(rèn)值:256
-output-file-size-limit value?每個(gè)區(qū)塊的大小。默認(rèn)值:32mb
-output-http value? 將傳入請(qǐng)求轉(zhuǎn)發(fā)到給定的http地址
--output-http-track-response 默認(rèn)情況下 GoReplay 不跟蹤響應(yīng),加上這個(gè)參數(shù)跟蹤響應(yīng)
--input-raw-track-response 默認(rèn)情況下input-raw
不攔截響應(yīng),僅攔截請(qǐng)求。您可以加這個(gè)參數(shù)開(kāi)啟響應(yīng)跟蹤。啟用后,您將能夠訪問(wèn)中間件和output-file
--input-file-dry-run 試運(yùn)行模式,來(lái)預(yù)覽需要多長(zhǎng)時(shí)間以及給定文件輸入中有多少個(gè)請(qǐng)求。它還會(huì)告訴您有用的信息,例如請(qǐng)求之間的最短和最長(zhǎng)時(shí)間,以及第一次請(qǐng)求的時(shí)間。
--input-raw-max-wait 跳過(guò)大的延遲,選項(xiàng)(以秒為單位),該選項(xiàng)允許跳過(guò)錄制文件中的長(zhǎng)時(shí)間停頓。
--input-raw-allow-incomplete ?如果打開(kāi),Gor將記錄丟失數(shù)據(jù)包的HTTP消息
2、其他命令
-input-raw-engine libpcap?選擇libpcap(默認(rèn))或者`raw_socket`攔截流量
-output-http-debug? 啟用http調(diào)試輸出。
-input-raw-realip-header string 如果不為空,默認(rèn)在請(qǐng)求頭加上實(shí)際ip,X-Real-IP
-input-raw-track-response 如果啟用,Gor將跟蹤請(qǐng)求之外的響應(yīng),并且它們將可用于中間件和文件輸出
-input-kafka-host string 向Kafka發(fā)送請(qǐng)求和響應(yīng)統(tǒng)計(jì)信息
-input-kafka-json-format 啟動(dòng)表示消息是json格式而不是GoReplay格式
-input-kafka-topic string 向Kafka發(fā)送請(qǐng)求和響應(yīng)統(tǒng)計(jì)信息
-output-kafka-host string? 從Kafka讀取請(qǐng)求和響應(yīng)統(tǒng)計(jì)信息
-output-kafka-json-format? 如果啟用,它將把消息從GoReplay文本格式序列化為JSON
-output-kafka-topic string 從Kafka讀取請(qǐng)求和響應(yīng)統(tǒng)計(jì)信息
-input-dummy value 用于測(cè)試輸出。每1s發(fā)出'get /'請(qǐng)求
-output-file-append ?刷新的塊是否附加到存在文件,只保留一個(gè)流量文件
-output-file-flush-interval duration?強(qiáng)制刷新文件緩沖區(qū)的時(shí)間間隔,默認(rèn)為1s,一般不需要改動(dòng)
-output-http-elasticsearch string 向ElasticSearch發(fā)送請(qǐng)求和響應(yīng)統(tǒng)計(jì)信息
-output-http-redirects int 啟用重定向的頻率
-output-http-response-buffer int HTTP響應(yīng)緩沖區(qū)大小,此大小之后的所有數(shù)據(jù)都將被丟棄
-output-http-stats? 每5秒向控制臺(tái)報(bào)告一次http輸出隊(duì)列統(tǒng)計(jì)信息
-output-http-timeout duration?指定HTTP請(qǐng)求/響應(yīng)超時(shí)。默認(rèn)情況下為5s
-output-http-track-response 如果啟用,HTTP輸出響應(yīng)將設(shè)置為所有輸出,如stdout、file等
-output-http-workers int 以多少個(gè)協(xié)程同時(shí)產(chǎn)生http請(qǐng)求,默認(rèn)是動(dòng)態(tài),官方文檔顯示無(wú)限制,實(shí)際代碼中設(shè)置了10,這塊有爭(zhēng)議
-output-null?用于測(cè)試輸入。刪除所有請(qǐng)求
-output-stdout?用于測(cè)試輸入。只是將來(lái)自輸入的數(shù)據(jù)打印到控制臺(tái)。
-output-tcp value?用于Gor實(shí)例之間的內(nèi)部通信sh
-output-tcp-secure 使用TLS安全連接–另一端的輸入文件也應(yīng)該打開(kāi)TLS
-output-tcp-stats?每5秒向控制臺(tái)報(bào)告一次TCP輸出隊(duì)列統(tǒng)計(jì)信息
-verbose 啟用更詳細(xì)的輸出
3、命令示例
命令區(qū)分大小寫(xiě),參數(shù)后面的精準(zhǔn)匹配的時(shí)候不區(qū)分大小寫(xiě),用正則表達(dá)式區(qū)分大小寫(xiě)
1,提示-bash: !': event not found,輸入echo $-顯示himBH,原因是確認(rèn)是由于 H - histexpand 模式打開(kāi)了導(dǎo)致。命令行下,雙引號(hào)里面用了 ! 的話(huà),Shell 會(huì)以為要執(zhí)行歷史展開(kāi),從而導(dǎo)致報(bào)錯(cuò),解決方法:關(guān)閉 histexpand,輸入set +H,再輸入echo $-顯示himB就可以了。
2,把雙引號(hào)替換成單引號(hào)
從perf文件讀取請(qǐng)求,添加param參數(shù)goreplay=1,添加header信息'perf':'yes',保留原始請(qǐng)求頭,匹配url為^/user/authgetUserInfo$,輸出到perf.log文件
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host ?--output-file='perf.log' --http-allow-url ^/user/authgetUserInfo?.+
試運(yùn)行模式,您無(wú)需執(zhí)行實(shí)際重播即可獲取有關(guān)文件內(nèi)容的信息。僅支持goreplay1.3版本以上
例如,它可以告訴您文件中有多少個(gè)請(qǐng)求,以及重播這些請(qǐng)求需要多長(zhǎng)時(shí)間。
報(bào)告示例:
gor --input-file=流量文件 --output-stdout --input-file-dry-run
找到的記錄:192
格式錯(cuò)誤的記錄:<nil>
已處理的文件:1
處理的字節(jié)數(shù):88512
最大等待時(shí)間:71.369ms
最短等待時(shí)間:15.884ms
首次等待:55.401ms
以目前的速度重放需要7.82033秒。
找到0條時(shí)間戳不正常的記錄
添加請(qǐng)求頭,goreplay:1
goreplay --input-file='perf' --http-original-host ?--output-file='perf.log' --http-set-header 'goreplay:1'
添加param參數(shù),perf=1
goreplay --input-file='perf' --http-original-host --output-file='perf.log' --http-set-param 'goreplay=1'
匹配header的Host字段包含baidu.com
goreplay --input-file='perf' --http-original-host ?--output-file='perf.log' --http-allow-header '^Host: .*.baidu.com.*'
匹配url為/user開(kāi)頭的所有接口,后面路徑包含空用*,不包含空用+,[^\/]表示除了匹配/所有的字符
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host ?--output-file='perf.log' --http-allow-url ‘^\/user.+’
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^\/user/[^\/]'
匹配以getUserInfo結(jié)尾的所有接口
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host ?--output-file='perf.log' --http-allow-url ‘^.*getUserInfo?.+’
匹配url為/user開(kāi)頭,排除結(jié)尾是/getUserInfo的所有接口,輸出到perf.log文件
以下是用--http-allow-url搭配--http-disallow-url參數(shù)組合匹配的結(jié)果,同時(shí)滿(mǎn)足a跟b兩個(gè)條件,可以正常匹配?
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host ?--output-file='perf.log' --http-allow-url ’^\/user.*$' --http-disallow-url '.*getUserInfo$‘
更新頭部信息跟param參數(shù),如果參數(shù)存在,則更新,如果不存在,則添加,不能刪除
goreplay --input-file='perf_0.log' --http-set-param 'goreplay=0' --http-set-header 'perf':'no' --http-original-host ?--output-file='perf.log'?
重寫(xiě)請(qǐng)求url,匹配/user開(kāi)頭的url重寫(xiě)為/api/user開(kāi)頭,當(dāng)重寫(xiě)跟匹配url一起時(shí),先匹配url再重寫(xiě)url,需要匹配的url是重寫(xiě)之前的url
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' ?--http-rewrite-url '/user/([^\/]+):/api/user/$1' --http-allow-url '^\/user.*$'
重寫(xiě)版本號(hào),user重寫(xiě)為userv2
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-rewrite-url '^/user/([^/]):/userv2/$1' --http-allow-url '^/user/[^/]'
匹配/user/orders/detail開(kāi)頭,結(jié)尾是大寫(xiě)字母+數(shù)字,8到18位的字符串
goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^/user/orders/detail/[A-Z0-9]{8,15}'
可以同時(shí)匹配到,/user/orders/detail/LBL67047,/user/orders/detail/GSHN7W61400M120,用^/user/orders/detail/[a-z0-9]{8,15},不能匹配大寫(xiě)字母
4、性能測(cè)試
- 以50%的速度回放
- goreplay --input-file='perf'? --http-original-host ?--output-tcp '127.0.0.1:5000:50%'??
- 以秒50的速度回放
- goreplay --input-file='perf'? --http-original-host ?--output-tcp '127.0.0.1:5000|50'??
- 文件回放完繼續(xù)循環(huán)
- goreplay --input-file='perf'? --http-original-host ?--output-tcp '127.0.0.1:5000'? --input-file-loop
- 從文件讀取輸出到http
- goreplay --input-file 'log_0.log' --output-http '127.0.0.1:5000' --output-stdout?
- 從文件讀取,輸出到http,同時(shí)指定python中間件處理
- goreplay --input-file 'log_0.log' --output-http '127.0.0.1:5000' --output-stdout --middleware 'python3 middleware.py'
5、正則表達(dá)式
- 注意:goreplay無(wú)論哪個(gè)版本都不支持正反向正向預(yù)查和負(fù)向預(yù)查
- 匹配以/user開(kāi)頭,^/user
- 匹配以/user結(jié)尾,/user$
- 匹配1個(gè)或1個(gè)以上,+
- 匹配0,1或1個(gè)以上的,*
- 匹配0或者1個(gè),最多一個(gè)多,?
- 匹配否定字符,[^]表示匹配任何字符集包括\n,[^abc]表示匹配非a或者b或者c的字符集,匹配u/s/e/r中的任一字符,[user]
- 匹配a-z區(qū)間所有的大小寫(xiě)字母,[a-z][A-Z]
- 匹配所有的字母下劃線,/\w\g
- 精準(zhǔn)匹配以/abt開(kāi)頭/userinfo結(jié)尾,^/abt/userinfo$,可以匹配到/abt/userinfo,不能匹配到/abt/userinfo/a, /a/abt/userinfo,/abt/a/userinfo
- 匹配以/abt開(kāi)頭/userinfo結(jié)尾,中間至少一個(gè)路徑,^/abt/\w+/userinfo$,匹配/abt/aaa/userinfo,不能匹配/abt/userinfo,匹配以/abt開(kāi)頭/userinfo結(jié)尾,中間0-1一個(gè)路徑,^/abt/\w*/userinfo$,匹配abt/aaa/userinfo,abt/userinfo
- 匹配/user/orders/detail接口結(jié)尾是大寫(xiě)字母跟數(shù)字16位組合,^/user/orders/detail/[A-Z0-9]+$,/user/orders/detail/GSHN7Q02C002006
- 匹配以'/user'開(kāi)頭并且不以'/auth/getUserInfo'結(jié)尾的任意字符串,
^\/user(?!\/auth\/getUserInfo).*$ (不能在gor使用)
- 匹配,/user/orders/track/GSHN7B38R00NGA4,/user/auth/mc/getKey,/user/auth,排除,/user/auth/getUserInfo
四、gorepaly組合命令
1、組合命令實(shí)例
- 這里用到了改變速率命令,以500%的速度輸出用|500%,以每秒500個(gè)請(qǐng)求輸出用:500
如果輸出的文件名稱(chēng)跟時(shí)間相關(guān),輸出的文件名優(yōu)先級(jí)高,比如14跟15點(diǎn)都是同一個(gè)快內(nèi),但是文件名會(huì)拆分成兩個(gè)
用--output-file-queue-limit 0設(shè)置隊(duì)列為0
gor --input-file 'perf|500%' --output-file '%Y-%m-%d-%H.log' --http-disallow-url '^/user/orders/detail/[A-Z0-9]{8,15}$' --http-disallow-url '^/\w.*.html$' ?--output-file-queue-limit 0 - 用命令匹配url同時(shí)允許多個(gè)url,允許a-url,同時(shí)允許b-url,匹配的結(jié)果會(huì)包括aurl或者b-url的所有url,url=a+b
gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-allow-url '^/[a-zA-Z]+/auth/[a-zA-Z]+?.+$' --output-file-queue-limit 0 - 用命令匹配url同時(shí)不允許多個(gè)url,不允許a-url,不同時(shí)允許b-url,匹配的結(jié)果會(huì)包括除了滿(mǎn)足a-url或者b-url的所有url,url=url-(a+b)
- gor --input-file 'perf|2000%' --output-file 'perf.log' --http-disallow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-disallow-url '^/[a-zA-Z]+/auth/[a-zA-Z]+?.+$' --output-file-queue-limit 0
- 用命令匹配url一個(gè)允許一個(gè)不允許,允許a-url,不同時(shí)允許b-url,匹配的結(jié)果會(huì)包括滿(mǎn)足a-url減去b-url的所有url,url=a-b
- gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-disallow-url '^/[a-zA-Z]+/auth/[a-zA-Z]+?.+$' --output-file-queue-limit 0
- 用命令匹配允許url并且重寫(xiě)url跟header,允許a-url,允許b條件,重寫(xiě)a-url為/api/a-url,重寫(xiě)header為User-Agent: gor,允許處理原始數(shù)據(jù),然后處理重寫(xiě)url跟header,輸出后的內(nèi)容,url=/api/a+b,header=重寫(xiě)后的a+重寫(xiě)后的b
- gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-allow-url '^/pdsearch/[0-9a-zA-Z]+/.+$' ?--http-rewrite-url '(^/user/[a-zA-Z]+/[a-zA-Z]+?.+$):/api$1' --http-set-header 'User-Agent':'gor' --output-file-queue-limit 0
- 從url錄制所有的請(qǐng)求,需要root權(quán)限
- sudo gor -input-raw '127.0.0.1:5000' --output-file 'test.gor' ?--output-stdout --output-file-queue-limit 0
- gor命令搭配中間件處理
- gor --input-file 'test.gor|800%' --output-http '127.0.0.1:5000' --output-stdout --middleware 'python3 middleware.py'
2、gorepaly注意事項(xiàng)
1,gor錄制的時(shí)候,流量會(huì)存在不完整的情況,如果直接使用中間件處理,容易報(bào)錯(cuò)或者出現(xiàn)異常,如果出現(xiàn)異常后,沒(méi)有日志返回結(jié)束或者nohup.txt沒(méi)有返回,但是gor進(jìn)程已經(jīng)結(jié)束了,這種情況需要手動(dòng)關(guān)閉node中間件進(jìn)程
2,出現(xiàn)異常流量的時(shí)候,建議更換流量文件或者先用gor回放到文件,然后在使用回放后的文件用中間件處理
3,回放時(shí)直接使用中間件&gor命令回放到服務(wù)器時(shí),會(huì)消耗部分性能,比直接從流量文件回放效率低,建議流量文件先使用中間件或者命令回放一次到文件,然后直接使用文件回放到服務(wù)器,這樣效率較高
4,錄制的流量包體過(guò)大,需要加參數(shù),--input-raw-override-snaplen
5、 回放流量的時(shí)候,有時(shí)候會(huì)流量波動(dòng)大,偶爾流量比較小,需要加上參數(shù)--input-file-max-wait=200ms,允許跳過(guò)錄制文件中的超過(guò)200ms的延遲