欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用Go語(yǔ)言實(shí)現(xiàn)流量回放工具的示例代碼

 更新時(shí)間:2022年09月05日 09:30:31   作者:AsongGo  
今天給大家推薦一款使用Go語(yǔ)言編寫(xiě)的流量回放工具?--?goreplay;工作中你一定遇到過(guò)需要在服務(wù)器上抓包的場(chǎng)景,有了這個(gè)工具就可以助你一臂之力,廢話不多,我們接下來(lái)來(lái)看一看這個(gè)工具

前言

哈嘍,大家好,我是asong

今天給大家推薦一款使用Go語(yǔ)言編寫(xiě)的流量回放工具 -- goreplay;工作中你一定遇到過(guò)需要在服務(wù)器上抓包的場(chǎng)景,有了這個(gè)工具就可以助你一臂之力,goreplay的功能十分強(qiáng)大,支持流量的放大、縮小,并且集成了ElasticSearch,將流量存入ES進(jìn)行實(shí)時(shí)分析;

廢話不多,我們接下來(lái)來(lái)看一看這個(gè)工具;

goreplay介紹與安裝

項(xiàng)目地址:https://github.com/buger/goreplay

goreplay是一個(gè)開(kāi)源網(wǎng)絡(luò)監(jiān)控工具,可以實(shí)時(shí)記錄TCP/HTTP流量,支持把流量記錄到文件或者elasticSearch實(shí)時(shí)分析,也支持流量的放大、縮小,還支持頻率限制;goreplay不是代理,無(wú)需任何代碼入侵,只需要在服務(wù)相同的機(jī)器上運(yùn)行goreplay守護(hù)程序,其會(huì)在后臺(tái)偵聽(tīng)網(wǎng)絡(luò)接口上的流量,goreplay的設(shè)計(jì)遵循 Unix 設(shè)計(jì)哲學(xué):一切都是由管道組成的,各種輸入將數(shù)據(jù)復(fù)用為輸出;可以看一下官網(wǎng)畫(huà)的架構(gòu)圖:

goreplay的安裝也比較簡(jiǎn)單,只需要在https://github.com/buger/goreplay/releases 下載對(duì)應(yīng)操作系統(tǒng)的二進(jìn)制文件即可,我的電腦是mac的:

解壓縮后就是一個(gè)二進(jìn)制文件gor,將其添加到您的環(huán)境變量中,方便我們后續(xù)的操作;

使用示例

實(shí)時(shí)流量轉(zhuǎn)發(fā)

首先我們要準(zhǔn)備一個(gè)Web服務(wù),最簡(jiǎn)單的就是用Gin 快速實(shí)現(xiàn)一個(gè)helloworld,替大家實(shí)現(xiàn)好了:https://github.com/asong2020/Golang_Dream/tree/master/code_demo/gin_demo

import?(
?"flag"
?"github.com/gin-gonic/gin"
)

var?Port?string

func?init()??{
?flag.StringVar(&Port,?"port",?"8081",?"Input?Your?Port")
}

func?main()?{
?flag.Parse()
?r?:=?gin.Default()
?r.Use()
?r1?:=?r.Group("/api")
?{
??r1.GET("/ping",?func(c?*gin.Context)?{
???c.JSON(200,?gin.H{
????"message":?"pong",
???})
??})
?}

?r.Run("localhost:"?+?Port)
}

因?yàn)橘Y源有限,這里我用一臺(tái)電腦起兩個(gè)進(jìn)程來(lái)模擬流量轉(zhuǎn)發(fā),分別啟動(dòng)兩個(gè)web服務(wù)分別監(jiān)控端口號(hào)80818082

$?go?run?.?--port="8081"
$?go?run?.?--port="8082"

服務(wù)弄好了,現(xiàn)在我們來(lái)開(kāi)啟gor守護(hù)進(jìn)程進(jìn)行流量監(jiān)聽(tīng)與轉(zhuǎn)發(fā),將8081端口的流量轉(zhuǎn)發(fā)到8082端口上:

$?sudo?gor?--input-raw?:8081?--output-http="http://127.0.0.1:8082"

現(xiàn)在我們請(qǐng)求8081端口:

$?curl?--location?--request?GET?'http://127.0.0.1:8081/api/ping'

可以看到8082端口同樣被請(qǐng)求了:

流量放大、縮小

goreplay支持將捕獲的流量存儲(chǔ)到文件中,實(shí)際工作中我們可以使用捕獲的流量做壓力測(cè)試,首先我們需要將捕獲的流量保存到本地文件,然后利用該文件進(jìn)行流量回放;

還是上面的Web程序,我們將端口8081的流量保存到本地文件:

$?sudo?gor?--input-raw?:8081?--output-file?./requests.gor

我們對(duì)8081端口執(zhí)行了5次請(qǐng)求:

