作者:张富春(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, 希望对你有用。

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

  1. 一个可以自动生成css样式的插件happycss

    一直在页面写css, 重复写着样式,发现布局中,特别是h5,大量的样式都是margin,padding,width,height, 而,当我们需要给一个标签写样式的时候,避免内联样式,我们又需要取cl ...

  2. SpringMVC学习系列-后记 结合SpringMVC和Hibernate-validator,根据后台验证规则自动生成前台的js验证代码

    在SpringMVC学习系列(6) 之 数据验证中我们已经学习了如何结合Hibernate-validator进行后台的数据合法性验证,但是通常来说后台验证只是第二道保险,为了更好的用户体验会现在前端 ...

  3. 分享一个快速设置背景的js 自动获取背景图的长宽

    我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> ...

  4. (C++C#类型互转工具)使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明

    在网上看到很多网友在.NET程序中调用Win32 API,或者调用自己的VC DLL里面提供的函数的时候,总是被生成正确的C函数在C#中的正确声明而困扰,而生成C++中结构体在C#中的声明 - 天,没 ...

  5. 有没有一个工具可以帮助查找python的bug和进行静态的代码分析?

    答:PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告 Pylint是另外一个工具可以进行codingstandard检查

  6. springboot自动生成mysql的DAO层代码

    springboot提供了强大丰富的整合内容,但是每次要写一堆dao层的xml或者数据库相关的配置代码的时候,还是挺繁琐又容易出错的. 可以用mybatis-generator自动生成代码: 只需要加 ...

  7. 自动生成查找组件的lua代码

    本篇主要解决的问题是使用lua脚本编写unity业务逻辑时,自动生成一些查找组件及绑定控件事件的lua代码! 现在很多unity项目都是用ulua作为热更新解决方案,因此需要用lua来写相关的逻辑,经 ...

  8. csdn自动生成目录索引、插入代码片快捷键

    文章目录 自动生成目录索引 插入代码片 自动生成目录索引 文章开头加入 @[TOC](目录描述) 目录描述可不写 插入代码片 cmd/ctrl + shift + k

  9. 分享一个Object.defineProperties 定义一个在原对象可读可写的方法

    function A(){ this.name = 'hellow word'; } Object.defineProperties( A.prototype,{ doSomething2 : { v ...

  10. 分享一个工具方法:日期格式化 & 日期转化,用法与java类SimpleDateFormat类似

    /** * y 年(201X) * M 年中的月份(1-12) * d 月份中的天数(1-31) * H 一天中的小时数(0-23) * h am/pm 中的小时数(1-12) * m 小时中的分钟数 ...

随机推荐

  1. 你知道,java项目中是如何获取文件地址的吗?

    摘要:在java项目中我们经常会读取配置文件,但是文件的路径在获取时我们是怎么得到的?因为我总是忘记获取文件地址的方法,就在此记录一下 本文分享自华为云社区<[Java]Java项目的绝对地址和 ...

  2. Office 看不了激活更改产品密钥

    Office 看不了激活更改产品密钥 解决方案: PatchOffice.rar - 蓝奏云 将文件解压到桌面 >>> 右击,以管理员方式运行或双击运行均可 >>> ...

  3. Mac 设置 JAVA_HOME

    Mac /System/Library/Frameworks/JavaVM.framework/Home/bin/java: No such file or directory 查找JAVA_HOME ...

  4. 【C++开源库】Windows 下编译 libcurl 库

    亲测可用: https://codeantenna.com/a/pJaN3omqjp What is libcurl ? libcurl 是一个跨平台的网络协议库,支持 http, https, ft ...

  5. Round A 2021 - Kick Start 2021

    比赛链接:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000436140 K-Goodness String (5 ...

  6. mybatis-plus Date类型的参数 只有年月日 没有时分秒的解决办法

    问题: 使用mybatis-plus 设计实体的时候 使用   Date inTime;   数据库里的时间2021-11-05 22:00:13 但java里的时间变成了2021-11-05 00: ...

  7. 高级数据结构---B树和B+树及mysql索引分析

    mysql索引数据结构:https://www.cnblogs.com/nijunyang/p/11406688.html 几种树结构的对比: 二叉查找树:二叉搜索树,二叉排序树,优点查找快,但是在某 ...

  8. vue-devtools调试工具

  9. python之排序的几种方法

    一.通过sort()可以快速实现数组的排序: 1 a=[2,3,1] 2 a.sort() 3 print(a) 打印返回结果: 二.如果不知道有sort()函数或者一些特殊场景需要排序时,如果解决呢 ...

  10. Oracle数据库学习总结

    SQL 笔记 ch3_cn 1.数据类型记录 char(n) 定长字符 varchar(n) 可变长字符 numeric(p,d) 定点数,总位数p,小数点后位数q float(n) n位浮点数 2. ...