当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用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.gopackage 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,要自己在业务逻辑代码里头,手动添加函数体代码。

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

GO --微服务框架(一) goa相关推荐

  1. GO --微服务框架(二) goa

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

  2. [goa]golang微服务框架学习--安装使用

    当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用go来写服务会遇到风格不统一,开发效率上的问题. 之前研究go的微服务架构go-kit最让人头疼的就是定义服务之后,还要写很多重复的框架代码,一直 ...

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

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

  4. Go语言十一大主流微服务框架

    以下 star数截止2021年12月份 1.istio 项目简介:Istio是由Google.IBM和Lyft开源的微服务管理.保护和监控框架.使用istio可以很简单的创建具有负载均衡.服务间认证. ...

  5. Go:十大主流微服务框架

    1.Istio(31.7K) 项目简介:Istio是由Google.IBM和Lyft开源的微服务管理.保护和监控框架.使用istio可以很简单的创建具有负载均衡.服务间认证.监控等功能的服务网络,而不 ...

  6. Go微服务框架及基础平台选择

    Go微服务框架及基础平台选择 1 考虑因素 2 现有Go微服务框架 2.1 istio 2.1.1 Istio 特点 2.2 Go-kit 2.2.1 暂未找到 2.3 Kratos(奎托斯) 2.3 ...

  7. python 微服务框架 知乎_序: 我需要一个什么样的微服务框架

    前言 新坑第一篇文章, 做一个开篇的序吧. 开发了很多 python 的 web 微服务, 也使用过很多 web 框架, django, tornado, flask, 等等等等. 不同的 web 框 ...

  8. go微服务框架go-micro深度学习(一) 整体架构介绍

    产品嘴里的一个小项目,从立项到开发上线,随着时间和需求的不断激增,会越来越复杂,变成一个大项目,如果前期项目架构没设计的不好,代码会越来越臃肿,难以维护,后期的每次产品迭代上线都会牵一发而动全身.项目 ...

  9. Oracle发布开源的轻量级 Java 微服务框架 Helidon

    近日,Oracle推出了一个新的开源框架Helidon,该项目是一个用于创建基于微服务的应用程序的Java库集合.和Payara Micro.Thorntail(之前的WildFly Swarm).O ...

最新文章

  1. 洛谷P4768 [NOI2018]归程(Kruskal重构树)
  2. SQLServer DBA 三十问
  3. invalidate(true) 图形不显示_2D图像界面-ATI 图形界面卡
  4. js 图形化工作流设计器
  5. 深入理解Spark 2.1 Core (八):Standalone模式容错及HA的原理与源码分析
  6. 试图登录,但是网络登陆服务没有启动成功
  7. c51单片机蜂鸣器程序C语言响,单片机蜂鸣器响生日快乐编程程序
  8. 一文看懂 BDTC 2018:探秘大数据新应用(附 PPT 下载)
  9. DeepMind为明年的AAAI,准备了一份各种DQN的混血
  10. Hibernate(2012/2/27)
  11. 在java.time.LocalDateTime和java.util.Date之间进行转换
  12. 鼠标停留在按钮上显示文字
  13. 计算机保存文件快捷键,保存快捷键是什么,保存文档的快捷键
  14. 2021SAAE上海第七届教育装备展览会
  15. 编程求1平方+2平方+...+n平方
  16. 哔哩哔哩自动播放视频
  17. JavaScript学习(七)——对象与数组、内部对象(1)
  18. Guitar Pro8最新版 学吉他打谱必备的APP
  19. Drupal Views教程
  20. bios和boot menu的关系?

热门文章

  1. 模仿百度首页页面(附带源码)html+css
  2. 李弘毅机器学习笔记:第六章—Logistic Regression
  3. Beautiful Soup是干什么用的
  4. 2017.2.12 开涛shiro教程-第七章-与Web集成
  5. Flink窗口迟到机制
  6. DEDECMS的函数、PHP语法
  7. Web安全--核心防御机制
  8. 【Leetcode】416 分割等和子集
  9. 小法师系列-8-番外-失恋的并发症
  10. django从零开始引入bootstrap模板