k6是新興的性能測試框架,比肩jmeter,另外測試腳本使用js,更加適合自動化的架構(gòu)。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供五蓮網(wǎng)站建設(shè)、五蓮做網(wǎng)站、五蓮網(wǎng)站設(shè)計、五蓮網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、五蓮企業(yè)網(wǎng)站模板建站服務(wù),十載五蓮做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
k6啟動的框架是使用golang的cli標(biāo)準框架cobra,入口函數(shù)
進入cobra框架后,我們直接查看getRunCmd,這個是命令run的入口,主要工作都是從這里開始。
重點關(guān)注初始化Runner,這個是通過js腳本,使用goja庫解析后,生成的實際執(zhí)行單元。
進入js目錄,查看Runner的結(jié)構(gòu),runner.go
Runner有一些配置屬性,另外還有方法,方法用lib.Runner的接口進行規(guī)范。
Runner有一個NewVU方法,里面定義了連接參數(shù),實現(xiàn)api測試
返回主函數(shù),在初始化完成Runner后,啟動調(diào)度器,以及做結(jié)果收集
最終封裝成一個engine
啟動測試
go語言web框架beego安裝(go mod方式)_不忘初心,方得始終-CSDN博客
重要:將bee命令放到GOROOT/bin目錄下,這步很關(guān)鍵
cp bee /usr/local/go/bin/
注:或者可以將GOPATH/bin設(shè)置為環(huán)境變量
echo ’export PATH=" PATH"' ~/.bashrc
source ~/.bashrc
router路由下方法名要大寫,訪問權(quán)限
wq保存
生效環(huán)境變量: source /etc/profile
go build -o abc.exe可指定編譯后的文件名
Golang常用環(huán)境變量說明與設(shè)置詳解
環(huán)境變量GOBIN表示我們開發(fā)程序編譯后二進制命令的安裝目錄。
當(dāng)我們使用go install命令編譯和打包應(yīng)用程序時,該命令會將編譯后二進制程序打包GOBIN目錄,一般我們將GOBIN設(shè)置為GOPATH/bin目錄。
export GOBIN=$GOPATH/bin
Go get包管理mod
windows下默認項目路徑在go安裝目錄的src下(beego)
1.先安裝Go對應(yīng)的開源Swagger相關(guān)的庫
go get?github.com/swaggo/swag/cmd/swag
go get github.com/swaggo/gin-swagger
go get?github.com/swaggo/files
go get?github.com/alecthomas/template
2.驗證是否安裝成功:swag -v
3.針對接口寫入注解
// @Summary 獲取多個標(biāo)簽
// @Tags 標(biāo)簽
// @Produce? json
// @Param name query string false "標(biāo)簽名稱" maxlength(100)
// @Param state query int false "狀態(tài)" Enums(0, 1) default(1)
// @Param page query int false "頁碼"
// @Param page_size query int false "每頁數(shù)量"
// @Success 200 {object} model.TagSwagger "成功"
// @Failure 400 {object} errcode.Error "請求錯誤"
// @Failure 500 {object} errcode.Error "內(nèi)部錯誤"
// @Router /api/v1/tags [get]
func (t Tag) List(c *gin.Context) {
}
// @Summary 新增標(biāo)簽
// @Tags 標(biāo)簽
// @Produce? json
// @Param name body string true "標(biāo)簽名稱" minlength(3) maxlength(100)
// @Param state body int false "狀態(tài)" Enums(0, 1) default(1)
// @Param created_by body string false "創(chuàng)建者" minlength(3) maxlength(100)
// @Success 200 {object} model.Tag "成功"
// @Failure 400 {object} errcode.Error "請求錯誤"
// @Failure 500 {object} errcode.Error "內(nèi)部錯誤"
// @Router /api/v1/tags [post]
func (t Tag) Create(c *gin.Context) {
}
// @Summary 更新標(biāo)簽
// @Tags 標(biāo)簽
// @Produce? json
// @Param id path int true "標(biāo)簽ID"
// @Param name body string false "標(biāo)簽名稱" minlength(3) maxlength(100)
// @Param state body int false "狀態(tài) (0為未刪除、1為已刪除)" Enums(0, 1) default(1)
// @Param modified_by body string true "修改者" minlength(3) maxlength(100)
// @Success 200 {array} model.Tag "成功"
// @Failure 400 {object} errcode.Error "請求錯誤"
// @Failure 500 {object} errcode.Error "內(nèi)部錯誤"
// @Router /api/v1/tags/{id} [put]
func (t Tag) Update(c *gin.Context) {
}
4.針對整個項目進行注解,直接在main方法寫入如下注解
//@title 項目名稱
//@version 1.0
//@description 這里是描述
func main() {
5.生成執(zhí)行 swag init
這時會在我項目的docs文件夾下面生成docs.go、swagger.json、swagger.yaml三個文件
6.要在routers中進行默認初始化和注冊對應(yīng)的路由:
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
同時要引用 _"blog-service/docs" ,不然會報錯
7.查看接口文檔 :
8.ok,完成
? 何為框架:
框架一直是敏捷開發(fā)中的利器,能讓開發(fā)者很快的上手并做出應(yīng)用,甚至有的時候,脫離了框架,一些開發(fā)者都不會寫程序了。成長總不會一蹴而就,從寫出程序獲取成就感,再到精通框架,快速構(gòu)造應(yīng)用,當(dāng)這些方面都得心應(yīng)手的時候,可以嘗試改造一些框架,或是自己創(chuàng)造一個。
Gin是一個golang的微框架,封裝比較優(yōu)雅,API友好,源碼注釋比較明確,已經(jīng)發(fā)布了1.0版本。具有快速靈活,容錯方便等特點。其實對于golang而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯。框架更像是一些常用函數(shù)或者工具的集合。借助框架開發(fā),不僅可以省去很多常用的封裝帶來的時間,也有助于團隊的編碼風(fēng)格和形成規(guī)范。
(1)首先需要安裝,安裝比較簡單,使用go get即可
go get github.com/gin-gonic/gin
如果安裝失敗,直接去Github clone下來,放置到對應(yīng)的目錄即可。
(2)代碼中使用:
下面是一個使用Gin的簡單例子:
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
router.Run(":8080") // listen and serve on 0.0.0.0:8080
}
簡單幾行代碼,就能實現(xiàn)一個web服務(wù)。使用gin的Default方法創(chuàng)建一個路由handler。然后通過HTTP方法綁定路由規(guī)則和路由函數(shù)。不同于net/http庫的路由函數(shù),gin進行了封裝,把request和response都封裝到gin.Context的上下文環(huán)境。最后是啟動路由的Run方法監(jiān)聽端口。麻雀雖小,五臟俱全。當(dāng)然,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法。
Gin可以很方便的支持各種HTTP請求方法以及返回各種類型的數(shù)據(jù),詳情可以前往查看。
2.1 匹配參數(shù)
我們可以使用Gin框架快速的匹配參數(shù),如下代碼所示:
冒號:加上一個參數(shù)名組成路由參數(shù)??梢允褂胏.Param的方法讀取其值。當(dāng)然這個值是字串string。諸如/user/rsj217,和/user/hello都可以匹配,而/user/和/user/rsj217/不會被匹配。
瀏覽器輸入以下測試:
返回結(jié)果為:
其中c.String是gin.Context下提供的方法,用來返回字符串。
其中c.Json是gin.Context下提供的方法,用來返回Json。
下面我們使用以下gin提供的Group函數(shù),方便的為不同的API進行分類。
我們創(chuàng)建了一個gin的默認路由,并為其分配了一個組 v1,監(jiān)聽hello請求并將其路由到視圖函數(shù)HelloPage,最后綁定到 0.0.0.0:8000
C.JSON是Gin實現(xiàn)的返回json數(shù)據(jù)的內(nèi)置方法,包含了2個參數(shù),狀態(tài)碼和返回的內(nèi)容。http.StatusOK代表返回狀態(tài)碼為200,正文為{"message": “welcome"}。
注:Gin還包含更多的返回方法如c.String, c.HTML, c.XML等,請自行了解??梢苑奖愕姆祷豀TML數(shù)據(jù)
我們在之前的組v1路由下新定義一個路由:
下面我們訪問
可以看到,通過c.Param(“key”)方法,Gin成功捕獲了url請求路徑中的參數(shù)。同理,gin也可以捕獲常規(guī)參數(shù),如下代碼所示:
在瀏覽器輸入以下代碼:
通過c.Query(“key”)可以成功接收到url參數(shù),c.DefaultQuery在參數(shù)不存在的情況下,會由其默認值代替。
我們還可以為Gin定義一些默認路由:
這時候,我們訪問一個不存在的頁面:
返回如下所示:
下面我們測試在Gin里面使用Post
在測試端輸入:
附帶發(fā)送的數(shù)據(jù),測試即可。記住需要使用POST方法.
繼續(xù)修改,將PostHandler的函數(shù)修改如下
測試工具輸入:
發(fā)送的內(nèi)容輸入:
返回結(jié)果如下:
備注:此處需要指定Content-Type為application/x-www-form-urlencoded,否則識別不出來。
一定要選擇對應(yīng)的PUT或者DELETE方法。
Gin框架快速的創(chuàng)建路由
能夠方便的創(chuàng)建分組
支持url正則表達式
支持參數(shù)查找(c.Param c.Query c.PostForm)
請求方法精準匹配
支持404處理
快速的返回給客戶端數(shù)據(jù),常用的c.String c.JSON c.Data
Fx是一個golang版本的依賴注入框架,它使得golang通過可重用、可組合的模塊化來構(gòu)建golang應(yīng)用程序變得非常容易,可直接在項目中添加以下內(nèi)容即可體驗Fx效果。
Fx是通過使用依賴注入的方式替換了全局通過手動方式來連接不同函數(shù)調(diào)用的復(fù)雜度,也不同于其他的依賴注入方式,F(xiàn)x能夠像普通golang函數(shù)去使用,而不需要通過使用struct標(biāo)簽或內(nèi)嵌特定類型。這樣使得Fx能夠在很多go的包中很好的使用。
接下來會提供一些Fx的簡單demo,并說明其中的一些定義。
1、一般步驟
大致的使用步驟就如下。下面會給出一些完整的demo
2、簡單demo
將io.reader與具體實現(xiàn)類關(guān)聯(lián)起來
輸出:
3、使用struct參數(shù)
前面的使用方式一旦需要進行注入的類型過多,可以通過struct參數(shù)方式來解決
輸出
如果通過Provide提供構(gòu)造函數(shù)是生成相同類型會有什么問題?換句話也就是相同類型擁有多個值呢?
下面兩種方式就是來解決這樣的問題。
4、使用struct參數(shù)+Name標(biāo)簽
在Fx未使用Name或Group標(biāo)簽時不允許存在多個相同類型的構(gòu)造函數(shù),一旦存在會觸發(fā)panic。
輸出
上面通過Name標(biāo)簽即可完成在Fx容器注入相同類型
5、使用struct參數(shù)+Group標(biāo)簽
使用group標(biāo)簽同樣也能完成上面的功能
輸出
基本上Fx簡單應(yīng)用在上面的例子也做了簡單講解
1、Annotated(位于annotated.go文件) 主要用于采用annotated的方式,提供Provide注入類型
源碼中Name和Group兩個字段與前面提到的Name標(biāo)簽和Group標(biāo)簽是一樣的,只能選其一使用
2、App(位于app.go文件) 提供注入對象具體的容器、LiftCycle、容器的啟動及停止、類型變量及實現(xiàn)類注入和兩者映射等操作
至于Provide和Populate的源碼相對比較簡單易懂在這里不在描述
具體源碼
3、Extract(位于extract.go文件)
主要用于在application啟動初始化過程通過依賴注入的方式將容器中的變量值來填充給定的struct,其中target必須是指向struct的指針,并且只能填充可導(dǎo)出的字段(golang只能通過反射修改可導(dǎo)出并且可尋址的字段),Extract將被Populate代替。 具體源碼
4、其他
諸如Populate是用來替換Extract的,而LiftCycle和inout.go涉及內(nèi)容比較多后續(xù)會單獨提供專屬文件說明。
在Fx中提供的構(gòu)造函數(shù)都是惰性調(diào)用,可以通過invocations在application啟動來完成一些必要的初始化工作:fx.Invoke(function); 通過也可以按需自定義實現(xiàn)LiftCycle的Hook對應(yīng)的OnStart和OnStop用來完成手動啟動容器和關(guān)閉,來滿足一些自己實際的業(yè)務(wù)需求。
Fx框架源碼解析
主要包括app.go、lifecycle.go、annotated.go、populate.go、inout.go、shutdown.go、extract.go(可以忽略,了解populate.go)以及輔助的internal中的fxlog、fxreflect、lifecycle