十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
k6是新興的性能測(cè)試框架,比肩jmeter,另外測(cè)試腳本使用js,更加適合自動(dòng)化的架構(gòu)。
創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比寧鄉(xiāng)網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式寧鄉(xiāng)網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋寧鄉(xiāng)地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴(lài)。
k6啟動(dòng)的框架是使用golang的cli標(biāo)準(zhǔn)框架cobra,入口函數(shù)
進(jìn)入cobra框架后,我們直接查看getRunCmd,這個(gè)是命令run的入口,主要工作都是從這里開(kāi)始。
重點(diǎn)關(guān)注初始化Runner,這個(gè)是通過(guò)js腳本,使用goja庫(kù)解析后,生成的實(shí)際執(zhí)行單元。
進(jìn)入js目錄,查看Runner的結(jié)構(gòu),runner.go
Runner有一些配置屬性,另外還有方法,方法用lib.Runner的接口進(jìn)行規(guī)范。
Runner有一個(gè)NewVU方法,里面定義了連接參數(shù),實(shí)現(xiàn)api測(cè)試
返回主函數(shù),在初始化完成Runner后,啟動(dòng)調(diào)度器,以及做結(jié)果收集
最終封裝成一個(gè)engine
啟動(dòng)測(cè)試
當(dāng)客戶(hù)端在 發(fā)出POST請(qǐng)求時(shí)/albums,您希望將請(qǐng)求正文中描述的專(zhuān)輯添加到現(xiàn)有專(zhuān)輯數(shù)據(jù)中。
為此,您將編寫(xiě)以下內(nèi)容:
1、編寫(xiě)代碼
a.添加代碼以將專(zhuān)輯數(shù)據(jù)添加到專(zhuān)輯列表。
在此代碼中:
1)用于Context.BindJSON 將請(qǐng)求正文綁定到newAlbum。
2) album將從 JSON 初始化的結(jié)構(gòu)附加到albums 切片。
3)向響應(yīng)添加201狀態(tài)代碼,以及表示您添加的專(zhuān)輯的 JSON。
b.更改您的main函數(shù),使其包含該router.POST函數(shù),如下所示。
在此代碼中:
1)將路徑中的POST方法與 /albumspostAlbums函數(shù)相關(guān)聯(lián)。
使用 Gin,您可以將處理程序與 HTTP 方法和路徑組合相關(guān)聯(lián)。這樣,您可以根據(jù)客戶(hù)端使用的方法將發(fā)送到單個(gè)路徑的請(qǐng)求單獨(dú)路由。
a.如果服務(wù)器從上一節(jié)開(kāi)始仍在運(yùn)行,請(qǐng)停止它。
b.從包含 main.go 的目錄中的命令行,運(yùn)行代碼。
c.從不同的命令行窗口,用于curl向正在運(yùn)行的 Web 服務(wù)發(fā)出請(qǐng)求。
該命令應(yīng)顯示添加專(zhuān)輯的標(biāo)題和 JSON。
d.與上一節(jié)一樣,使用curl檢索完整的專(zhuān)輯列表,您可以使用它來(lái)確認(rèn)添加了新專(zhuān)輯。
該命令應(yīng)顯示專(zhuān)輯列表。
當(dāng)客戶(hù)端向 發(fā)出請(qǐng)求時(shí)GET /albums/[id],您希望返回 ID 與id路徑參數(shù)匹配的專(zhuān)輯。
為此,您將:
a.在您在上一節(jié)中添加的函數(shù)下方postAlbums,粘貼以下代碼以檢索特定專(zhuān)輯。
此getAlbumByID函數(shù)將提取請(qǐng)求路徑中的 ID,然后找到匹配的專(zhuān)輯。
在此代碼中:
(1)Context.Param用于從 URL 中檢索id路徑參數(shù)。當(dāng)您將此處理程序映射到路徑時(shí),您將在路徑中包含參數(shù)的占位符。
(2)循環(huán)album切片中的結(jié)構(gòu),尋找其ID 字段值與id參數(shù)值匹配的結(jié)構(gòu)。如果找到,則將該album結(jié)構(gòu)序列化為 JSON,并將其作為帶有200 OK HTTP 代碼的響應(yīng)返回。
如上所述,實(shí)際使用中的服務(wù)可能會(huì)使用數(shù)據(jù)庫(kù)查詢(xún)來(lái)執(zhí)行此查找。
(3)如果找不到專(zhuān)輯,則返回 HTTP 404錯(cuò)誤。
b.最后,更改您的main,使其包含對(duì)router.GET的新調(diào)用,路徑現(xiàn)在為/albums/:id ,如以下示例所示。
在此代碼中:
(1)將/albums/:id路徑與getAlbumByID功能相關(guān)聯(lián)。在 Gin 中,路徑中項(xiàng)目前面的冒號(hào)表示該項(xiàng)目是路徑參數(shù)。
a.如果服務(wù)器從上一節(jié)開(kāi)始仍在運(yùn)行,請(qǐng)停止它。
b.在包含 main.go 的目錄中的命令行中,運(yùn)行代碼以啟動(dòng)服務(wù)器。
c.從不同的命令行窗口,用于curl向正在運(yùn)行的 Web 服務(wù)發(fā)出請(qǐng)求。
該命令應(yīng)顯示您使用其 ID 的專(zhuān)輯的 JSON。如果找不到專(zhuān)輯,您將收到帶有錯(cuò)誤消息的 JSON。
恭喜!您剛剛使用 Go 和 Gin 編寫(xiě)了一個(gè)簡(jiǎn)單的 RESTful Web 服務(wù)。
本節(jié)包含您使用本教程構(gòu)建的應(yīng)用程序的代碼。
是Go語(yǔ)言嗎?
Go 編譯過(guò)程 九個(gè)步驟
第一步. all.bash
% cd $GOROOT/src
% ./all.bash
第一步 all.bash 只是調(diào)用了另外兩個(gè) shell 腳本:make.bash 和run.bash。若使用 Windows 或 Plan9,其過(guò)程也基本類(lèi)似,只是腳本分別以 .bat 或 .rc 結(jié)尾。在文章的其他部分,請(qǐng)用適當(dāng)?shù)牟僮飨到y(tǒng)對(duì)應(yīng)的擴(kuò)展來(lái)補(bǔ)全命令。
第二步. make.bash
. ./make.bash --no-banner
make.bash 作為 all.bash 內(nèi)容的一部分,如果它退出也會(huì)中斷構(gòu)建過(guò)程
第三步. cmd/dist
gcc -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist cmd/dist/*.c
當(dāng)健全檢查完成后,make.bash 開(kāi)始編譯 cmd/dist。
第四步. go_bootstrap
現(xiàn)在 go_bootstrap 已經(jīng)構(gòu)建完成,make.bash 的最后一步是使用 go_bootstrap 編譯完整的 Go 標(biāo)準(zhǔn)庫(kù),包括一個(gè)完整的 go 工具用以替換。
echo "# Building packages and commands for $GOOS/$GOARCH."
"$GOTOOLDIR"/go_bootstrap install -gcflags "$GO_GCFLAGS" \
-ldflags "$GO_LDFLAGS" -v std
第五步. run.bash
現(xiàn)在 make.bash 已經(jīng)完成,回到 all.bash 的執(zhí)行,這會(huì)調(diào)用 run.bash。run.bash 的任務(wù)是編譯和測(cè)試標(biāo)準(zhǔn)庫(kù)、運(yùn)行時(shí)以及語(yǔ)言測(cè)試集。
bash run.bash --no-rebuild
由于 make.bash 和 run.bash 都會(huì)調(diào)用 go install -a std,因此需要使用 –no-rebuild 標(biāo)志來(lái)避免重復(fù)前面的步驟,–no-rebuild 跳過(guò)了第二個(gè) go install。
# allow all.bash to avoid double-build of everythingrebuild=trueif [ "$1" = "--no-rebuild" ]; then shiftelse echo '# Building packages and commands.' time go install -a -v std echofi
第六步. go test -a std
echo '# Testing packages.'
time go test std -short -timeout=$(expr 120 \* $timeout_scale)s
echo
接下來(lái) run.bash 會(huì)在標(biāo)準(zhǔn)庫(kù)里所有的包上來(lái)運(yùn)行用 testing 包編寫(xiě)的單元測(cè)試。由于 $GOPATH 和 $GOROOT 中有著相同的命名空間,所以不能直接使用 go test … 否則 $GOPATH 中的每個(gè)包也會(huì)被逐一測(cè)試,因此創(chuàng)建了一個(gè)用于標(biāo)準(zhǔn)庫(kù)中的包的別名:std。由于一些測(cè)試需要比較長(zhǎng)的時(shí)間,且會(huì)消耗大量?jī)?nèi)存,因此用 -short 標(biāo)志對(duì)一些測(cè)試進(jìn)行了過(guò)濾。
第七步. runtime 和 cgo 測(cè)試
run.bash 接下來(lái)的部分會(huì)運(yùn)行平臺(tái)對(duì) cgo 支持的測(cè)試,執(zhí)行一些性能測(cè)試,并且編譯一些伴隨 Go 發(fā)行版一起的雜項(xiàng)程序。隨著時(shí)間的流逝,這些雜項(xiàng)程序的清單會(huì)越來(lái)越長(zhǎng),那么它們也就會(huì)不可避免的被從編譯過(guò)程中悄悄剝離出去。
第八步. go run test
(xcd ../test
unset GOMAXPROCS
time go run run.go
) || exit $?
run.bash 的倒數(shù)第二步會(huì)調(diào)用在 $GOROOT 下的 test 目錄里的編譯器和運(yùn)行時(shí)的測(cè)試。他們是對(duì)于編譯器和運(yùn)行時(shí)自身的,較為低級(jí)細(xì)節(jié)的測(cè)試。會(huì)執(zhí)行語(yǔ)言規(guī)格測(cè)試,test/bugs 和 test/fixedbugs 子目錄保存有那些已經(jīng)被發(fā)現(xiàn)并被修復(fù)的問(wèn)題的獨(dú)立的測(cè)試。驅(qū)動(dòng)測(cè)試的是一個(gè)小 Go 程序 $GOROOT/test/run.go,會(huì)執(zhí)行 test 目錄里的每個(gè) .go 文件。一些 .go 文件的首行包含了指導(dǎo) run.go 對(duì)結(jié)果作出判斷的指令,例如,程序?qū)?huì)失敗,或提供一個(gè)確定的輸出隊(duì)列。
第九步. go tool api
echo '# Checking API compatibility.'
go tool api -c $GOROOT/api/go1.txt,$GOROOT/api/go1.1.txt \
-next $GOROOT/api/next.txt -except $GOROOT/api/except.txt
run.bash 的最后一步調(diào)用了 api 工具。