然后我們對(duì)8082端口進(jìn)行流量縮小測(cè)試,縮小一倍:

gor?--input-file?"requests_0.gor"?--output-http="http://127.0.0.1:8082|50%"

調(diào)整百分比就是進(jìn)行流量放大、縮小,這里我們縮小了一倍,可以看到只有2次請(qǐng)求到了8082端口;我們可以調(diào)整流量回放的速度,比如我們調(diào)整流量以10倍速度進(jìn)行重播:

$?gor?--input-file?"requests_0.gor|1000%"?--output-http="http://127.0.0.1:8082|50%"?#?1000%就是放大10倍

流量寫(xiě)入到ElastichSearch

goreplay可以將捕獲的流量導(dǎo)出到Es中,只需要執(zhí)行如下命令:

$?gor?--input-raw?:8000?--output-http?http://staging.cm??--output-http-elasticsearch?localhost:9200/gor

我們不需要提前創(chuàng)建索引結(jié)構(gòu),他將自動(dòng)創(chuàng)建,具體結(jié)構(gòu)如下:

type?ESRequestResponse?struct?{
?ReqURL???????????????string?`json:"Req_URL"`
?ReqMethod????????????string?`json:"Req_Method"`
?ReqUserAgent?????????string?`json:"Req_User-Agent"`
?ReqAcceptLanguage????string?`json:"Req_Accept-Language,omitempty"`
?ReqAccept????????????string?`json:"Req_Accept,omitempty"`
?ReqAcceptEncoding????string?`json:"Req_Accept-Encoding,omitempty"`
?ReqIfModifiedSince???string?`json:"Req_If-Modified-Since,omitempty"`
?ReqConnection????????string?`json:"Req_Connection,omitempty"`
?ReqCookies???????????string?`json:"Req_Cookies,omitempty"`
?RespStatus???????????string?`json:"Resp_Status"`
?RespStatusCode???????string?`json:"Resp_Status-Code"`
?RespProto????????????string?`json:"Resp_Proto,omitempty"`
?RespContentLength????string?`json:"Resp_Content-Length,omitempty"`
?RespContentType??????string?`json:"Resp_Content-Type,omitempty"`
?RespTransferEncoding?string?`json:"Resp_Transfer-Encoding,omitempty"`
?RespContentEncoding??string?`json:"Resp_Content-Encoding,omitempty"`
?RespExpires??????????string?`json:"Resp_Expires,omitempty"`
?RespCacheControl?????string?`json:"Resp_Cache-Control,omitempty"`
?RespVary?????????????string?`json:"Resp_Vary,omitempty"`
?RespSetCookie????????string?`json:"Resp_Set-Cookie,omitempty"`
?Rtt??????????????????int64??`json:"RTT"`
?Timestamp????????????time.Time
}

goreplay提供了太多的功能,就不一一介紹了,可以通過(guò)執(zhí)行help命令查看其他高級(jí)用法,每個(gè)命令都提供了例子,入手很快;

$?gor?-h
Gor?is?a?simple?http?traffic?replication?tool?written?in?Go.?Its?main?goal?is?to?replay?traffic?from?production?servers?to?staging?and?dev?environments.
Project?page:?https://github.com/buger/gor
Author:?<Leonid?Bugaev>?leonsbox@gmail.com
Current?Version:?v1.3.0

??-copy-buffer-size?value
?????Set?the?buffer?size?for?an?individual?request?(default?5MB)
??-cpuprofile?string
?????write?cpu?profile?to?file
??-exit-after?duration
?????exit?after?specified?duration
??-http-allow-header?value
?????A?regexp?to?match?a?specific?header?against.?Requests?with?non-matching?headers?will?be?dropped:
???????gor?--input-raw?:8080?--output-http?staging.com?--http-allow-header?api-version:^v1
??-http-allow-method?value
?????Whitelist?of?HTTP?methods?to?replay.?Anything?else?will?be?dropped:
??????gor?--input-raw?:8080?--output-http?staging.com?--http-allow-method?GET?--http-allow-method?OPTIONS
??-http-allow-url?value
?????A?regexp?to?match?requests?against.?Filter?get?matched?against?full?url?with?domain.?Anything?else?will?be?dropped:
???????gor?--input-raw?:8080?--output-http?staging.com?--http-allow-url?^www.
??-http-basic-auth-filter?value
?????A?regexp?to?match?the?decoded?basic?auth?string?against.?Requests?with?non-matching?headers?will?be?dropped:
???????gor?--input-raw?:8080?--output-http?staging.com?--http-basic-auth-filter?"^customer[0-9].*"
??-http-disallow-header?value
?????A?regexp?to?match?a?specific?header?against.?Requests?with?matching?headers?will?be?dropped:
???????gor?--input-raw?:8080?--output-http?staging.com?--http-disallow-header?"User-Agent:?Replayed?by?Gor"
???????..........省略

