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