首页 > 系统相关 >【分享一个工具】通过定义proto3来自动生成多进程模式的插件代码

【分享一个工具】通过定义proto3来自动生成多进程模式的插件代码

时间:2022-12-15 14:33:51浏览次数:67  
标签:插件 plugin 代码 go proto3 进程 分享

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


我在多进程插件框架 hashicorp/go-plugin 的基础上,使用 protoreflect 来解析 proto3 语法的IDL文件,通过命令行工具自动生成多进程框架的 callee 和 caller 代码。
项目的地址请看:https://github.com/ahfuzhang/go-plugin/tree/main/examples/code_generator
并且已经提了PR到官方。

golang自身的plugin还非常的弱,主要有这些限制:

  • 其插件的编译环境必须与宿主进程的编译环境完全一致
  • 插件可以动态加载,但是无法动态卸载

hashicorp公司(他们更出名的产品是terra-form)开源的go-plugin使用了多进程的模式来实现插件,宿主进程创建子进程,然后通过unix套接字来通讯。
虽然跨进程来通讯有一定的损耗,但对于计算的场景还是OK的,反之用于通讯则不太适合。
hashicorp/go-plugin有这样一些不错的特性:

  • 提供了多进程插件化运行的框架,可以以多种方式写caller端和callee端。
  • 可以动态的加载插件(创建进程)、卸载插件(退出子进程)
  • 因为是跨进程的通讯,所以子进程的稳定性不影响宿主进程;其所有的操作系统资源都是与主进程隔离的
  • 官方甚至提供了一个用python实现子进程的例子
    • 如果用go + lua的方式来写插件,相信可以做到用lua来实现动态跨进程执行的效果
    • 基于这个框架可以很容易写出一个FAAS(Function as-a Service)框架来
  • 提供了日志、加密、通讯等其他支撑性的功能

最后再介绍我实现的这个小工具:如果基于grpc的风格来写插件,其中还是要实现一部分对grpc接口的封装,如果每次写插件都要写这些重复代码,未免有点太繁琐了。所以可以在proto3中定义好service,并通过extension的语法来定义插件名字。具体的步骤已经写在了文档里,大致是:

  • 通过*.proto文件来定义请求格式、响应格式、服务接口;
    • 通过plugin_name这个extension来定义服务对应的插件名字,如果不写,则插件名字就是服务名。
  • 通过protoc来把*.proto变成xx.pb.go的golang代码
  • 通过gen_code命令行来读取*.proto, 生成插件需要的xx.plugin.go文件
    • 同时生成callee目录,生成插件对应的代码。然后在todo的位置填写代码
    • 生成callee_test.go文件,可以拷贝到宿主进程中,用于加载插件。

再补充一点,如果需要把一堆基本类型构成的[]interface{}数组的数据在插件之间传递,我写的上一个工具可以解决这个场景:如何在proto3中用上golang对应的interface{}类型,以及这个工具:Serilizer

Have fun, 希望对你有用。

标签:插件,plugin,代码,go,proto3,进程,分享
From: https://www.cnblogs.com/ahfuzhang/p/16984969.html

相关文章

  • 一文直击什么是小程序插件。
    小程序插件功能简介1.怎么去理解插件呢?插件:英文名可称作“Plug-in、Plugin、add-in、addin、add-on、addon或extension”,是一个依附于主程序的辅助程序,透过和主程序的互动,用......
  • KBU610-ASEMI插件整流桥KBU610
    编辑:llKBU610-ASEMI插件整流桥KBU610型号:KBU610品牌:ASEMI封装:KBU-4特性:整流桥正向电流:6A反向耐压:1000V恢复时间:>2000ns引脚数量:4芯片个数:4芯片尺寸:88MIL浪涌电流:250A 漏电流......
  • STW知识分享
    STW知识分享GC时的StoptheWorld(STW)是大家最大的敌人前置内容https://www.jianshu.com/p/314272e6d35bSTWstoptheworld:  在发生GC时会停下所有的用户线......
  • idea热加载插件Jrebel的使用
    1.安装插件在idea内部安装即可。 2.激活插件进入激活界面:激活方式可参考该博客: 3.设置Jrebel这里的刻度是class刷新时间间隔,上面的是我自己的,其余的设置保持默认即可。 ......
  • 社会化分享
    实现微信(好友、朋友圈)、QQ(好友、空间)、新浪微博等社会化分享方式。前言现在的app几乎里面都包括社会化分享和第三方登录这两个功能,前段时间给大家分享了关于几种(​​......
  • pycharm 常用插件
     1、JsonParser JSONParser是一个用于验证和格式化JSON字符串的轻量级插件。2、Tabnine该插件主要在于可以帮助我们自动填充代码,由于是在人工智能技术的驱动之下,......
  • Prometheus技术分享——如何监控宿主机和容器
    这一期主要来跟大家聊一下,使用node_exporter工具来暴露主机和因公程序上的指标,利用prometheus来监控宿主机;以及通过通过Cadvisor监控docker容器。一、部署node_exporter监......
  • 分享Go书籍-《Go Web编程》
    大家好,我是沙漠尽头的狼。最近几天在看一本Go的书籍,看了100来页,感觉不错,分享给大家。书籍基本信息书籍信息:书名:GoWeb编程作者:(新加坡)郑兆雄(SauSheongChang)著;黄健......
  • 产品分享:Qt鸿图电子智慧白板(适合会议机、电子黑板、电子笔记、电子阅读器等场景),当前版
    产品  鸿途电子智慧白板。 原理  使用Qt技术为基础,开发的windows/ubuntu/arm电子绘图板,主要为windows,支持触摸鼠标,可以定制跨平台。 适合场景  ......
  • 国产免费倾斜摄影模型在线发布平台,一键查看、编辑、分享场景!
    数十GB庞大的城市级三维实景模型,想在Web端加载并实时交互,看到每块地形、建筑物、每寸土地细节,不是一般平台能承受的。一般只能靠人工手动将模型压缩,不仅耗时耗力,效果还不......