golang微服務框架設計工具:Goa
來自: http://kaiq.me/2016/01/20/go/Goa1-golang-goa/
Goa
RESTful go web 快速開發框架,Goa與其他go web開發框架有本質的不同,它是以框架設計為主,是 Design-based
HTTP微服務框架。
Install
首先安裝goa代碼生成工具goagen
. go get github.com/goadesign/goa/goagen
goa跟goagen的關系是:goagen是工具,是goa項目的主要產物之一;如果不是修改goagen,基本不需要goa的源碼,當然也可以將整體go get下來。
update 2016-01-25
注意(這里有坑):這里一定是從goadesign/goa/goagen
中執行go get
,不可以直接go get github.com/goadesign/goa
,因為這樣會get到一個名為raphael
的包,與goa package
會產生沖突,可能與Goa
版本變更較頻繁有關。如果發生版本沖突,移步#216
安裝代碼依賴自動import工具:
go get golang.org/x/tools/cmd/goimports
注意問題
測試代碼按照Github上進行就可,提一下官網沒說的幾個坑:
1.HTTP Request IDs
這個其實不算坑,是goa的功能之一,但在測試過程中如果沒有具體設置驗證中間件,便伊始會報錯。測試過程中可以對此做屏蔽:
在測試項目main.go
文件中:
123 |
// service.Use(middleware.RequestID())// service.Use(middleware.LogRequest())// service.Use(middleware.Recover()) |
update:2016-01-19
goa官方提供middleware
的簡單實現,提供日志管理,包括請求、回復、ID、故障記錄等功能。需要在GOPATH中get包:
go get github.com/raphael/goa-middleware
由于該包是以中間件形式與goa合用,因此不會直接被build。這樣上段代碼可以不用屏蔽,在API通信時會記錄請求、測試和回復的日志信息。
2.未import package
按官方解釋,是說goa生成次代框架代碼(代碼生成的代碼)后,代碼的import功能交給了工具goimport
,但是這個工具有它的局限性,每個人設置的GOPATH數量不一,goimport只檢索其當前所在的GOPATH,所以像fmt
、strconv
這些常用但屬于go build in
的package往往引用不到,需要收到添加,或者將所有GOPATH整合為一,再將當前項目放入其src目錄中。
3.go build
過程中找不到package
這是最坑爹的,在goa官方沒有解決方案,當然坑也不是goa挖的,還是那個goimport工具自個挖的。
原因是goimport需要兼容很多golang的版本,而golang版本變更過程中發生過易址事件,當初在google.golang
下的包全部轉移到Github中,名字也由cloud
更為gcloud-golang
, 因此后期的import都是從Github中獲取的。但goimport遇到關于metadata
等次代代碼仍然吹從老地址引用,因此會在編譯時報錯。
解決方案:
從Github中獲取新包:
go get github.com/GoogleCloudPlatform/gcloud-golang
軟鏈到本地GOPATH老地址:
ln -s /$GOPATH/src/github.com/GoogleCloudPlatform/gcloud-golang /$GOPATH/src/cloud