当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用go来写服务会遇到风格不统一,开发效率上的问题。
之前研究go的微服务架构go-kit最让人头疼的就是定义服务之后,还要写很多重复的框架代码,一直再想如何使用IDL描述服务,然后自动生成框架代码。
直到遇到老这货 goa,另外一个go的微服务框架。具体介绍看这篇,还有官网。
这货实现了框架的代码自动生成(自动生成的代码可以热更新,因为生成代码和自己写的代码是分开的),而且理念也比较时髦,基于API设计,利用插件来扩展业务逻辑。
于是想想要赶紧学习玩一下。
假定你已经装了golang的环境。
所以,开始下载。
go get github.com/goadesign/goa
go get github.com/goadesign/goa/goagengo 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 codemain        Generate application scaffoldingclient      Generate client package and toolswagger     Generate Swaggerjs          Generate JavaScript clientschema      Generate JSON Schemagen         Run third-party generatorbootstrap   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 andTitle("The virtual wine cellar")           // other global properties. There should be oneDescription("A simple goa service")        // and exactly one API definition appearing inScheme("http")                             // the design.Host("localhost:8080")
})var _ = Resource("bottle", func() {                // Resources group related API endpointsBasePath("/bottles")                       // together. They map to REST resources for RESTDefaultMedia(BottleMedia)                  // services.
Action("show", func() {                    // Actions define a single API endpoint togetherDescription("Get bottle by id")    // with its path, parameters (both pathRouting(GET("/:bottleID"))         // parameters and querystring values) and payloadParams(func() {                    // (shape of the request body).Param("bottleID", Integer, "Bottle ID")})Response(OK)                       // Responses define the shape and status codeResponse(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 mustAttribute("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=:80802016/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,要自己在业务逻辑代码里头,手动添加函数体代码。

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

[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 mysql_kratos微服务框架学习笔记一(kratos-demo)

    本文将为您描述kratos微服务框架学习笔记一(kratos-demo),教程操作步骤: 目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服 ...

  4. 一个人写一个集群:基于GRPC的golang微服务框架iogo(grpc/protobuf/etcd/freetoo/码客 卢益贵)

    一个人写一个集群:基于GRPC的golang微服务框架iogo keyword:iogo,golang,grpc,protobuf,etcd,zookeeper,microservice,distri ...

  5. Spring clud 微服务框架学习

    Spring clud 微服务框架学习 什么是微服务? 微服务是一种架构风格:服务组件化.业务分离让每个模块独立.服务跟服务之间接口调用,服务之间不会相互影响.轻量级通信机制:接口调用很快. 微服务的 ...

  6. go开源文件服务器框架,golang微服务框架go-zero系列-4:go-zero文件服务

    golang微服务框架go-zero系列-4:go-zero文件服务 go-zero本身支持文件服务,但是我们需要写相关的handler文件,本文目的在于 不写任何一个和文件相关的handler 如果 ...

  7. golang微服务框架对比_Go语言开发的微服务框架,你了解多少?

    Go语言开发的微服务框架 1.项目名称:Istio 项目简介:Istio是由Google.IBM和Lyft开源的微服务管理.保护和监控框架.使用istio可以很简单的创建具有负载均衡.服务间认证.监控 ...

  8. golang微服务框架go-zero系列-1:适合创业的golang微服务框架go-zero + 金光灿灿的gorm V2实践

    为什么使用go-zero 可以有第三个选择 golang圈子不大,微服务框架框架屈指可数:除了go-micro.go-kit,几乎没有其他选择.go-zero为此提供第三个可能. go-micro 对 ...

  9. golang微服务框架对比_最强开源微服务框架,全网独家整理

    诞生于 2014 年的"微服务架构",其思想经由 Martin Fowler 阐述后,在近几年持续受到重视,理论与相关实践都不断发展,目前它已经成为了主流软件架构模式. 关于微服务 ...

最新文章

  1. 中国WEB 2.0的质变过程
  2. 「CameraCalibration」传感器(相机、激光雷达、其他传感器)标定笔记
  3. 5g与edge ai_使用OpenVINO部署AI Edge应用
  4. [转载]各种在线api地址
  5. this.fields.get(c) is undefined
  6. inception v2、inception v3、inception v4
  7. 投资与创业:程序猿如何改变世界
  8. ASP利用IP138获IP地理位置
  9. 小学计算机小组兴趣活动计划,计算机兴趣小组活动计划
  10. 计算机网络——第四章 网络层:数据平面
  11. 【Linux】常用工具
  12. 史玉柱用“脑白金”式网游重建巨人
  13. 疯狂天才霍兹:17岁黑掉苹果,22岁搞垮索尼,还是特斯拉、谷歌最可怕的对手!
  14. mysql数据库查询练习二-【比经理工资还高员工姓名】【查找重复的邮箱】
  15. Protected Sky黑名单移除攻略
  16. CHM文档(jdk帮助文档)打开显示空白的解决办法
  17. 金九银十,看看你在哪个阶段
  18. Vue服务端渲染(Nodejs)
  19. 鸿蒙测试版苹果,手机鸿蒙OS测试版开放日期确定;2021款iPad Pro将搭载OLED面板
  20. 奇安信、深信服、启明星辰的安全红利战

热门文章

  1. 将excel转成PDF导出
  2. 242. 有效的字母异位词-Java
  3. 空调动图,风系统、水系统一看就懂!
  4. 梅科尔工作室-django后端和鸿蒙app实现登录功能的前后端交互
  5. 程序员欢乐送(第38期)
  6. 电脑亮度突然无法调节,并且重置电脑也不能解决问题
  7. 不规则图形数格子的方法_方格图中不规则图形的面积计算
  8. 【观察】华为:新一代楼宇网络,使能绿建智慧化
  9. hdfs回收站的开启
  10. 。INF文件格式说明