GO --微服务框架(一) goa
go get github.com/goadesign/goa
go get github.com/goadesign/goa/goagen go install github.com/goadesign/goa
go install github.com/goadesign/goa/goagen
安装好之后,就可以用help命令来查看使用方式了。

qingping.zhang@qpzhangmac ~/dev goagen --help
The goagen tool generates artifacts from a goa service design package. Each command supported by the tool produces a specific type of artifacts. For example
the "app" command generates the code that supports the service controllers. The "bootstrap" command runs the "app", "main", "client" and "swagger" commands generating the
controllers supporting code and main skeleton code (if not already present) as well as a client
package and tool and the Swagger specification for the API. Usage:
goagen [command] Available Commands:
app Generate application code
main Generate application scaffolding
client Generate client package and tool
swagger Generate Swagger
js Generate JavaScript client
schema Generate JSON Schema
gen Run third-party generator
bootstrap Equivalent to running the "app", "main", "client" and "swagger" commands. Flags:
--debug enable debug mode, does not cleanup temporary files.
-d, --design string design package import path
-o, --out string output directory (default "/Users/qingpingzhang/dev") Use "goagen [command] --help" for more information about a command.

然后需要yaml包的支持,所以需要提前安装:
go get gopkg.in/yaml.v2
必须要在GOPATH的src的目录下,新建一个目录(例如:goa.demo),然后在它下面新建一个design的子目录。
子design目录下,新建文件design.go

//design.go package design // The convention consists of naming the design
// package "design"
import (
. "github.com/goadesign/goa/design" // Use . imports to enable the DSL
. "github.com/goadesign/goa/design/apidsl"
) var _ = API("cellar", func() { // API defines the microservice endpoint and
Title("The virtual wine cellar") // other global properties. There should be one
Description("A simple goa service") // and exactly one API definition appearing in
Scheme("http") // the design.
Host("localhost:8080")
}) var _ = Resource("bottle", func() { // Resources group related API endpoints
BasePath("/bottles") // together. They map to REST resources for REST
DefaultMedia(BottleMedia) // services. Action("show", func() { // Actions define a single API endpoint together
Description("Get bottle by id") // with its path, parameters (both path
Routing(GET("/:bottleID")) // parameters and querystring values) and payload
Params(func() { // (shape of the request body).
Param("bottleID", Integer, "Bottle ID")
})
Response(OK) // Responses define the shape and status code
Response(NotFound) // of HTTP responses.
})
}) // BottleMedia defines the media type used to render bottles.
var BottleMedia = MediaType("application/vnd.goa.example.bottle+json", func() {
Description("A bottle of wine")
Attributes(func() { // Attributes define the media type shape.
Attribute("id", Integer, "Unique bottle ID")
Attribute("href", String, "API href for making requests on the bottle")
Attribute("name", String, "Name of wine")
Required("id", "href", "name")
})
View("default", func() { // View defines a rendering of the media type.
Attribute("id") // Media types may have multiple views and must
Attribute("href") // have a "default" view.
Attribute("name")
})
})

然后使用命令,来自动生成框架代码(这里需要注意,如果不加-o选项指定输出目录 , 这些代码是会生成到当前目录下的哦):

qingping.zhang@qpzhangmac ~/gocode/src/goa.demo/ goagen bootstrap -d goa.demo/design
app
app/contexts.go
app/controllers.go
app/hrefs.go
app/media_types.go
app/user_types.go
app/test
app/test/bottle.go
main.go
bottle.go
client
client/cellar-cli
client/cellar-cli/main.go
client/cellar-cli/commands.go
client/client.go
client/bottle.go
client/datatypes.go
swagger
swagger/swagger.json
swagger/swagger.yaml

尼玛,咔咔咔。。。生成好多。
框架会默认生成结构的返回值,所以,这里我们暂时不做任何修改,因为还没有介绍生成的代码目录。
所以我们直接编译,运行看看。

qingping.zhang@qpzhangmac ~/gocode/src/goa.demo go build
qingping.zhang@qpzhangmac ~/gocode/src/goa.demo ./goa.demo
2016/05/26 15:45:09 [INFO] mount ctrl=Bottle action=Show route=GET /bottles/:bottleID
2016/05/26 15:45:09 [INFO] listen transport=http addr=:8080 2016/05/26 15:46:21 [INFO] started req_id=qAWO65SPCG-1 GET=/bottles/1 from=127.0.0.1 ctrl=BottleController action=Show
2016/05/26 15:46:21 [INFO] params req_id=qAWO65SPCG-1 bottleID=1

