go-mir v2.6.1 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

栏目: 软件资讯 · 发布时间: 4年前

内容简介:go-mir v2.6.1 发布了,支持多个web框架,自带mirc脚手架,零基础开发web应用,方便快捷。 新增特性: 添加fiber的支持,mirc自动生成相应web框架样式的接口代码; 优化代码生成器,更新所使用的web框架版本; 预告...

go-mir v2.6.1 发布了,支持多个web框架,自带mirc脚手架,零基础开发web应用,方便快捷。

新增特性:

  • 添加fiber的支持,mirc自动生成相应web框架样式的接口代码;
  • 优化代码生成器,更新所使用的web框架版本;

预告下一版本开发计划

go-mir v2已经发布到v2.6.1,可以说实现了最初对v2版本的设计预想,现在是时候朝着v3版本演进了...

go-mir v1的架构大体是这样:

go-mir v2.6.1 发布,用  <a href='https://www.codercto.com/topics/6127.html'>Go</a>  结构体标签定义 handler 路由信息的辅助库

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

go-mir v2的架构大体如下:

go-mir v2.6.1 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

v2版本升级采用代码生成的方式生成接口代码,同样也是采用golang内置的struct tag定义路由信息,但不同于v1版本在引擎启动时解析后注册路由信息到web引擎,这里参考grpc的接口生成方式,生成接口定义文件,业务逻辑只要实现了接口,注册接口实现的对象到相应的web引擎,启动后就可以对外通过RESTfull接口获取服务。

go-mir v3版本目前还处于原型设计中,大体情况如下:

下图是早先在开发v2版本时设想v2到v3版本演进的架构设计预想,预备使用OpenApi v3.0的定义文件直接生成接口代码,后面的逻辑和v2保持一致。OpenAPI v3.0定义RESTfull API接口非常清晰、方便的,但也是有点繁琐,OpenAPI本身最早之前是为了API文档自动生成而设计,后面才演变成兼具api代码自动生成,总的来说,使用OpenAPI是有点繁琐的。

go-mir v2.6.1 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

go-mir 的主要功能是辅助开发工程师设计api然后自动生成api的样板代码,直接目的就是api代码自动生成,使用方式奔着gRPC的体验走(定义protocol文件,使用protoc自动生成rpc代码)。本着不变初衷的期望,v3版本的go-mir将设计一套命名为M2的自定义DSL(领域描述语言) 来定义api,然后使用mirc依据m2定义文件自动生成api样板代码,大体架构设计如下:

go-mir v2.6.1 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

使用m2定义API的早期预览(目前M2还在设计阶段,可以参考issue):

% cd examples/mirc/draft
% tree
.
├── core.m2
├── mirc.yaml
├── site_v1.m2
└── site_v2.m2
%> cat site_v1.m2
// Copyright 2021 Michael Li <alimy@gility.net>. All rights reserved.
// Use of this source code is governed by Apache License 2.0 that
// can be found in the LICENSE file.

//mir:syntax v0.1-alpha.1

package v1

message ArticleReq {
     Content string  `json:"content"`
}

message ArticleRes {
    Code   int       `json:"code"`
    Msg    string    `json:"msg"`
    PostId string    `json:"postid"`
}

// Site v1 service
service Site(group: v1) {
    Index()                                    `get:"/index/"`
    Articles()                                 `get:"/articles/:category/"`
    Category()                                 `get:"/category/"`
    PostArticle(ArticleReq) ArticleRes         `post:"/articles/:category/"`
}
%> cat mirc.yaml

mir:
  version: v0.1-alpha.1
generate:
  go_options:
    import_path: github.com/alimy/mir/v3/examples/mirc
  plugins:
    - name: go
      type: go
      flags: plugins=mirc
      output: internal/auto
%> cat core.m2
// Copyright 2021 Michael Li <alimy@gility.net>. All rights reserved.
// Use of this source code is governed by Apache License 2.0 that
// can be found in the LICENSE file.

//mir:syntax v0.1-alpha.1

package core

message ArticleReq {
     Content string  `json:"content"`
}

message ArticleRes {
     Code   int      `json:"code"`
     Msg    string   `json:"msg"`
     PostId string   `json:"postid"`
}

message IndexHead {
     LastTime string `param:"lastTime"`
}
%> cat core.m2
// Copyright 2021 Michael Li <alimy@gility.net>. All rights reserved.
// Use of this source code is governed by Apache License 2.0 that
// can be found in the LICENSE file.

//mir:syntax v0.1-alpha.1

package v2

import core

// Site v2 service
service Site(group: v2, chain: _) {
    Index(core.indexParam)                               `get:"/index"`
    Articles()                                           `get, post:"/articles/:category/"`
    Category()                                           `get:"/category/"`
    PostArticle(core.ArticleReq) core.ArticleRes         `post:"/articles/:category/"`
}

使用方式:

#使用方式
%> cd .. && pwd
go/src/github.com/alimy/mir/examples/mirc

