go-plugify 一个易用的golang插件框架

AI摘要
go-plugify是基于Go语言原生插件能力的开发框架,支持插件热更新、远程执行与快速调试。无需重启即可在线验证修复,显著缩短开发周期。可轻松集成现有Go项目,适用于Linux/Mac环境,需启用CGO编译。

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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!