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

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

内容简介: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 路由信息的辅助库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

复盘

复盘

陈中 / 机械工业出版社 / 2013-7-23 / 29

复盘是围棋中的一种学习方法,指的是在写完一盘棋之后,要重新摆一遍,看看哪里下得好,哪里下得不好,对下得好和不好的,都要进行分析和推演。 柳传志第一个将复盘引入到做事之中,成为联想三大方法论之一,在联想每一个重大决策的背后,都有复盘的身影。 本书完整系统讲述了复盘的内容,清晰了复盘的价值,给出了复盘的操作步骤,我们可以在自己的工作生活中,应用复盘的方法,向自己学习,随时随地的提高自己,把......一起来看看 《复盘》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

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

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试