首页 > 其他分享 >浅谈 Golang 插件机制

浅谈 Golang 插件机制

时间:2022-10-03 19:22:29浏览次数:84  
标签:插件 浅谈 err plugin Golang 编译 go

我们知道类似 Java 等半编译半解释型语言编译生成的都是类似中间态的字节码,所以在 Java 里面我们想要实现程序工作的动态扩展,可以通过 Java 的字节码编辑技术([[动态代理#ASM]]/[[动态代理#CGLIB]]),并结合 JVM 的 [[字节码动态加载#^bc6dd8]] 实现动态修改和加载字节码。

但是 Golang 是编译型语言,编译后直接生成的是可执行文件,但是如果我们又需要在不发布版本的情况下实现程序功能的动态扩展,我们可以通过什么方式来实现呢?下面主要介绍 Golang 里面实现程序功能动态扩展的两种方式:Golang 原生插件和 go-plugin 插件。

Golang 原生插件

Golang 原生插件使用流程如下:

将代码编译成 .so 文件

package main  
  
const Name = "PluginName"  
  
func GetName() string {  
    return Name  
}

将以上代码使用 go build -buildmode=plugin 命令即可编译成插件。

使用插件示例

func main() {  
    // 加载插件
    open, err := plugin.Open("~/plg.so")  
    if err != nil {  
        panic(err)  
    }
    // 查找标识符
    lookup, err := open.Lookup("GetName")  
    if err != nil {  
        panic(err)  
    }  
    res := lookup.(func() string)()  
    fmt.Printf("%v", res)  
}

原生插件的弱点

  1. 编译的 Go 版本必须完全一致 - 事实上这个插件都可以不是由同一个人编写,要求编译的 Go 版本一致显然有点要求太高了
  2. 双方依赖的公共第三方库版本必须完全一致
  3. GOPATH 也得保持一致 - 不过这一点可以在编译时候使用 trimpath 参数解决
  4. 插件加载之后无法卸载

go-plugin

鉴于 Golang 原生插件框架的问题,所以包括 Terraform、Grafana 等系统使用的是 go-plugin 这个框架。go-plugin 使用流程如下。

⚠️ 使用的时候注意复用客户端,因为每次初始化实际上是启动了一个子进程,这样会消耗非常多的内存和 CPU 资源。

我们看 go-plugin 的使用流程,可以发现其实 go-plugin 是通过在应用内部启动一个服务端子进程,应用通过 rpc 的方式和服务端子进程进行交互来实现插件的动态加载。这样其实几乎可以作为一个编译型语言实现动态加载的通用方案,实际上不是对应用本身做了扩展,而是对应用依赖的接口做了相关的扩展。

go-plugin 的具体使用可以参考文章最后的链接。

参考

标签:插件,浅谈,err,plugin,Golang,编译,go
From: https://www.cnblogs.com/hunterzhang/p/16751054.html

相关文章

  • nonebot2 插件推荐与安装
    相关视频【零基础搭建QQ机器人】番外篇nonebot-plugin-gocqhttp插件的使用】https://www.bilibili.com/video/BV1xS4y1y7kp?share_source=copy_web&vd_source=4df36574......
  • IDEA 插件开发(一):菜单及气泡通知
    开发工具开发工具使用IntellijIDEA,官网下载地址:https://www.jetbrains.com/idea/download/other.html推荐使用2020.3.4社区版(Community),原因如下:免费开源,在开发插件......
  • C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显
    C#(一沙框架).netcore3.1SignalR服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用运行效果:1、安装Microsoft.AspNetCore.SignalR(安装方法自行百度)2、引入......
  • Spring Tool 4 安装 Thymeleaf 3.0 插件
    目录参考资料说在前面最小要求步骤1.下载SpringTool4.7.12.下载thymeleaf的eclipse插件2.打开STS-Help-InstallNewSoftware...3.点击【Add...】-【Archive........
  • Vue2 插件
    概述Vue的插件就是一个js文件,里面允许我们完成一些特定的功能。使用创建一个插件plugins.jsexportdefault{install(Vue){//全局过滤器Vue.filt......
  • 【Golang开发面经】百度(三轮技术面)
    文章目录​​写在前面​​​​笔试​​​​一面​​​​算法:判断是否为镜面二叉树​​​​算法:二叉树的俯视图​​​​一个协程被网络io卡住了,对应的线程会不会卡住?​​​​......
  • Golang:go-version一个对语义化版本进行解析、比较的库
    go-versionisalibraryforparsingversionsandversionconstraints,andverifyingversionsagainstasetofconstraints.go-versioncansortacollectionofv......
  • 太棒了,这才称得上 Jupyter Notebook 五大效率插件
    ​​JupyterNotebook​​​是一个很棒的教学、探索和编程环境,但其功能不足也是出了名的。幸好,有许多方法可以改进这个不错的工具,如​​JupyterNotebook​​扩展工具。......
  • 【Golang开发面经】深信服(两轮技术面)
    文章目录​​写在前面​​​​一面​​​​了解过切片和数组吗?有什么区别?​​​​那这样初始化可以吗?有什么问题?​​​​用过map吧?怎么遍历map?​​​​那遍历map是有序的......
  • 如何将谷歌插件下载到本地?
    如何将谷歌插件下载到本地?在谷歌商店里找到想要下载的插件或在扩展程序里找到已安装的插件,复制插件的ID号。复制插件ID然后复制到id%3D和%26的中间部分。https:/......