golang微服务框架设计工具:Goa

PauMeece 9年前

来自: 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,所以像fmtstrconv这些常用但属于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