我正在从头开始设计应用程序。我有一个要求,我希望使用已经存在的解决方案来实现。
我希望在应用程序的整个生命周期中传输配置信息的传输和方法是统一的。
这是什么意思?这意味着在加载时使用文件进行配置,然后使用套接字通信进行后续配置是不行的。我希望所有配置都以一种方式进入应用程序。在整个应用程序的生命周期内,该管道始终可用。
对此,我不想让自己不得不使用IP。我想使用我喜欢的任何传输,包括System V共享内存或IPC。
那里有什么吗?我必须创建自己的吗?
答案 0 :(得分: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
的{{1}}命令行选项告诉它除了错误消息之外不打印诊断,这可能是你想要的。
curl
格式为使用其他方法检索配置信息铺平了道路。例如,从查询数据库,Subversion存储库或任何您想要的任何内容的脚本。
您可能还想支持以下变体:
"exec#..."
这将加载一个名为myApp -cfg "shared_lib=foo#..."
的共享库,并在其中调用入口点函数,并将foo
“作为参数传递。将由共享库函数决定如何根据参数执行。共享库的一个实现可能从共享内存中检索配置信息;另一个实现可能通过远程过程调用或套接字连接检索它;等等。
所有不同的检索机制都仅责任将配置数据检索为(可能很大的)字符串。例如,"...
机制读取文件的全部内容并将其作为字符串返回(或者作为-cfg /path/to/file.cfg
)。然后将该(可能很大的)字符串传递给“真实”配置解析器(XML / ini / properties文件的解析器或其他)。
我相信上述提案为您的一半问题提供了解决方案。特别是,它提供了一个插件架构,用于从任意源检索配置数据,其中插件可以编写为shell命令或共享库。
问题的另一半基本上是:“应用程序如何在其生命周期内动态检索更新的配置数据?”我没有解决这个问题。部分原因是我没有优雅的解决方案。部分是因为您没有说明可能触发重新读取配置数据的内容。
顺便说一下,我是名为Config4*的C ++ / Java配置解析器库的维护者。该库提供了std::istream
功能的实现。我提到如果你想检查源代码,看看如何实现这样的功能。我怀疑支持"exec#..."
所需的代码可以轻松地模拟现有代码以支持"shared_lib=foo#..."
。 “Config4 *入门指南”(可在网站上以PDF和HTML格式获得)提供了对"exec#..."
功能的良好讨论,包括防止人们尝试执行恶意命令的安全机制。