告别配置混乱:让分布式系统的参数“听话”的四种策略
系统中通常包含各种配置信息,以日志系统为例,需要配置以下参数:
- 日志文件存储主目录
- 不同日志级别对应的文件名称
- 当前日志记录级别
此外还包括各种业务参数和系统参数。在单一系统中,通常将这些配置直接写入配置文件,部署到测试或生产环境时再修改配置文件。这种方式容易出错,且无法灵活调整。当系统演进为分布式架构后,随着子系统数量增加,配置管理变得越来越复杂。
一个优秀的配置管理方案至少应解决以下问题:
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)直接将配置存储在数据库,对于并发量小或管理类系统可以考虑,但对于高并发应用不建议使用数据库作为配置中心,因为会增加数据库访问压力,而且实现配置动态更新也比较复杂。
总结
以上是目前常见的四种配置管理方案。很明显,配置中心是最佳解决方案,能够有效解决上述所有问题,但需要依赖中间件并保证其高可用性。如果您有其他更好的配置管理方式,欢迎留言分享。
