当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用go来写服务会遇到风格不统一,开发效率上的问题。
之前研究go的微服务架构go-kit最让人头疼的就是定义服务之后,还要写很多重复的框架代码,一直再想如何使用IDL描述服务,然后自动生成框架代码。
直到遇到老这货 goa,另外一个go的微服务框架。具体介绍看这篇,还有官网
 
这货实现了框架的代码自动生成(自动生成的代码可以热更新,因为生成代码和自己写的代码是分开的),而且理念也比较时髦,基于API设计,利用插件来扩展业务逻辑。
 
于是想想要赶紧学习玩一下。
 
假定你已经装了golang的环境。
所以,开始下载。
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
// :: [INFO] mount ctrl=Bottle action=Show route=GET /bottles/:bottleID
// :: [INFO] listen transport=http addr=: // :: [INFO] started req_id=qAWO65SPCG- GET=/bottles/ from=127.0.0.1 ctrl=BottleController action=Show
// :: [INFO] params req_id=qAWO65SPCG- bottleID=

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

 qingping.zhang@qpzhangmac  ~  curl -i localhost:/bottles/
HTTP/1.1 OK
Content-Type: application/vnd.goa.example.bottle
Date: Thu, May :: GMT
Content-Length: {"href":"","id":,"name":""}

到这里,整个安装使用就OK来。

后面再分析,自动生成的代码目录以及如何增加自己的业务逻辑代码。

========================

update 2016.7.17

如果重复执行代码生成命令时: goagen bootstrap -d goa.demo/design

main.go 和 bottle.go 是不会重新生成的,这就保证业务逻辑代码不会被覆盖。

但若是后面新增的Action,要自己在业务逻辑代码里头,手动添加函数体代码。

========================

[goa]golang微服务框架学习--安装使用的更多相关文章

  1. [goa]golang微服务框架学习(二)-- 代码自动生成

    之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...

  2. [goa]golang微服务框架学习(三)-- 使用swagger-ui展示API

    既然goa框架自动生成啦swagger-json文件,那么如何用swagger-ui展示出来呢? 这里分三步: 1.下载swagger-ui的web代码 2.添加swagger.json 和 swag ...

  3. kratos微服务框架学习笔记一(kratos-demo)

    目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和githu ...

  4. 【GoLang】golang 微服务框架 go-kit

    golang-Microservice Go kit - A toolkit for microservices kubernetes go-kit_百度搜索 Peter Bourgon谈使用Go和& ...

  5. golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

    micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  6. golang微服务框架go-micro 入门笔记2.4 go-micro service解读

    本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  7. golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布

    本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-mi ...

  8. golang微服务框架go-micro 入门笔记1.搭建 go-micro环境

    微服务的本质是让专业的人做专业的事情,做出更好的东西. golang具备高并发,静态编译等特性,在性能.安全等方面具备非常大的优势.go-micro是基于golang的微服务编程框架,go-micro ...

  9. 【GoLang】golang 微服务框架 介绍

    原文如下: rpcx是一个类似阿里巴巴 Dubbo 和微博 Motan 的分布式的RPC服务框架,基于Golang net/rpc实现. 谈起分布式的RPC框架,比较出名的是阿里巴巴的dubbo,包括 ...

随机推荐

  1. 剑指offer-二叉树的深度

    题目: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 链接: http://www.nowcoder.com/practic ...

  2. 14,SFDC 管理员篇 - 外部数据集成

    1,Connect an External Data Source, 添加新的数据源,填写如下 2, 点击Validate and Sync 按钮 3,添加Orders和Orders Details ...

  3. Cucumber语法及测试用例<一>

    工作原因,最近一直在研究cucumber的 语法以及它和java之间的关系.鉴于是初学者且代码基础薄弱,我开始摸索前行,感谢分享博客且也在一路前行的人儿们. 1.基本语法为:此处举例两种区别一看即知- ...

  4. MySQL 第七天(核心优化一)

    一.Mysql核心优化 1. 优化的方面 ① 存储层:数据表"存储引擎"选取.字段选取.逆范式(3范式) ② 设计层:索引.分区/分表 ③ 架构层:分布式部署(主从模式/共享) ④ ...

  5. redis 基本数据类型

    概述 Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合.本文详细介绍这五种数据类型的使用方法.本文命令介绍部分只是列举了基本的命令,至于具体的使用示例,可以参考Redis官方 ...

  6. 关于C/S模式开发的学习笔记

    当今的现状,感觉是B/S大为盛行,C/S的学习者很少,就那我们学校来看,三年多来,教的.用的最多的都是B/S,在刚刚确定下来的毕设课题中,大约四分之三都是web结合安卓开发的系统.C/S的学习着很少, ...

  7. select 多表查询

    连接查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征. select 表1.字段名1,表2.字段名2,... from 表1,表2 where 连接条件 连接查询分 ...

  8. select 标签的两种方式(以动态插入为例)

    标准形式: html <select id="sorte_piceid_copy" name="tea" style="display:none ...

  9. REST 风格的api

    REST即表述性状态传递,是设计风格不是标准.REST架构风格有以下6个约束: 1. 客户-服务器(Client-Server):通信只能由客户端单方面发起,表现为请求-响应形式. 2.无状态:通信的 ...

  10. DIOCP之编写第一个应用程序(三)

    Client 设计功能如下: 1.建立与服务器连接 2.请求连接时,加密密码,采用Base64编码 3.定时发送心跳告诉服务器在线(长连接,用于接收推送信息) 4.进行相关的数据处理与交互 第一步:创 ...