我们有许多松散耦合的应用程序,有些在PHP中,有些在Python中。
有一个集中的地方,他们可以在那里获得全局和应用程序特定的配置信息,这将是有益的。
类似于,对于Python:
conf=config_server.get_params(url='http://config_server/get/My_app/all', auth=my_auth_data)
然后理想地使用参数作为潜在的嵌套属性,例如conf.APP.URL
、conf.GLOBAL.MAX_SALES
我正在考虑制作自己的配置服务器应用程序,但不确定这种方法的优缺点是什么与例如将配置存储在集中式数据库或任何其他多站点可访问模式中相比。
此外,如果我错过了一些现成的支持工具,它可以做到这一点(我看了Puppet和Ansible,但它们似乎是非常进化的工具,可以做更多的事情。我也看了软件推荐SE,但他们已经有很多这样的问题没有回答(。
我认为您的配置机制最好不要进行硬编码以通过特定技术(如文件、web服务器或数据库(获取配置数据,而是能够从几种不同技术中的任何一种获取配置数据。我用以下伪代码示例来说明这一点:
cfg = getConfig("file.cfg"); # from a file
cfg = getConfig("file#file.cfg"); # also from a file
cfg = getConfig("url#http://config_server/file.cfg"); # from the specified URL
cfg = getConfig("exec#getConfigFromDB.py"); # from stdout of command
传递给getConfig()
的参数可以从命令行选项中获得。"exec#..."
格式是一种灵活的机制,但有人指定要执行的恶意命令(例如"exec#rm -rf /"
(会带来潜在的危险。
这种方法意味着您可以尝试任何您认为理想的配置数据技术来源,然后,如果您发现该技术不合适,那么放弃它并使用不同的配置数据源技术将是微不足道的。事实上,使用哪种配置数据技术源的决定可能因用例/用户而异。
我开发了一个名为Config4*的C++和Java配置文件解析器(抱歉,没有Python或PHP实现(。如果查看Config4*入门指南的第2章(语法概述(和第3章(API概述(,您会注意到它支持我在本回答中讨论的那种灵活方法(不支持"url#...
格式,但"exec#curl -sS ..."
提供了相同的功能(。99%的情况下,我最终会使用配置文件,但我感到欣慰的是,无论何时需要,我的应用程序都可以轻松地切换到使用不同的配置数据技术源。