【分享一个工具】通过定义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, 希望对你有用。
【分享一个工具】通过定义proto3来自动生成多进程模式的插件代码的更多相关文章
- 一个可以自动生成css样式的插件happycss
一直在页面写css, 重复写着样式,发现布局中,特别是h5,大量的样式都是margin,padding,width,height, 而,当我们需要给一个标签写样式的时候,避免内联样式,我们又需要取cl ...
- SpringMVC学习系列-后记 结合SpringMVC和Hibernate-validator,根据后台验证规则自动生成前台的js验证代码
在SpringMVC学习系列(6) 之 数据验证中我们已经学习了如何结合Hibernate-validator进行后台的数据合法性验证,但是通常来说后台验证只是第二道保险,为了更好的用户体验会现在前端 ...
- 分享一个快速设置背景的js 自动获取背景图的长宽
我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> ...
- (C++C#类型互转工具)使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
在网上看到很多网友在.NET程序中调用Win32 API,或者调用自己的VC DLL里面提供的函数的时候,总是被生成正确的C函数在C#中的正确声明而困扰,而生成C++中结构体在C#中的声明 - 天,没 ...
- 有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
答:PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告 Pylint是另外一个工具可以进行codingstandard检查
- springboot自动生成mysql的DAO层代码
springboot提供了强大丰富的整合内容,但是每次要写一堆dao层的xml或者数据库相关的配置代码的时候,还是挺繁琐又容易出错的. 可以用mybatis-generator自动生成代码: 只需要加 ...
- 自动生成查找组件的lua代码
本篇主要解决的问题是使用lua脚本编写unity业务逻辑时,自动生成一些查找组件及绑定控件事件的lua代码! 现在很多unity项目都是用ulua作为热更新解决方案,因此需要用lua来写相关的逻辑,经 ...
- csdn自动生成目录索引、插入代码片快捷键
文章目录 自动生成目录索引 插入代码片 自动生成目录索引 文章开头加入 @[TOC](目录描述) 目录描述可不写 插入代码片 cmd/ctrl + shift + k
- 分享一个Object.defineProperties 定义一个在原对象可读可写的方法
function A(){ this.name = 'hellow word'; } Object.defineProperties( A.prototype,{ doSomething2 : { v ...
- 分享一个工具方法:日期格式化 & 日期转化,用法与java类SimpleDateFormat类似
/** * y 年(201X) * M 年中的月份(1-12) * d 月份中的天数(1-31) * H 一天中的小时数(0-23) * h am/pm 中的小时数(1-12) * m 小时中的分钟数 ...
随机推荐
- NDPQ(NDP+PQ),定义分布式数据库新方向
摘要:云服务提供商构建新的云原生关系数据库系统,专门为云基础架构设计,通常采用将计算和存储分离到独立扩展的分布式层的设计. 本文分享自华为云社区<性能提升100倍!GaussDB(for MyS ...
- 火山引擎智能外呼联合火山引擎VeDI升级服务,让企业精准营销不再难
企业营销模式正在经历一场巨变.数字化营销早已替代传统的营销方式,成为企业营销的主流方式和发展战略中不可或缺的部分.然而随着数字化营销的普及,市场迈入存量竞争时代,获客成本也逐年攀升.面对营销过程中不断 ...
- Jenkins Pipeline 流水线 - 完整构建 Pipeline Script 脚本
Docker Jenkins 安装配置 Windows 2016 安装 Jenkins 前置条件可参考 Jenkins Pipeline 流水线 - 拉代码(SVN) + Maven 编译打包 Jen ...
- vue3.0 学习使用记录
vue学习 在最近的一次项目中,前端js框架里使用了vue.vue的编程思想比较新颖,用起来也感觉高效便捷.由于个人原因,做完这个项目之后可能就接触不到前端的内容了,所以记录这个项目中对vue的学习和 ...
- POJ 1417 True Liars (并查集+DP)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1556 Accepted: 457 Description After havi ...
- JSP 学习笔记 | 一、JSP 原理理解
前文:IDEA | 使用Maven创建Web项目并配置Tomcat JSP(全称:Java Server Pages):Java 服务端页面.是一种动态的网页技术,其中既可以定义 HTML.JS.CS ...
- 【每日一题】26.codeJan与旅行 (贪心)
补题链接:Here 算法涉及:贪心 思路: 首先,我们处在p位置,显然要么向左走到相邻的城市,要么向右走走到相邻的城市. 有一个不会证明但观察到的结论,从这两个位置走的话,只有四种可能. 可能1:一直 ...
- Codeforces Round #565 (Div. 3) (重现赛个人题解)
1176A. Divide it! 题目链接:http://codeforces.com/problemset/problem/1176/A 题意: 给定一个数字 \(n\) 和三种操作 如果 n 能 ...
- vue-draggable 学习和使用
vue-draggable 学习和使用 https://www.jianshu.com/p/e8ff1e1cafb1
- 【D3 API 中文手册】
https://blog.csdn.net/tianxuzhang/article/details/47067699?utm_medium=distribute.pc_relevant.none-ta ...