然后再另外一个窗口发起请求,结果如下:

qingping.zhang@qpzhangmac ~ curl -i localhost:8080/bottles/1
HTTP/1.1 200 OK
Content-Type: application/vnd.goa.example.bottle
Date: Thu, 26 May 2016 07:07:40 GMT
Content-Length: 29 {"href":"","id":0,"name":""}

到这里,整个安装使用就OK来。
后面再分析,自动生成的代码目录以及如何增加自己的业务逻辑代码。
========================
update 2016.7.17
如果重复执行代码生成命令时: goagen bootstrap -d goa.demo/design
main.go 和 bottle.go 是不会重新生成的,这就保证业务逻辑代码不会被覆盖。
但若是后面新增的Action,要自己在业务逻辑代码里头,手动添加函数体代码。
========================
GO --微服务框架(一) goa的更多相关文章
- GO --微服务框架(二) goa
之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...
- [goa]golang微服务框架学习--安装使用
当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用go来写服务会遇到风格不统一,开发效率上的问题. 之前研究go的微服务架构go-kit最让人头疼的就是定义服务之后,还要写很多重复的框架代码, ...
- 基于thrift的微服务框架
前一阵开源过一个基于spring-boot的rest微服务框架,今天再来一篇基于thrift的微服务加框,thrift是啥就不多了,大家自行百度或参考我之前介绍thrift的文章, thrift不仅支 ...
- 基于spring-boot的rest微服务框架
周末在家研究spring-boot,参考github上的一些开源项目,整了一个rest微服务框架,取之于民,用之于民,在github上开源了,地址如下: https://github.com/yjmy ...
- 【GoLang】go 微服务框架 && Web框架学习资料
参考资料: 通过beego快速创建一个Restful风格API项目及API文档自动化: http://www.cnblogs.com/huligong1234/p/4707282.html Go 语 ...
- 【GoLang】golang 微服务框架 go-kit
golang-Microservice Go kit - A toolkit for microservices kubernetes go-kit_百度搜索 Peter Bourgon谈使用Go和& ...
- Java微服务框架
Java的微服务框架dobbo.spring boot.redkale.spring cloud 消息中间件RabbitMQ.Kafka.RocketMQ
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- 基于.NET CORE微服务框架 -谈谈surging API网关
1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...
随机推荐
- day02 Python 的模块,运算,数据类型以及方法
初识pyhton的模块: 什么是模块: 我的理解就是实现一个功能的函数,把它封装起来,在你需要使用的时候直接调用即可,我的印象里类似于shell 的单独函数脚本. python 的模块分为标准的和第三 ...
- 关于windows服务的编写/安装/与调试
前注: 首先,这篇文章是从网上转过来的,因为最近有个项目,需要编写一个Windows Service来定时执行程序,网上很容易找到了这篇文章,大概看了一下,文章讲的还是很详细的.不过这篇文章应该是.n ...
- 转:模式窗口showModalDialog的用法总结
模式窗口showModalDialog的用法总结 最近几天一直在处理模式窗口的问题,索性写了这篇总结,以供参考: 1.打开窗口:var handle = window.showModalDialo ...
- mysql 索引和查询优化
对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降.如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能 ...
- [PDOException] SQLSTATE[HY000] [2002] No such file or directory
编译安装PHP7之后,在安装mysql之后,用pdo操作数据库的时候,出现了此错误[PDOException] SQLSTATE[HY000] [2002] No such file or direc ...
- layui.code代码装饰器
<!doctype html><html lang="en"><head> <meta charset="UTF-8" ...
- curl保存图片
$url = 'http://p1.qhimg.com/t013dfc89f8a039122c.jpg?size=690x460'; function http_get_data($url) { $c ...
- 利用Python访问Mysql数据库
首先要明确一点,我们在Python中需要通过第三方库才能访问Mysql. 有这样几种方式:Mysql-python(即MySQLdb).pymysql.mysql-connector.Mysql-py ...
- webpack的像素转vw单位的loader插件
安装: npm i px2vw-view-loader 配置: 按以下loader格式,添加进入webpack配置文件,实现从px转换成vw,适用于移动端项目 module: { rules: [{ ...
- hihoCoder #1161 八卦的小冰
题目大意 考虑一个由 $n$ 个人构成的社交网络,其中任意两人都有一个用非负整数表示的亲密度. 初始时给出 $m$ 对人的亲密度,其余的亲密度为 $0$ . 定义此社交网络的「八卦度」为异性之间的亲密 ...