go-plugin
虽然插件系统是通过RPC的,但它目前只被设计为在本地[可靠]网络上工作。真正的网络上的插件不被支持,并且会导致意外的行为。
这个插件系统已经在许多不同的项目中的数百万台机器上使用过,并被证明是经过战斗加固的,可以用于生产。
特点
HashiCorp的插件系统支持一系列的功能。
插件是Go接口的实现。这使得编写和使用插件感觉非常自然。对一个插件作者来说:你只需实现一个接口,就像它要在同一个进程中运行一样。对于一个插件用户来说:你只需使用和调用一个接口的函数,就像它在同一个进程中一样。这个插件系统处理中间的通信。
跨语言支持。几乎所有的主要语言都可以编写(和消费)插件。这个库支持通过gRPC为插件提供服务。基于gRPC的插件使得插件可以用任何语言编写。
io.Reader/WriterMuxBroker
双向通信。因为插件系统支持复杂的参数,主机进程可以向它发送接口实现,插件可以回调到主机进程。
log
协议版本。支持一个非常基本的 "协议版本",它可以被递增以使以前的任何插件失效。这在接口签名改变、协议级别改变是必要的等情况下很有用。当协议版本不兼容时,会向终端用户显示一个人性化的错误信息。
io.Writer
ssh
ReattachConfigNewClient
密码学上安全的插件。插件可以用预期的校验和进行验证,RPC通信可以被配置为使用TLS。宿主进程必须有适当的安全保障来保护这个配置。
架构
net/rpc
这种架构有很多好处。
go build
使用方法
examples/
net/rpcPluginplugin.Servemainplugin.Client
examples/
关于完整的API文档,请参阅GoDoc。
路线图
我们的插件系统是不断发展的。当我们将插件系统用于新项目或现有项目的新功能时,我们不断发现我们可以进行的改进。
在这个时间点上,插件系统的路线图是。
**语义版本管理。**插件将能够实现语义版本。这个插件系统将给主机进程提供一个约束版本的系统。这是对已经存在的协议版本控制的补充,后者更多的是针对较大的底层变化。
关于共享库呢?
当我们开始使用插件时(2012年底,2013年初),通过RPC的插件是唯一的选择,因为Go不支持动态库加载。今天,Go支持插件标准库,但有一些限制。自2012年以来,我们的插件系统已经从数以千万计的用户使用中稳定下来,并且有许多我们非常重视的好处。
例如,我们在Vault中使用这个插件系统,在那里,由于安全原因,动态库加载是不可接受的。这是一个极端的例子,但我们相信我们的库系统与动态库加载相比,优点多于缺点,由于我们已经建立并测试了多年,我们将继续使用它。
与我们的系统相比,共享库有一个主要的优势,那就是更高的性能。在我们各种工具的实际应用中,我们从未要求我们的插件系统有更高的性能,而且它的吞吐量非常高,所以目前这对我们来说并不是一个问题。