管理配置数据的最佳方法是什么

我正在开发一个有4个产品的产品套件。 现在,所有配置数据都在XML或属性文件中。这种方法不可维护,因为我们必须管理不同环境的不同配置文件(例如生产,开发等)。

那么, 处理配置数据的最佳方法是什么?

另外,我们可以将其模块化为单独的模块吗? 这样所有产品都可以使用这个模块。 我们不想使用属性文件。 我正在寻找一种解决方案,我们可以将所有配置特定代码作为新配置模块移动,并将所有配置数据保存在数据库中。

使用commons-configuration,您可以使用统一的API来访问属性, 无论它们如何表示 – .properties,xml,JNDI等。例如:

config.properties

 jdbcHost=192.168.12.35 jdbcUsername=dbuser jdbcPassword=pass 

config.xml

  192.168.12.35 dbuser pass  

在这两种情况下,他们都可以通过以下方式访问:

 String host = config.getString("jdbcHost"); 

你几乎就在那里……我将保持你的方法相同,并为通过类似于以下任一方法的方法运行的应用程序实例提供正确的配置文件:

  1. 以不同的方式命名所有配置文件,让应用程序通过一些独特的标准(用户名,主机名等)将它们引入:

    • 生产 .properties
    • developer1 .properties
    • developer2 .properties
  2. 根据应用程序假定存在的环境变量,将它们保留在代码库之外的某个位置:

    • YOURAPP_CONFIG_DIR /server_config.xml
    • YOURAPP_CONFIG_DIR /database_config.properties

我甚至在同一个项目中使用了这些方法的组合(构建过程配置为#1,运行时配置为#2)。

如果您的应用程序使用数据库,则可以创建“配置”表,如下所示:

 create table configuration (mode char(3), key varchar(255), value varchar(1023)); 

您可以使用init脚本初始化它,例如init.sql,内容如下:

 insert into configuration values ('pro', 'param1', 'value1'); -- production insert into configuration values ('dev', 'param1', 'value1'); -- development insert into configuration values ('tst', 'param1', 'value1'); -- testing ... 

这种方法的好处如下:

  • 您将脚本与您的代码一起编辑
  • 通过添加用户/组ID,您可以轻松地将其扩展为包括每用户或每组设置
  • 如果需要,可以在运行时更改设置
  • 您可以使用通常用于处理核心应用程序数据来处理配置数据的相同堆栈(JPA + DAO,Cayenne …)

对于我们的所有环境,配置数据都以属性文件的forms存在于目标计算机上。 我们使用SpringFramework中的PropertyPlaceholderconfigurer将这些属性绑定到我们的应用程序,以便在环境中保持可移植性。

例如,只要我知道/etc/myapp/database.properties将存在于我的应用程序将运行的任何机器上,那么在我的spring配置中,我只需要这样的东西:

     /etc/myapp/database.properties          

Spring类有很多关于属性文件可以存在的选项。 您甚至可以替换它们并将它们作为环境变量传递:

       ${database.configuration.file.url}    

在bash_profile(或其他)中:export JAVA_OPTS =“ – Ddatabase.configuration.file.url = file:///etc/myapp/database.properties”

或者只是在调用“java”时传入相同的-D选项,具体取决于您正在执行的操作。

FWIW,我们将我们的属性文件作为RPM单独维护。

有很多不同的策略。 所有这些都很好,取决于最适合你的。

  1. 构建单个工件并将配置部署到单独的位置。 工件可以有占位符变量,在部署时,可以读入配置。查看Springs属性占位符。 它非常适用于使用Spring的webapps,并且不涉及涉及操作。
  2. 有一个外部属性配置,它位于webapp之外。 保持位置不变并始终从属性配置中读取。 在任何阶段更新配置,重启将是新值。
  3. 如果您正在修改环境(即正在使用的应用程序服务器或用户/组权限),请查看使用上述方法与puppet或chef。 另请参阅使用这些工具管理配置文件。

环境变量是最简单的方法。 像往常一样设置它们,使用System.getenv("...")访问它们

Config是一个配置文件管理工具。 您可以创建在所有环境中通用的配置,也可以创建特定于环境的配置。 您可以继续使用XML和属性文件,并让Config维护环境中的差异。 您可以将Config视为您的集中式数据库,它可以以您希望的格式输出配置文件。 无论何时需要配置文件,只需将其从Config部署(推或拉)到所需位置即可。 请注意,我是Config团队的一员。

这是一个简单的愚蠢解决方案。

代码片段,首先尝试使用当前目录中的属性文件。 如果失败,请使用资源目录(或jar文件)中的属性文件。

  Properties configFile = new Properties(); try { configFile.load(new FileInputStream("production.properties")); } catch (Exception e) { System.err.println("Can not read properties, try to use default properties file."); configFile.load(this.getClass().getClassLoader(). getResourceAsStream("development.properties")); }