gpt4 book ai didi

go - 将插件添加到 go 程序

转载 作者:IT王子 更新时间:2023-10-29 01:57:31 25 4
gpt4 key购买 nike

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

/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 中没有类加载器的概念,并且加载这意味着必须使用 golang 工具中的 loader 包。

关于如何以更Go- 特殊的方式做到这一点的建议?最后,我只需要能够将 URI 映射到端口和实现即可。

最佳答案

编译时配置

如果您可以接受编译时配置,那么就不需要 JSON(或任何其他)配置文件。

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

运行时配置

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

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

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

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

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

独立的多应用

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

标准库为您提供了 httputil.ReverseProxy这样做。

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

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

关于go - 将插件添加到 go 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47207340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com