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

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

查看所有标签

猜你喜欢:

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

Introduction to Programming in Java

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》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具