
使用Go语言实现插件化开发:构建可扩展的高内聚低耦合系统架构
原因 近期,我正在筹备一个开源项目,该项目是一个能快速生成后台代码的工具,采用了Hertz+Gorm+Gen+Vben Admin技术栈。在开发过程中,我始终在思考如何实现框架与后续业务的分离,以使快速生成的业务代码更加清晰,且业务的修改不会对框架产生影响。这样也能更好地迭代这个开源项目,并在使用过程中不断完善。 在凝视着vscode,陷入沉思时,我突然灵光一闪,想到了插件化。目前许多工具都正在转变为插件化,它们在提供最基础的功能的同时,也允许用户以自己的方式增强这个工具。 开始 Go语言在插件化方面非常的方便,只需要将插件路由注册到主路由上就可以使用了。接下来我将实现过程记录一下: 一、在框架中加入插件功能 1、先创建一个Plugin 插件模式接口化文件 package plugin import "github.com/cloudwego/hertz/pkg/route" const ( OnlyFuncName = "Plugin" ) // Plugin 插件模式接口化 type Plugin interface { // Register 注册路由 Register(group *route.RouterGroup) // RouterPath 用户返回注册路由 RouterPath() string } 2、然后批量初始化插件路由 package initialize import ( "fmt" …… ) //插件初始化,注册上面创建的接口文件 func PluginInit(group *route.RouterGroup, Plugin ...plugin.Plugin) { for i := range Plugin { PluginGroup := group.Group(Plugin[i].RouterPath()) Plugin[i].Register(PluginGroup) } } // 安装插件 func InstallPlugin(Router *server.Hertz) { PublicGroup := Router.Group("") fmt.Println("无鉴权插件安装==》", PublicGroup) PrivateGroup := Router.Group("",middleware.JwtMiddleware.MiddlewareFunc()) fmt.Println("鉴权插件安装==》", PrivateGroup) …… } 3、在主路由上调用上面的函数 package initialize import ( "context" "github.com/cloudwego/hertz/pkg/app" "github.com/cloudwego/hertz/pkg/app/server" ) func Routers() *server.Hertz { Router := server.Default() InstallPlugin(Router) // 安装插件 //下面继续写主框架中的路由地址 …… return Router } 4、在man中调用路由 ...