configuration - 应用配置存储的良好做法?
问题描述
我们有许多松散耦合的应用程序,一些使用 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* Getting Started Guide的第 2 章(语法概述)和第 3 章(API 概述) ,您会注意到它支持我在此答案中讨论的那种灵活方法("url#...
格式不受支持,但"exec#curl -sS ..."
提供相同的功能)。99% 的时间,我最终都会使用配置文件,但我很欣慰地知道,我的应用程序可以在需要时轻松切换到使用不同的配置数据源技术。
推荐阅读
- swift - updateData FieldValue.delete() 的 Firebase Cloud Firestore 安全规则 [swift]
- http - 如何在esp32中在蓝牙和wifi之间切换
- exist-db - Exist-db:指定转换顺序?
- python - 元素在检查模式下具有 ID,但在原始 HTML 中没有
- mysql - 选择其他表中不匹配的行
- python - 如何在python中使用或运算符从csv中的列中选择多个值
- python - Django Rest Framework:具有嵌套资源和两个 ID 的 URL
- reactjs - 如何使用 useState 挂钩设置标记文本?
- reactjs - 如何在没有互联网的情况下离线使用 direflow-component?
- flutter - 如何在 Flutter 中制作倒圆角的容器?