系统中通常包含各种配置信息,以日志系统为例,需要配置以下参数:

  • 日志文件存储主目录
  • 不同日志级别对应的文件名称
  • 当前日志记录级别

此外还包括各种业务参数和系统参数。在单一系统中,通常将这些配置直接写入配置文件,部署到测试或生产环境时再修改配置文件。这种方式容易出错,且无法灵活调整。当系统演进为分布式架构后,随着子系统数量增加,配置管理变得越来越复杂。

一个优秀的配置管理方案至少应解决以下问题:

1)支持在线灵活修改配置
2)支持配置动态实时生效
3)支持多环境差异化配置
4)支持统一集中管理配置

那么如何有效管理这些配置呢?我总结了几类常用方法,大家可以根据具体应用场景选择参考。

1、数据库存储方案

将所有配置参数存储在数据库表中,系统启动时加载到内存中。

这种方式实现简单,但会占用数据库资源,在系统简单、压力较小的场景下可以考虑使用。

2、构建时打包方案

利用Maven的maven-resources-plugin插件,根据不同环境(Profile)提供对应的配置文件,在构建阶段就确定环境配置。

这种方式只能解决不同环境的配置差异问题,无法实现动态修改。每次配置更新都需要重新打包或在线修改配置文件,配置同步也比较困难。在项目数量少、配置变更不频繁的场景下尚可接受,但在大型分布式系统中会变得异常繁琐。

3、环境变量方案

将配置值设置到环境变量中,然后读取并设置到Java系统属性中。这种方式可以实现环境区分,但无法动态更新配置,而且环境变量的配置和维护比较麻烦,在分布式系统中更是如此。
// 读取环境变量
java.lang.System#getenv(java.lang.String)

// 设置系统属性
java.lang.System#setProperty

text

对于全局系统配置,如日志、缓存、临时目录等,可以考虑使用这种方式,主流日志系统都支持从系统属性读取配置。但对于其他业务配置,不建议存储在环境变量中。

4、配置中心方案

1)目前大多数分布式配置中心都基于Zookeeper实现,Spring Cloud也提供了自己的配置中心组件,这些方案都支持在线动态更新和刷新配置。

2)直接将配置存储在数据库,对于并发量小或管理类系统可以考虑,但对于高并发应用不建议使用数据库作为配置中心,因为会增加数据库访问压力,而且实现配置动态更新也比较复杂。

总结

以上是目前常见的四种配置管理方案。很明显,配置中心是最佳解决方案,能够有效解决上述所有问题,但需要依赖中间件并保证其高可用性。如果您有其他更好的配置管理方式,欢迎留言分享。