Go 原生插件使用问题全解析

本文深入剖析了Go语言插件开发中的常见问题,如版本不一致、代码冲突等,以及MOSN如何通过统一编译环境和解决方案来提升插件的可用性。作者分享了关键源码分析路径和实战策略,助力开发者应对Go插件挑战。

f6f6aaa3bfca048f7573731d63f8a417.gif

文|丁飞(花名:路德 )

蚂蚁集团高级工程师

5698564bd0ba45ab30eaa403c2fda4f0.png

深耕于 SOFAMesh 产品的商业化落地

主要方向为基于服务网格技术的系统架构升级方案设计与落地

本文 4394 字 阅读 10 分钟

|前言|

MOSN 作为蚂蚁集团在 ServiceMesh 解决方案中的数据面组件,从设计之初就考虑到了第三方的扩展开发需求。目前,MOSN 支持通过 gRPC、WASM、以及 Go 原生插件三种机制对其进行扩展。

我在主导设计和落地基于 Go 原生插件机制的扩展能力时遇到了很多问题,鉴于这方面的相关资料很少,因而就有了这个想法来做一个非常粗浅的总结,希望能对大家有所帮助。

注:本文只说问题和解决方案,不读代码,文章最后会给出核心源码的 checklist。

PART. 1

文章技术背景

一、运行时

通常而言,在计算机编程语言领域,“运行时”的概念和一些需要使用到 VM 的语言相关。程序的运行由两个部分组成:目标代码和“虚拟机”。比如最为典型的 JAVA,即 Java Class + JRE。

对于一些看似不需要“虚拟机”的编程语言,就不太会有“运行时”的概念,程序的运行只需要一个部分,即目标代码。但事实上,即使是 C/C++,也有“运行时”,即它所运行平台的 OS/Lib。

Go 也是一样,因为运行 Go 程序不需要前置部署类似于 JRE 的“运行时”,所以它看起来似乎跟“虚拟机”或者“运行时”没啥关系。但事实上,Go 语言的“运行时”被编译器编译成了二进制目标代码的一部分。

7518ac3aa497e48cd7b7247f99bd10bb.jpeg

图 1-1. Java 程序、runtime 和 OS 关系

d2024e9696cbbb7e918d35d626ce4c68.jpeg

图 1-2. C/C++ 程序、runtime 和 OS 关系

06d35f31e7aa562df2474b869241b506.jpeg

图 1-3. Go 程序、runtime 和 OS 关系

二、Go 原生插件机制

作为一个看起来更贴近 C/C++ 技术栈的 Go 语言来说,支持类似动态链接库的扩展一直是社区中较为强烈的诉求。

如图 1-5,Go 在标准库中专门提供了一个 plugin 包,作为插件的语言级编程界面,src/plugin 包的本质是使用 cgo 机制调用 unix 的标准接口:dlopen() 和 dlsym()。因此,它给 C/C++ 背景的程序员一种“这题我会”的错觉。

304e0b1b82bb2adb0ffa61d7f95f6059.jpeg

图 1-4. C/C++ 程序加载动态链接库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值