- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我需要为 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/
我在互联网上搜索了很多小时,但没有找到满意的结果,所以 -VSTO Addin 和 COM Addin(我们作为类库项目制作并使用 Excel 对象)之间有什么区别?VSTO 项目是否有任何限制,例如
我在互联网上搜索了很多小时,但没有找到满意的结果,所以 -VSTO Addin 和 COM Addin(我们作为类库项目制作并使用 Excel 对象)之间有什么区别?VSTO 项目是否有任何限制,例如
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在寻找有关如何构建可扩展 WCF 服务器(具有动态加载的服务)的建议,最好使用 System.Addins 或 MEF。 服务器应托管实现最小“插件”API(StartService/StopSe
有没有一种方法可以使用加载浏览器扩展/插件/插件的 headless 浏览器(即 PhantomJS、Selenium)来运行自动测试? 更具体地说,我想模拟广告拦截器(如 Ghostery、ad-b
我是 gradle 的新手,我使用 artifactory 作为我的 repo 服务器。我在网上查看了如何将我的项目发布到我的 repo 服务器,发现我可以使用 maven-publish 或使用 a
我想禁用某些状态的点击/事件,并仅使少数状态可点击。我通读了http://newsignature.github.io/us-map/处的文档,并且找不到与此问题相关的任何内容。 最佳答案 http:
据我了解,在Intellij中使用idea插件打开Maven构建的项目并不是最好的方法,即调用: mvn idea:idea 但是直接打开pom文件(Intellij有默认的Maven插件);同样的事
使用Artifactory plugin对于 Jenkins pipeline 来说是一种幸福,只要遵循文档就可以了。但后来我介绍了Maven Flatten plugin解析父模块和子模块 mvn
我已经安装了Elasticsearch版本1.7.1。一切正常。我也安装了 JDBC 驱动程序。检查下面我的插件文件夹 目录E:\Xampp\htdocs\my-elastic\elasticsear
在我使用 webpack common chunks 插件创建包含第三方库(如 angular、react、lodash 等)的 vendor 包之前,但后来我知道了 webpack dll
我们正在尝试使用(Jenkins、sonar、eclipse ...)安装 CI 平台。 为了让每个开发人员都可以在提交之前对他的代码进行分析,我想知道两种选择: 使用 Sonar 插件运行本地分析。
我知道这是一个比较特殊的问题。尽管如此,也许有些人知道这一点: 我想在 Eclipse 中使用 Maven 编译 Hector=> 分支:0.7.0 和标签:hector-0.7.0-29(https
我卡住了。我一直在尝试寻找或自己创建一个简单的准系统示例,说明如何为 VS 2010 Express 创建 Outlook 插件。我知道这在 VS 2010 Pro 中更简单,但是,在快速版本中真的不
我有以下排除过滤器来忽略所有 R 文件类: findbugs-exclude-filter.xml 当我将它用于 FindBugs-IDEA 插件时,它可以
我刚开始玩 CakePHP,我发现了 Wildflower CMS .我喜欢这个想法,并打算开始修补它。不过,我有一个问题。 在自述文件中,我发现了以下内容:“Wildflower 不是也不会是 Ca
虽然现在大部分情况都是使用n-api来编写插件,但是底层毕竟是v8(和libuv),使用v8编写简单的插件,同时熟悉v8的使用。 本文介绍在写c++插件时,简单又常用的写法,其实本质上,写插件
本篇是 Python 系列教程第 3 篇,更多内容敬请访问我的 Python 合集 Visual Studio Code的安装非常简单,就不放这里增加文章篇幅了。 相比PyCharm,V
Maven – 插件 什么是 Maven 插件? Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来: 创建 jar 文件 创建 war
我正在编写一个插件来添加带有标签 [deposit_page] 的页面;该标记应替换为一些 PHP 代码。 这就是我所拥有的,但它不起作用。有什么我遗漏或做错了什么吗? function deposi
我是一名优秀的程序员,十分优秀!