1

我正在从头开始设计应用程序。我有一个要求,我想使用已经存在的解决方案来满足。

我希望在应用程序的整个生命周期中,用于传递配置信息的传输和方法是统一的。

这是什么意思?这意味着在加载时使用文件进行配置,然后使用套接字通信进行以后的配置是不行的。我希望所有配置都以一种方式进入应用程序。该管道在应用程序的整个生命周期中始终可用。

除此之外,我不想让自己不得不使用 IP。我想使用我喜欢的任何传输方式,包括 System V 共享内存或 IPC 之类的东西。

外面有什么吗?我必须创建自己的吗?

4

1 回答 1

0

我认为以下内容不会提供您正在寻找的功能,但它可能会提供一些思考空间......

假设您的应用程序被调用myApp,并且-cfg <...>命令行选项用于指定其配置的来源。您可以允许以下选项...

myApp -cfg /path/to/configuration/file.cfg

上面很明显:从指定文件中读取配置。

myApp -cfg "exec#curl -sS http://configWebServer/path/to/file.cfg"

exec#前缀指定应执行指定的命令。预计该命令将写入标准输出。然后将该标准输出解析为配置文件。

顺便说一句,curl代表cat URL。它是一个开源实用程序,可以使用多种协议检索文件,包括 HTTP(S)、FTP(S)、LDAP 等。-sS命令行选项告诉curl它除了错误消息之外不打印诊断信息,这可能是您想要的。

"exec#..."格式为使用其他方式检索配置信息铺平了道路。例如,来自查询数据库的脚本、来自 Subversion 存储库或任何您想要的。

您可能还希望支持以下变体:

myApp -cfg "shared_lib=foo#..."

这将加载一个名为 的共享库foo,并在其中调用一个入口点函数,将"..." 作为参数传递。由共享库函数决定如何处理该参数。共享库的一种实现可能会检索来自共享内存的配置信息;另一个实现可能通过远程过程调用或套接字连接检索它;等等。

所有不同的检索机制负责将配置数据作为(可能很大的)字符串进行检索。例如,该-cfg /path/to/file.cfg机制读取文件的全部内容并将其作为字符串(或者可能作为std::istream)返回。然后将该(可能很大)字符串传递给“真正的”配置解析器(XML/ini/properties 文件或其他文件的解析器)。

我相信上述建议为您的一半问题提供了解决方案。特别是,它提供了一种插件架构来从任意来源检索配置数据,其中插件可以编写为 shell 命令或共享库。

您问题的另一半基本上是:“应用程序如何在其生命周期内动态检索更新的配置数据?” 我没有解决这个要求。部分原因是我没有提供优雅的解决方案。部分原因是您没有指出可能触发重新读取配置数据的原因。

顺便说一句,我是一个名为Config4*的 C++/Java 配置解析器库的维护者。该库提供了该"exec#..."功能的实现。我提到,如果您想检查源代码以了解如何实现此类功能。我怀疑支持所需的代码"shared_lib=foo#..."可以很容易地以现有的支持代码为模型"exec#..."。“Config4* 入门指南”(可从网站以 PDF 和 HTML 格式获得)对该-cfg "exec#..."功能进行了很好的讨论,包括防止人们尝试执行恶意命令的安全机制。

于 2012-04-25T21:45:50.553 回答