插件架构
去插件
许创建插件(通过 plugin 构建模式)并在运行时使用这些插件(通过 plugin package )。为了利用这种架构,在开发插件方面有严格的要求。
通过使用网络 RPC 接口,插件独立构建和分发,无需重新构建 geth 。特别是使用 gRPC 接口,插件可以用不同的语言编写(参见我们的 examples )。这使您可以轻松构建原型功能或什至是组织内部使用的专有插件。
我们使用 HashiCorp 的 go-plugin 库,因为它符合我们的要求,并且已经在许多基于插件的生产系统中得到验证。
好处
动态链接的二进制文件(使用插件时获得的)比静态编译的二进制文件小得多。
我们重视隔离故障的能力。例如:即使安全插件崩溃, GoQuorum 客户端也会继续挖掘 / 验证。
轻松支持以 Go 以外的语言编写的开源插件。
设计
发现
GoQuorum 客户端读取插件 settings 文件以确定将要加载哪些插件并在插件 baseDir (默认为 <datadir>/plugins )中搜索已安装的插件( <name>-<version>.zip 文件)。如果路径中不存在所需的插件, GoQuorum 将尝试使用配置的 plugin central 来下载插件。
插件管理器
PluginManager 管理在 geth 中使用的插件。它读取 configuration 并构建插件注册表。 PluginManager 在 geth 中实现了标准的 Service 接口,因此被嵌入到 geth 服务生命周期中,即:暴露服务 API ,启动和停止。 PluginManager 服务在节点生命周期中尽早注册。这样做是为了保证在注册 PluginManager 时遇到问题,节点快速失效,不影响其他服务。
插件重装
PluginManager 公开了一个允许重新加载插件的 API admin_reloadPlugin) 。这会尝试重新启动当前的插件进程。
重新加载插件时,将应用初始节点启动后对插件配置的任何更改。这在 HelloWorld plugin example 中进行了演示。