内容简介: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
- 大功告成,是不是很简单,赶紧上手吧:)
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- go-mir v2.3.2 发布,用 Go 结构体标签定义 handler 路由信息的辅助库
- go-mir v2.6.1 发布,用 Go 结构体标签定义 handler 路由信息的辅助库
- go-mir v1.0.0 发布 用 Go 结构体标签定义 handler 路由信息的辅助库
- go-mir v1.0.0 发布 用 Go 结构体标签定义 handler 路由信息的辅助库
- go-mir v1.0.2 发布,用 Go 结构体标签定义 handler 路由信息的辅助库
- golang辅助包介绍
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Introduction to Programming in Java
Robert Sedgewick、Kevin Wayne / Addison-Wesley / 2007-7-27 / USD 89.00
By emphasizing the application of computer programming not only in success stories in the software industry but also in familiar scenarios in physical and biological science, engineering, and appli......一起来看看 《Introduction to Programming in Java》 这本书的介绍吧!