最近,我一直在阅读有关“ 应将取决于环境的属性存储在哪里? ” 的辩论。
经典的方法是拥有多个属性文件,每个属性文件都取决于环境,并且基于环境变量(DEV,PROD ...),您可以选择在启动应用程序时在何处读取它们(例如使用Spring概要文件)。
另一方面,如果您使用容器来部署应用程序,则据说这种配置应来自环境本身(使用应用程序读取的环境变量),因此映像在环境之间不会改变。
每种方法的利弊是什么?容器方案是否有“最佳”方法?
最近,我一直在阅读有关“ 应将取决于环境的属性存储在哪里? ” 的辩论。
经典的方法是拥有多个属性文件,每个属性文件都取决于环境,并且基于环境变量(DEV,PROD ...),您可以选择在启动应用程序时在何处读取它们(例如使用Spring概要文件)。
另一方面,如果您使用容器来部署应用程序,则据说这种配置应来自环境本身(使用应用程序读取的环境变量),因此映像在环境之间不会改变。
每种方法的利弊是什么?容器方案是否有“最佳”方法?
Answers:
谁说属性文件和环境变量在哪里互斥?
“在哪里将我的应用程序配置存储在哪里?” 之间有区别。和“在哪里呢我的应用程序源它的配置?”
最可能的结果是,每个人可能都应该继续使用配置文件作为存储机制来做自己的事情(考虑到环境的存在,请长期考虑并保持持久状态)。
但是,与其将配置文件放到应用程序上下文中并让其运行,不应该只是期望这些变量在启动时已在环境中可用。
这意味着您需要有两个部署工作流程-
以使用consul之类的工具中的键值对管理环境变量为例,如果您将配置文件存储在git中,则使用git2consul之类的工具将其配置在更新时放入环境。
如果您有一个期望将配置作为配置文件使用的应用程序,则可以通过使用consul-template之类的构建流程来构建应用程序,从而避免将配置文件的多个副本随该应用程序一起交付,从而能够将您的配置文件将值领回文件。
我们这样做的方法是,每个运行的应用程序都有3个部分(或工件)。
配置文件位于单独的源代码管理中。这曾经是Git,但现在我们使用的是我们在http://www.configapp.com上构建的名为Config的SaaS 。Config的核心功能是易于处理特定于环境的配置。为了在新服务器上运行我们的应用程序,我们提取了该环境的Docker容器,应用程序工件和配置文件。在容器中,我们将安装应用程序和配置文件的目录装入容器中,作为容器运行的一部分。我们的应用程序是相同的。我们的容器/图像是相同的。只有配置文件不同。
关于配置文件与环境变量。最长的时间是我们使用配置文件。当我们使用PaaS / cloud时,我们使用了环境变量。如果您有很多配置,这是额外的工作,因此我们最终使用环境变量来确定正确的配置文件。我们有一个将属性转换为环境变量的应用程序,但这是非典型的。如果我们有公司认可的集中式配置服务器,则使用该服务器,否则我们将喜欢配置文件的简单性。
因此,总而言之,我们提取app.jar,app.properties,openjdk Docker。然后我们运行openjdk Docker,安装app.jar和app.properties的位置。唯一特定于环境的是app.properties。为了轻松管理app.properties,无论有多少个属性键,环境,群集/区域实例,我们都使用Config。