首页 > *nix技术, 架构设计 > Go语言插件化设计

Go语言插件化设计

2020年5月24日 发表评论 阅读评论 921 次浏览

利用dlopen/dlsym/dlclose等接口可以在C语言程序中实现模块动态加载功能,Nginx就有这样的实现。在Go v1.8版本之前,可以利用一些开源项目来实现类似的功能(见参考链接),但在Go v1.8版本之后,就可以直接使用Go语言本身提供的plugin特性了。下面试用下。

一,测试环境
$ cat /etc/issue
Ubuntu 18.04.3 LTS \n \l
$ uname -a
Linux lenky-virtual-machine 5.0.0-27-generic #28~18.04.1-Ubuntu SMP Thu Aug 22 03:00:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ go version
go version go1.14.2 linux/amd64

二,准备示例程序
示例程序的代码在完全参考2(或完全参考3)的链接地址可以下载到。该程序使用插件化方式实现不同语种的问候语输出功能,即每种语言都作为Go插件来实现。下载zip包放到goplugin目录备用。
$ mkdir goplugin
$ cd goplugin/
$ ls
go-plugin-example-master.zip
$ unzip go-plugin-example-master.zip
$ cd go-plugin-example-master/

三,编译执行
1,先编译插件so库,ls查看下是否生成
$ go build -buildmode=plugin -o eng/eng.so eng/greeter.go
$ go build -buildmode=plugin -o chi/chi.so chi/greeter.go
$ ls eng/eng.so chi/chi.so
chi/chi.so eng/eng.so

2,通过不同参数输出不同语种的问候语
$ go run greeter.go english
Hello Universe
$ go run greeter.go chinese
你好宇宙
$ go run greeter.go japanese
don’t speak that language
exit status 1
$ mv chi/chi.so chi/chi1.so
$ go run greeter.go chinese
plugin.Open(“./chi/chi.so”): realpath failed
exit status 1

没有准备输出日本问候语的插件,所以报错退出。另外,如果没有对应的so库文件,会提示插件打开失败。

源文件greeter.go中的关键两个函数是plugin.Open和plug.Lookup,功能等同于dlopen和dlsym。由于Go语言的资源自动回收特性,所以没有对应的”dlclose”?

Over~

完全参考:
1,https://medium.com/learning-the-go-programming-language/writing-modular-go-programs-with-plugins-ec46381ee1a9
2,https://github.com/vladimirvivien/go-plugin-example
3,Backup:https://github.com/lenky0401/go-plugin-example

参考:
1,https://www.zhihu.com/question/264397996
2,https://github.com/hashicorp/go-plugin
3,https://github.com/micro/go-plugins
4,golang插件化方案:http://kuanshijiao.com/2018/08/04/goplugin/

转载请保留地址:http://www.lenky.info/archives/2020/05/2948http://lenky.info/?p=2948


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

分类: *nix技术, 架构设计 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.