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

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

内容简介:go-mir v2.0.0 发布了,推荐使用。 功能特性: 使用Go结构体标签定义handler路由信息; 自动根据定义的结构体标签信息生成handler接口,开发者实现相应接口后注册到router,与gRPC的使用方式类似; 内置支持gin、...

go-mir v2.0.0 发布了,推荐使用。

功能特性:

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

开发详情

与版本 v1不同,版本v2采用代码生成的方式从定义的结构体标签信息生成handler接口,开发者实现相应接口完成Web API的功能,非常漂亮的支持了基于接口编程的范式。

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

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

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

go-mir v2版本大体架构如下:

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

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
  • 大功告成,是不是很简单,赶紧上手吧:)

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

Qt 5.9 C++开发指南

Qt 5.9 C++开发指南

王维波、栗宝鹃、侯春望 / 人民邮电出版社 / 2018-5-1 / 89.00元

本书以Qt 5.9 LTS版本为开发平台,详细介绍了Qt C++开发应用程序的技术,包括Qt应用程序的基本架构、信号与槽工作机制、图形显示的Graphics/View架构、数据编辑和显示的Model/View架构、对话框和多窗口的设计与调用方法等,介绍了常用界面组件、文件读写、绘图、图表、数据可视化、数据库、多线程、网络和多媒体等模块的使用。每个编程主题都精心设计了完整的实例程序。 通过阅读......一起来看看 《Qt 5.9 C++开发指南》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具

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

HEX HSV 互换工具