内容简介:go-mir v2.0.0 发布了,推荐使用。 功能特性: 使用Go结构体标签定义handler路由信息; 自动根据定义的结构体标签信息生成handler接口,开发者实现相应接口后注册到router,与gRPC的使用方式类似; 内置支持gin、...
go-mir v2.0.0 发布了,推荐使用。
功能特性:
- 使用 Go 结构体标签定义handler路由信息;
- 自动根据定义的结构体标签信息生成handler接口,开发者实现相应接口后注册到router,与gRPC的使用方式类似;
- 内置支持gin、go-chi、mux、httprouter的代码生成器;
- 自带脚手架mirc自动生成gin、go-chi、mux、httprouter样式的模板工程代码;
开发详情:
与版本 v1不同,版本v2采用代码生成的方式从定义的结构体标签信息生成handler接口,开发者实现相应接口完成Web API的功能,非常漂亮的支持了基于接口编程的范式。
go-mir v1的架构大体是这样:

这套架构主要是使用了golang的反射机制对struct tag解析然后注册路由信息到web engine,只影响启动时间,不会有运行时损耗,总体来说,方便了接口定义,对代码组织很有益处。
go-mir v2版本大体架构如下:

v2版本升级采用代码生成的方式生成接口代码,同样也是采用golang内置的struct tag定义路由信息;不同于v1版本在引擎启动时解析后注册路由信息到web引擎,这里参考grpc的接口生成方式,生成接口定义文件,业务逻辑只要实现了接口,注册接口实现的对象到相应的web引擎,启动后就可以对外通过RESTfull接口获取服务。
代码示例:(eg: gin style)
- 生成样板代码
% go get github.com/alimy/mir/mirc/v2@latest
% mirc new -d mir-examples
% tree mir-examples
mir-examples
├── Makefile
├── README.md
├── go.mod
├── main.go
└── mirc
├── main.go
└── routes
├── site.go
├── v1
│ └── site.go
└── v2
└── site.go
% cd mir-examples
% make generate
- 自定义路由信息,比如:
// file: mirc/routes/site.go
package routes
import "github.com/alimy/mir/v2"
// Site mir's struct tag define
type Site struct {
Chain mir.Chain `mir:"-"`
Index mir.Get `mir:"/index/"`
Articles mir.Get `mir:"/articles/:category/"`
}
定义生成器入口,比如
% cat mirc/main.go
package main
import (
"log"
"github.com/alimy/mir/v2/core"
"github.com/alimy/mir/v2/engine"
routes "github.com/alimy/mir/v2/examples/mirc/routes"
v1 "github.com/alimy/mir/v2/examples/mirc/routes/v1"
v2 "github.com/alimy/mir/v2/examples/mirc/routes/v2"
)
//go:generate go run main.go
func main() {
log.Println("generate code start")
entries := mirEntries()
opts := &core.Options{
GeneratorName: core.GeneratorGin,
GeneratorOpts: core.InitOpts{
core.OptSinkPath: "./gen",
},
}
if err := engine.Generate(entries, opts); err != nil {
log.Fatal(err)
}
log.Println("generate code finish")
}
func mirEntries() []interface{} {
return []interface{}{
new(routes.Site),
new(v1.Site),
new(v2.Site),
}
}
- 自动生成接口,基于上面的定义,生成器将自动生成接口定义文件,如下:
% make generate
% cat mirc/gen/api/site.go
// Code generated by go-mir. DO NOT EDIT.
package api
import (
"github.com/gin-gonic/gin"
)
// Site mir's struct tag define
type Site interface {
Chain() gin.HandlersChain
Index(c *gin.Context)
Articles(c *gin.Context)
}
// RegisterSiteServant register site to gin
func RegisterSiteServant(e *gin.Engine, s Site) {
router := e
// use chain for router
middlewares := s.Chain()
router.Use(middlewares...)
// register route info to router
router.Handle("GET", "/index/", s.Index)
router.Handle("GET", "/articles/:category/", s.Articles)
}
- 注册接口实现对象到相对应的router,比如:
package main
import (
"log"
"github.com/gin-gonic/gin"
"github.com/alimy/mir/v2/examples/mirc/gen/api"
"github.com/alimy/mir/v2/examples/mirc/gen/api/v1"
"github.com/alimy/mir/v2/examples/mirc/gen/api/v2"
"github.com/alimy/mir/v2/examples/servants"
)
func main() {
e := gin.New()
// register servants to engine
registerServants(e)
// start servant service
if err := e.Run(); err != nil {
log.Fatal(err)
}
}
func registerServants(e *gin.Engine) {
// register default group routes
api.RegisterSiteServant(e, servants.EmptySiteWithNoGroup{})
// register routes for group v1
v1.RegisterSiteServant(e, servants.EmptySiteV1{})
// register routes for group v2
v2.RegisterSiteServant(e, servants.EmptySiteV2{})
}
- 最后,构建并运行应用:
% make run
- 大功告成,是不是很简单,赶紧上手吧:)
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
互联网的误读
詹姆斯•柯兰(James Curran)、娜塔莉•芬顿(Natalie Fenton)、德 斯•弗里德曼(Des Freedman) / 何道宽 / 中国人民大学出版社 / 2014-7-1 / 45.00
互联网的发展蔚为壮观。如今,全球的互联网用户达到20亿之众,约占世界人口的30%。这无疑是一个新的现象,对于当代各国的经济、政治和社会生活意义重大。有关互联网的大量大众读物和学术著作鼓吹其潜力将从根本上被重新认识,这在20世纪90年代中期一片唱好时表现尤甚,那时许多论者都对互联网敬畏三分,惊叹有加。虽然敬畏和惊叹可能已成过去,然而它背后的技术中心主义——相信技术决定结果——却阴魂不散,与之伴生的则......一起来看看 《互联网的误读》 这本书的介绍吧!