我正在从头开始设计应用程序。我有一个要求,我想使用已经存在的解决方案来满足。
我希望在应用程序的整个生命周期中,用于传递配置信息的传输和方法是统一的。
这是什么意思?这意味着在加载时使用文件进行配置,然后使用套接字通信进行以后的配置是不行的。我希望所有配置都以一种方式进入应用程序。该管道在应用程序的整个生命周期中始终可用。
除此之外,我不想让自己不得不使用 IP。我想使用我喜欢的任何传输方式,包括 System V 共享内存或 IPC 之类的东西。
外面有什么吗?我必须创建自己的吗?
我正在从头开始设计应用程序。我有一个要求,我想使用已经存在的解决方案来满足。
我希望在应用程序的整个生命周期中,用于传递配置信息的传输和方法是统一的。
这是什么意思?这意味着在加载时使用文件进行配置,然后使用套接字通信进行以后的配置是不行的。我希望所有配置都以一种方式进入应用程序。该管道在应用程序的整个生命周期中始终可用。
除此之外,我不想让自己不得不使用 IP。我想使用我喜欢的任何传输方式,包括 System V 共享内存或 IPC 之类的东西。
外面有什么吗?我必须创建自己的吗?
我认为以下内容不会提供您正在寻找的功能,但它可能会提供一些思考空间......
假设您的应用程序被调用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#..."
功能进行了很好的讨论,包括防止人们尝试执行恶意命令的安全机制。