0
点赞
收藏
分享

微信扫一扫

不同环境下的应用配置管理

从生命周期的角度,环境主要包括如下:

  • 开发环境,主要是在应用或软件开发过程中或完成后,开发人员对自己实现的代码进行单元测试、联调和基本的业务功能验证;
  • 集成环境,开发人员完成代码开发并自验证通过后,将应用软件发布部署到这个环境,测试人员再确保软件业务功能可用,整个业务流程是可以走通的;
  • 预发环境,在真实的生产数据环境下进行验证,但是不会接入线上流量,这也是上线前比较重要的一个验证环节;
  • Beta 环境,也就是灰度环境或者叫金丝雀发布模式。为了整个系统的稳定性,对于核心应用,通常会再经历一个 Beta 环境,引入线上万分之一,或千分之一的用户流量到这个环境中;
  • 线上环境,经历了前面几个阶段的业务功能和流程验证,我们就可以放心地进行版本发布了,这个时候就会将应用软件包正式发布到线上 。

不同的环境,配置是不完全相同的。

方案一,多个配置文件,构建时替换

这是一个比较简单且直接有效的方式,就是不同环境会分别定义一个配置文件,比如:

  • 开发环境 dev_config.properties
  • 预发环境 pre_config.properties
  • 线上环境 online_config.properties

然后在构建时,我们会根据当前所选定的环境进行替换。比如,我们现在构建开发环境的软件包,这时就会选择 dev_config.properties 作为配置文件,并将其文件名替换为 config.properties 打包到整个软件包中。

我们看下这种方案的优缺点:

  • 优点,就是简单直接。在环境相对固定且配置项变化不大的情况下,是最为简便的一种环境配置管理方式。
  • 缺点,也比较明显。首先是在实际的场景中,我们的环境可能会更多,且交付上线后可能还会有线上多环境。这时每多出一个环境,就要多一个配置文件,这时配置项的同步就会成为大问题,极有可能会出现配置项不同步,配置错误这些问题。特别是如果配置项也不断地增加和变化,管理上会变得非常繁琐。再就是,这里需要针对不同环境进行单独的构建过程,也就是要多次打包,这一点是跟持续发布的指导建议相悖的。

方案二,占位符(PlaceHolder)模板模式

这种方案在 Maven 这样的构建工具中就可以很好地支持,直接示例如下:

cache.app.url=${cache.app.url}

我们可以看到,这种模式下,配置项的值用变量来替代了,具体的值我们可以设置到另外一个文件中,比如 antx.properits,这里面保存的才是真正的实际值。

不过,这个方案仍然不能很好地解决上面第一种方案提到的问题,配置文件是可以保留一个了,但是取值的 antx.properties 文件是不是要保留多个?同时,对于配置文件中配置项增加后,antx.propertis 文件中是否同步增加了配置,或者配置项名称是否完全匹配,这一点 Maven 是不会帮我们去检查的,只能在软件运行时才能验证配置是否正确。

最后,这个方案还是没有解决只打包一次的问题,因为 Maven 一旦帮我们构建完成软件包之后,它并没有提供直接针对软件包变更的方式。所以,针对不同的环境,我们仍然要打包多次。

方案三,AutoConfig 方案

AutoConfig 是阿里开源的 Webx 框架中的一个工具包,在阿里的整个持续交付体系中被广泛应用,它继承了 Maven 的配置管理方式,同时还可以作为插件直接与 Maven 配合工作,针对我们上面提到的部分问题,它也针对性地进行了加强和改进,比如:

  • 配置校验问题。AutoConfig 仍然是以上述第二种方案的模板模式为基础,最终通过 antx.properties 文件中的配置值来替换,但是它会做严格校验;同时也可以自定义校验规则,来检查配置项是否与模板中的设定严格匹配,如果不匹配,就会在构建时报错,这样就可以让我们提前发现问题,而不是软件包交付到环境中运行时才发现。
  • 只打包一次的问题。AutoConfig 不需要重新构建就可以对软件包,比如 war 包或 jar 包的配置文件进行变更,所以它很好地解决了针对不同环境需要重复构建的问题。但是,比较遗憾的是,它的 Maven 插件模式并没有解决这个问题,还需要与 AutoConfig 工具模式配合才可以。

可以看到 AutoConfig 的方案已经相对完善了,也可以满足我们的大部分需求,但是它仍然没有解决多环境配置值管理的问题,我们是通过多个 antx.properties 文件来管理,这就需要基于 AutoConfig 做一下二次开发了。


举报

相关推荐

0 条评论