繁体   English   中英

将插件添加到go程序中

[英]add plugins to a go program

我需要为Go程序提供可插入功能。 这个想法是第三方可以为给定路径添加功能,即

/alive映射到http://localhost:9876 ,或/branding映射到http://localhost:9877 ,依此类推。

我首先尝试将其视为添加JSON配置文件,其中每个此类插件都有一个条目,例如:

{
  "Uri": "alive",
  "Address":"http://localhost:9876",
  "Handler":"github.com/user/repo/path/to/implementation"
},

这虽然公然揭示了Java思考-感觉就像是杯水车薪的Go -没有在类加载器的概念Go和加载,这将意味着必须使用loader从包golang的工具。

如何做到这一点更建议Go -特质呢? 最后,我只需要能够将URI映射到端口和实现。

编译时配置

如果您可以使用编译时配置,则不需要JSON(或任何其他)配置文件。

您的main包可以导入所有涉及的“插件”,并将其处理程序映射到适当的路径。 也没有必要创建多个服务器,但如果更符合您(或模块)的需求,您可以这样做。

运行时配置

运行时配置和插入新模块需要在运行时加载代码。 这是由plugin包支持,但目前只在linux下。

为此,您可以使用JSON配置文件,在其中列出已编译的插件(已编译插件的路径)以及映射它们所需的路径。

main包中,您可以读取配置文件,并加载插件,这些插件应该公开一个变量或函数,它返回处理流量(请求)的处理程序。 出于性能原因,这比插件本身启动http服务器更受欢迎,但两者都可以工作(插件返回处理程序供您注册,插件启动其服务器)。

请注意,也没有必要使配置“静态”,主应用程序也可以在运行时接收和加载新模块(例如,通过专用处理程序,它可以接收到新模块的(文件)路径和路径到将它映射到,也可以选择甚至是二进制插件代码;但不要忘记安全性!)。

请注意,虽然您可以在运行时加载插件,但无法“卸载”它们。 加载插件后,它将保留在内存中,直到应用程序存在。

独立的多应用程序

还有第三种解决方案,您的主应用程序将充当代理。 在这里,您可以将其他“模块”作为单独的应用程序启动,在特定端口上侦听localhost,主应用程序将充当代理,转发请求进入其他独立应用程序侦听不同端口@localhost(或甚至其他主机)。

标准库为您提供httputil.ReverseProxy

这不需要运行时代码加载,因为“模块”是可以单独启动的单独应用程序。 尽管如此,这为运行时配置提供了灵活性,此解决方案也适用于所有平台。 此外,此设置支持在运行时删除模块,因为您可以轻松地取消映射/关闭独立模块的应用程序。

单独的应用程序也可以单独启动,或者从主应用程序启动,两种解决方案都可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM