go-plugify 一个易用的golang插件框架
github.com/go-plugify/go-plugify
介绍
golang毫无疑问是近年来很成功且广泛应用的语言,他的诸多优点使得其被广泛用于网页以及手机应用的后端程序中。go-plugify是基于golang的插件框架,其本身利用了golang的原生plugin能力。
使用go-plugify可以帮助您快速实现很多很棒的特性,解决很多开发上的问题,您不需要再为一个小修补而编译部署整个程序。您可以把功能修复验证的时间从小时分钟级缩减为秒级。而这只是其诸多能解决的问题之一。
特性
- 通过插件热更新:在本地编译小片段代码,并在远程加载,无需重启。
- 远程执行:在目标环境中注入并运行上传的方法或函数。
- 更快的调试与修复周期:可在线快速验证修复或新逻辑。
- 简单集成:可轻松接入现有的 Go 项目,几乎无需额外配置。
快速上手
依赖
- 服务端程序需要cgo的支持,编译时加上:
CGO_ENABLED=true - 程序需要在linux或mac上运行
上手
1. 安装命令行工具
go install github.com/go-plugify/plugcli
2. 新建脚手架
plugcli create myplugin
3. 编写自己的插件
3.1 客户端代码
打开plugin.go文件,编写:
...
func (p Plugin) Run(args any) {
ctx := args.(HttpContext)
p.Logger().Info("Plugin %s is running, ctx %+v", p.Name, ctx)
p.Component("ginengine").(HttpRouter).ReplaceHandler("GET", "/", func(ctx context.Context) {
ctx.(HttpContext).JSON(200, map[string]string{"message": "Hello from plugin !!!"})
})
cal := p.Component("calculator").(Calculator)
ctx.JSON(200, map[string]any{
"message": "Plugin executed successfully",
"load pkg": pkg.SayHello(),
"1 + 5 * 5 = ": cal.Add(1, cal.Mul(5, 5)),
})
}
...
3.2 服务端
服务端是挂载端点,以接收插件的加载运行请求。可以根据自身的web框架来接入,如:
...
import (
...
ginadapter "github.com/go-plugify/webadapters/gin"
...
)
func main() {
router := setupRouter()
router.Run(":8080")
}
func setupRouter() *gin.Engine {
r := gin.Default()
ginrouters := ginadapter.NewHttpRouter(r)
plugManager := goplugify.Init("default",
goplugify.ComponentWithName("ginengine", ginrouters),
goplugify.ComponentWithName("calculator", &Caclulator{}),
)
plugManager.RegisterRoutes(ginrouters, "/api/v1")
return r
}
...
4. 运行
服务端编译记得加上:CGO_ENABLED=true。
客户端运行,可以进入项目文件夹后执行:make run,但记得修改 Makefile 中的服务端地址。
例子
查看:github.com/go-plugify/example
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: