【问题标题】:Is there a standard session layer protocol for configuration of applications?是否有用于配置应用程序的标准会话层协议?
【发布时间】:2012-04-24 21:25:42
【问题描述】:

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

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

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

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

那里有什么吗?我必须自己创建吗?

【问题讨论】:

  • 我建议您可能需要更改标题,因为它给人的印象可能是您在谈论源代码配置管理(即版本控制)
  • @Component10,谢谢 - 更新了。
  • 我不知道标准,但您可能正在寻找GSettings
  • 你能告诉我们它是什么应用程序吗?为什么在您的场景中不需要在启动时从配置文件读取并通过信号进行进一步更改的传统方法?顺便说一句,共享内存似乎是一个不错的选择,因为它是异步的。

标签: c++ linux configuration


【解决方案1】:

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

假设您的应用程序名为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 等。 -sScurl 的命令行选项告诉它除了错误消息之外不打印诊断信息,这可能是您想要的。

"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#..." 功能,包括防止人们尝试执行恶意命令的安全机制。

【讨论】:

  • 我不确定这是否能回答我的问题——我想知道你的主要观点是不是你的解析器库的插件;)。我特别希望 all 配置通过一个管道进入应用程序。您在上面提到的文件是静态的 - 如果方法是“跟踪”它们并观察它们的增长,请引入更多配置,这可能是一个解决方案。
  • 您的问题似乎有两个要求:(1)硬编码用于访问配置数据的技术; (2) 在配置数据发生变化时触发重新访问配置数据。我对 (1) 提出的解决方案是使用插件架构,并且我建议了两种实现该架构的方法。我没有针对 (2) 的解决方案,并且在我看来,您没有提供对 (2) 要求的明确描述。由于我对 (1) 提出的解决方案不符合您的要求,也许您可​​以编辑您的问题以更清楚地重申您的要求。
  • 正如您所建议的,跟踪文件(或定期轮询套接字连接)以查看是否有新的配置数据是获取更新的一种方法。但是,它会在您的应用程序中绑定一个线程。如果您的应用程序是单线程的,那么这可能是不可接受的。 tuxuday 建议在收到信号时重新读取(可能是更新的)配置文件似乎很好。你能解释一下为什么他的提议不符合你的要求吗?
猜你喜欢
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2013-11-12
  • 2012-10-28
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多