什么是配置管理
在《持续交付—发布可靠软件的系统方法》一书是这样对配置管理进行定义的:
“配置管理是指一个过程,通过该过程,所有与项目相关的产物,以及它们之间的关系都被唯一定义、修改、存储和检索。”
一个应用程序是由软件代码、运行数据以及配置信息共同组成。在 《12 因素应用》(The Twelve-Factor App)中提到,应用程序的配置在不同部署环境(开发环境、测试环境、生产环境等)之间会有很大的差异。比如:数据库连接地址、缓存连接地址、第三方证书等。因此,需要将代码和配置分离,通过配置文件屏蔽各个部署环境的差异。
12 因素应用中也推荐将应用的配置存储于环境变量中。环境变量可以非常方便地在不同的部署间做修改,却不用动一行代码。因此,这里的配置主要是指应用程序的配置,配置管理主要是指如何存储不同环境的应用程序配置,以保证各个环境使用的都是同一份代码。
配置信息的描述和存储
配置信息的描述
通常情况下,配置项以键值对的形式来表示,比如 spring.application.name=serviceA,这代表一个配置项。应用程序使用配置文件来存储多个配置项,通过层级来组织配置项,特别是当以 yaml 格式展现时,层级会更加清晰,这也是目前采用最多的展现形式。除此之外还有 properties、xml 等形式。
配置信息的存储
配置信息比较常见的存储形式有数据库、版本控制库、文件目录、环境变量等。下面介绍一下每种形式的优缺点。
- 数据库:优点是可以充分利用数据库的检索功能,能够按不同的条件查询配置项,可以维护多个环境的配置。缺点是需要对配置项进行建模,开发单独的配置管理系统用于管理数据库中的配置项。另外,配置项的版本、版本的回退都需要单独维护。
- 版本控制库:优点是可以充分利用版本控制库本身的特性,对配置项的变更进行版本控制和变更追溯,非常容易地获取任意时刻的版本以及版本的回退,并且不需要开发额外的系统。此外,它也能管理多个环境的配置。缺点是不支持单个配置项的查询功能,每次更新都需要全量更新。
- 文件目录:优点是直接从本地获取,不依赖于其他系统。缺点是不能有效地进行版本控制,每个环境都是单独的文件目录,不能有效管理和控制多环境下的配置信息。
- 环境变量:优点是方便设置与读取,能够更好地与脚本集成,与每个环境绑定。缺点是不能有效地进行版本控制。
配置管理的时机
在应用程序生命周期中,不少阶段可以对应用程序进行配置,比如构建、部署、启动、运行和发布阶段。下面介绍下这几个阶段的是如何进行配置的。
- 构建阶段:在构建时,可以将配置文件直接添加到生成的二进制文件中。这种方式由于二进制文件与配置文件捆绑在一起,每个环境都需要生成一个单独的二进制文件,违反了12 因素应用中的原则,所以不推荐使用该方法。
- 部署阶段:在安装应用程序时,部署脚本或安装程序获取必需的配置信息。这种方式可以保证在二进制文件是同一个,遵循了 12 因素应用中将代码和配置分离的原则。
- 启动阶段:在应用程序启动时,将配置文件加载进来。该方式需要保证影响应用程序启动的配置信息能够获取,否则程序无法启动。
- 运行时阶段:在应用程序运行时,动态的变更配置文件。该方式主要用于在不需要停止服务的情况下变更配置信息。
- 发布阶段:是指在应用程序真正发布上线的时候,将配置文件改为生产环境的版本。该方式只是用于生产环境发布,由于此时发布的软件和之前测试的是同一个,因此测试通过是具备发布上线条件的。
配置管理的实现方式
配置管理目前常见的实现方式:
- 有 Spring Boot 的 Profile 形式;
- 基于 Git 的配置管理;
- 配置管理系统如携程的 Apollo;
- 配置管理数据库 CMDB。