goreplay基本實(shí)現(xiàn)原理

goreplay底層也是調(diào)用Libpcap,Libpcap即數(shù)據(jù)包捕獲函數(shù)庫(kù),tcpdump也是基于這個(gè)庫(kù)實(shí)現(xiàn)的,LibpcapC語(yǔ)言寫(xiě)的,Go語(yǔ)言不能直接調(diào)用C語(yǔ)言,需要使用CGo,所以goreplay可以直接使用谷歌的包github.com/google/gopacket,提供了更方便的操作接口,基于goreplay封裝了input、output,在啟動(dòng)的時(shí)候通過(guò)命令行參數(shù)解析指定的input、output,input讀取數(shù)據(jù)寫(xiě)入到output中,默認(rèn)是一個(gè)input復(fù)制多份,寫(xiě)多個(gè)output,多個(gè)input之前是并行的,但是單個(gè)intput到多個(gè)output是串行的,所以input-file會(huì)有性能瓶頸,壓測(cè)的時(shí)候需要開(kāi)多個(gè)進(jìn)程同時(shí)跑來(lái)達(dá)到壓測(cè)需求;

goreplay的源碼有點(diǎn)多,就不在這里分析了,大家感興趣哪一部分可以從gor.gomain函數(shù)入手,看自己感興趣的部分就可以了;

總結(jié)

goreplay提供的玩法非常豐富,合理的改造可以做成回歸工具幫助我們確保服務(wù)的穩(wěn)定性,別放過(guò)這個(gè)自我展現(xiàn)的機(jī)會(huì)~。

以上就是利用Go語(yǔ)言實(shí)現(xiàn)流量回放工具的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言流量回放工具的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go語(yǔ)言結(jié)構(gòu)體指針操作示例詳解

    go語(yǔ)言結(jié)構(gòu)體指針操作示例詳解

    這篇文章主要為大家介紹了go語(yǔ)言結(jié)構(gòu)體指針操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go語(yǔ)言安裝和GoLand2021最全超詳細(xì)安裝教程

    Go語(yǔ)言安裝和GoLand2021最全超詳細(xì)安裝教程

    Go語(yǔ)言和GoLand的關(guān)系好比于java和idea、python和pycharm,因此我們需要先安裝好Go語(yǔ)言后才能安裝GoLand。它的安裝和java,python的安裝大同小異,好了,下面給大家?guī)?lái)了GoLand2021安裝教程,需要的朋友參考下吧
    2021-08-08
  • Go使用sync.Map來(lái)解決map的并發(fā)操作問(wèn)題

    Go使用sync.Map來(lái)解決map的并發(fā)操作問(wèn)題

    在 Golang 中 map 不是并發(fā)安全的,sync.Map 的引入確實(shí)解決了 map 的并發(fā)安全問(wèn)題,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2021-10-10
  • Go語(yǔ)言中map集合的具體使用

    Go語(yǔ)言中map集合的具體使用

    本文主要介紹了Go語(yǔ)言中map集合的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 基于golang時(shí)間轉(zhuǎn)換的問(wèn)題

    基于golang時(shí)間轉(zhuǎn)換的問(wèn)題

    下面小編就為大家?guī)?lái)一篇基于golang時(shí)間轉(zhuǎn)換的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 一文帶你搞懂Golang如何正確退出Goroutine

    一文帶你搞懂Golang如何正確退出Goroutine

    在Go語(yǔ)言中,Goroutine是一種輕量級(jí)線程,它的退出機(jī)制對(duì)于并發(fā)編程至關(guān)重要,下午就來(lái)介紹幾種Goroutine的退出機(jī)制,希望對(duì)大家有所幫助
    2023-06-06
  • 詳解Go語(yǔ)言中for循環(huán),break和continue的使用

    詳解Go語(yǔ)言中for循環(huán),break和continue的使用

    這篇文章主要通過(guò)一些示例為大家介紹一下Go語(yǔ)言中for循環(huán)、break和continue的基本語(yǔ)法以及使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-06-06
  • golang對(duì)etcd存取和數(shù)值監(jiān)測(cè)的實(shí)現(xiàn)

    golang對(duì)etcd存取和數(shù)值監(jiān)測(cè)的實(shí)現(xiàn)

    這篇文章主要介紹了golang對(duì)etcd存取和數(shù)值監(jiān)測(cè)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解

    Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go設(shè)計(jì)模式之代理模式講解和代碼示例

    Go設(shè)計(jì)模式之代理模式講解和代碼示例

    這篇文章主要介紹了Go代理模式,代理是一種結(jié)構(gòu)型設(shè)計(jì)模式, 讓你能提供真實(shí)服務(wù)對(duì)象的替代品給客戶端使用,本文將對(duì)Go代理模式進(jìn)行講解以及代碼示例,需要的朋友可以參考下
    2023-07-07

最新評(píng)論