我正在开发一个包含四个产品的产品套件。目前,所有的配置数据都在XML或属性文件中。这种方法是不可维护的,因为我们需要为不同的环境(例如生产环境、开发环境等)管理不同的配置文件。
那么,最佳的处理配置数据的方式是什么呢?
另外,我们能否将其模块化成一个单独的模块?以便所有产品都可以使用该模块。 我们不想使用属性文件。我正在寻找一种解决方案,即将所有与配置有关的代码移动到一个新的配置模块中,并将所有配置数据保存在数据库中。
我正在开发一个包含四个产品的产品套件。目前,所有的配置数据都在XML或属性文件中。这种方法是不可维护的,因为我们需要为不同的环境(例如生产环境、开发环境等)管理不同的配置文件。
那么,最佳的处理配置数据的方式是什么呢?
另外,我们能否将其模块化成一个单独的模块?以便所有产品都可以使用该模块。 我们不想使用属性文件。我正在寻找一种解决方案,即将所有与配置有关的代码移动到一个新的配置模块中,并将所有配置数据保存在数据库中。
使用commons-configuration,您可以获得一个统一的API来访问属性,无论它们如何被表示——.properties、xml、JNDI等等。例如:
config.properties
:
jdbcHost=192.168.12.35
jdbcUsername=dbuser
jdbcPassword=pass
config.xml
:
<config>
<jdbcHost>192.168.12.35</jdbcHost>
<jdbcUsername>dbuser</jdbcUsername>
<jdbcPassword>pass</jdbcPassword>
</config>
在这两种情况下,它们可以通过类似以下方式访问:
String host = config.getString("jdbcHost");
您已接近成功...我建议您保持相同的方法,并通过类似以下任一方法之一,为运行的应用程序实例拉入正确的配置文件:
将所有配置文件命名不同,并根据某些唯一标准(用户名、主机名等)拉入应用程序中:
将它们保留在代码库之外的位置,该位置基于应用程序假定存在的环境变量:
我甚至在同一个项目中使用了这些方法的组合(对于构建过程配置使用 #1,对于运行时配置使用#2)。
create table configuration (mode char(3), key varchar(255), value varchar(1023));
insert into configuration values ('pro', 'param1', 'value1'); -- production
insert into configuration values ('dev', 'param1', 'value1'); -- development
insert into configuration values ('tst', 'param1', 'value1'); -- testing
...
对于我们所有的环境,配置数据以属性文件的形式存在于目标机器上。我们使用SpringFramework的 PropertyPlaceholderConfigurer将这些属性绑定到我们的应用程序中,以使跨环境移植性更强。
例如,只要我知道无论我的应用程序在哪台机器上运行,都会有 /etc/myapp/database.properties 文件存在,那么在我的 Spring 配置中,我只需要像这样编写:
<bean id="myPropertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/etc/myapp/database.properties</value>
</list>
</property>
</bean>
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://${db.host}:3306/${db.name}" />
<property name="username" value="${db.user}" />
<property name="password" value="${db.pass}" />
</bean>
关于Spring课程中属性文件存放位置的选择有很多选项。你甚至可以将它们作为替换项,并将其作为环境变量传递:
<bean id="myPropertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="searchSystemEnvironment" value="true" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="locations">
<list>
<value>${database.configuration.file.url}</value>
</list>
</property>
</bean>
有很多不同的策略。它们都很好,取决于哪种最适合您。
2023年的现代解决方案:
你最好的选择是创建一个Spring Boot Java应用程序,并在application.properties
或application.yml
文件中定义所有属性。
优点:
环境变量是最简单的方法之一。像设置其他变量一样设置它们,使用System.getenv("...")
访问它们。
Config 是一款配置文件管理工具。您可以创建适用于所有环境的通用配置,也可以创建特定于某个环境的配置。您可以继续使用 XML 和属性文件,并让 Config 维护环境之间的差异。您可以将 Config 视为集中式数据库,它可以以您想要的格式输出配置文件。每当您需要配置文件时,只需从 Config 部署(推送或拉取)到所需位置即可。请注意,我是 Config 团队的一员。