go-mir v2.0.0 发布,用 Go 结构体标签定义 handler 路由信息的辅助库
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
- 大功告成,是不是很简单,赶紧上手吧:)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
删库背后,是权限管控的缺失
“删库”事件过去了,微盟原计划28号恢复商家服务,这事儿就算渐渐淡出了人们的视野,如今又好巧不巧被创始人的魔幻舆论推得一浪更比一浪高。 观众吃瓜一时爽,企业也纷纷顺着热点蹭上来,踩着别人的错误往上爬,还能花样踢腿加劈叉。整个安全圈一片喜气洋洋。 实际上大家彼此心知肚明,这次事件只需要最简单的双人复核就能避免,多一次打扰,少亏12亿。那么为什么最初级的操作也做不到呢? 一、原因分析篇 有人指出这次“删库”原因是微盟没有使用堡垒机,仅仅如此吗? 爱因斯坦说,问题往往不会在它发生的那个层面得到解决。 现在很多互联网公司对自己的技术非常有信心,为了节省成本,会选择基于开源软件自主研发安全产品。但在设计产品和管理产品的过程中,难免缺乏专业经验。 专业的人做专业的事。脱离钱去谈安全,就有可能丢了**还套不着狼。 “删库”这么狗血的事情已经在历史上重演很多次了,有蓄意破坏的,也有失手误删的,归根结底,都是人的因素。当你大门敞开,这库就迟早要删,即便现在没有动机,也不能保证没有手误的可能。 人永远存在犯错的可能性,而安全又是一个神奇的四两拨千斤的问题,任何一点小错误都有发展成大规模破坏的潜力。因此运维...
- 下一篇
WePush 4.2.1 发布,专注批量推送的小而美的工具
WePush 4.2.1已发布,一个专注批量推送的小而美的工具。 更新内容如下: v4.2.1 fix:修复小程序订阅消息无法发送问题 optimization:由于小程序模板消息接口将于2020年1月10日下线,禁用小程序模板消息入口 fix:公众号模板消息支持小程序路径修复 fix:代码优化,界面细节优化 下载地址: https://gitee.com/zhoubochina/WePush/wikis/download 目前已经支持的消息类型 模板消息-公众号 模板消息-小程序 订阅消息-小程序 微信客服消息 微信企业号/企业微信消息 钉钉 阿里云短信 阿里大于模板短信 腾讯云短信 华为云短信 百度云短信 又拍云短信 七牛云短信 云片网短信 E-Mail HTTP请求(单次、批量、压测) 计划中支持的消息类型 网易云信短信 榛子云短信 Luosimao短信 极光短信 E-极光推送 功能&亮点 支持自定义消息内容并批量推送 支持变量消息(可实现根据发送目标用户不同每条消息内容不一样) 支持消息编辑、预览、消息管理 支持通过文件导入用户(txt、csv、excel) 支持通过...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长