%> mirc generate --style gin draft  # will generate files to internal/auto
%> tree internal/auto
.
├── site.go
├── v1
│   └── site.go
└── v2
    └── core.go
    └── site.go

go-mir v3目前还在早期设计阶段,确定m2的语法定义后,将着手开始编写解析器,然后对接v2的代码生成器,生成相应web框架的代码,最新进展请关注https://github.com/alimy/mir/tree/v3

go-mir v2 功能特性

  • 使用Go结构体标签定义handler路由信息;
  • 自动根据定义的结构体标签信息生成handler接口,开发者实现相应接口后注册到router,与gRPC的使用方式类似;
  • 内置支持gingo-chimuxhttprouterechoirismacaronfiber的代码生成器;
  • 自带脚手架mirc自动生成gingo-chimuxhttprouterechoirismacaronfiber样式的模板工程代码;
  • 支持多goroutine并发生成接口代码,加快代码生成效率;

go-mir v2 代码示例:(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/v1/site.go

package v1

import (
	"github.com/alimy/mir/v2"
	"github.com/alimy/mir/v2/engine"
)

func init() {
	engine.AddEntry(new(Site))
}

// Site mir's struct tag define
type Site struct {
	Chain    mir.Chain `mir:"-"`
	Group    mir.Group `mir:"v1"`
	Index    mir.Get   `mir:"/index/"`
	Articles mir.Get   `mir:"/articles/:category/"`
}
  • 定义生成器入口,比如:
// file: mirc/main.go

package main

import (
	"log"

	"github.com/alimy/mir/v2/core"
	"github.com/alimy/mir/v2/engine"

	_ "github.com/alimy/mir/v2/examples/mirc/routes"
	_ "github.com/alimy/mir/v2/examples/mirc/routes/v1"
	_ "github.com/alimy/mir/v2/examples/mirc/routes/v2"
)

//go:generate go run main.go
func main() {
	log.Println("generate code start")
	opts := core.Options{
		core.RunMode(core.InSerialDebugMode),
		core.GeneratorName(core.GeneratorGin),
		core.SinkPath("./gen"),
	}
	if err := engine.Generate(opts); err != nil {
		log.Fatal(err)
	}
	log.Println("generate code finish")
}
  • 自动生成接口,基于上面的定义,生成器将自动生成接口定义文件,如下:
% make generate
% cat mirc/gen/api/v1/site.go

// Code generated by go-mir. DO NOT EDIT.

package v1

import (
	"github.com/gin-gonic/gin"
)

type Site interface {
	// Chain provide handlers chain for gin
	Chain() gin.HandlersChain

	Index(*gin.Context)
	Articles(*gin.Context)
}

// RegisterSiteServant register Site servant to gin
func RegisterSiteServant(e *gin.Engine, s Site) {
	router := e.Group("v1")
	// use chain for router
	middlewares := s.Chain()
	router.Use(middlewares...)

	// register routes info to router
	router.Handle("GET", "/index/", s.Index)
	router.Handle("GET", "/articles/:category/", s.Articles)
}
  • 实现接口逻辑, 比如:
// file: servants/site_v1.go

package servants

import (
	"net/http"

	"github.com/gin-gonic/gin"

	api "github.com/alimy/mir/v2/examples/mirc/gen/api/v1"
)

var _ api.Site = EmptySiteV1{}

// EmptySiteV1 implement api.Site interface
type EmptySiteV1 struct{}

func (EmptySiteV1) Chain() gin.HandlersChain {
	return gin.HandlersChain{gin.Logger()}
}

func (EmptySiteV1) Index(c *gin.Context) {
	c.String(http.StatusOK, "get index data (v1)")
}

func (EmptySiteV1) Articles(c *gin.Context) {
	c.String(http.StatusOK, "get articles data (v1)")
}
  • 注册接口实现对象到相对应的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
  • 大功告成,是不是很简单,赶紧上手吧:)

演示项目:

examples:一个简单的快速了解如何使用mir的演示项目;

mir-covid19:  新冠疫情统计TH_COVID19_International的Golang版本,完整的演示了如何使用mir快速开发一个web应用。


以上所述就是小编给大家介绍的《go-mir v2.6.1 发布,用 Go 结构体标签定义 handler 路由信息的辅助库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Android编程权威指南(第3版)

Android编程权威指南(第3版)

比尔·菲利普斯 (Bill Phillips)、克里斯·斯图尔特 (Chris Stewart)、克莉丝汀·马西卡诺 (Kristin Marsicano) / 王明发 / 人民邮电出版社 / 2017-6 / 129.00元

Big Nerd Ranch 是美国一家专业的移动开发技术培训机构。本书主要以其Android 训练营教学课程为基础,融合了几位作者多年的心得体会,是一本完全面向实战的Android 编程权威指南。全书共36 章,详细介绍了8 个Android 应用的开发过程。通过这些精心设计的应用,读者可掌握很多重要的理论知识和开发技巧,获得宝贵的开发经验。 第3 版较之前版本增加了对数据绑定等新工具的介......一起来看看 《Android编程权威指南(第3版)》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具