配置管理
在编写代码的时候,我们经常需要编写配置,使得固定的代码逻辑可以应对环境的变化,而不必在环境变更后跟着修改代码。简单的配置是十分容易管理的,但是随着配置项的增多,管理的复杂度会不断上升,以至于难于维护。本文将会介绍一些常用的配置管理方法,以帮助大家更高效的管理配置。
基本配置
根据配置项的复杂度,基本的配置方法主要有:硬编码
、命令行参数
、配置文件
、环境变量
这几种方法,下面将会逐一介绍相关的使用。
硬编码
硬编码指的是在代码中直接嵌入配置,适用于配置极少变更,并且配置项简单的情况。由于无需接收外部输入,因此程序的启动十分简单。相应地,缺点也十分明显,也就是配置与代码耦合,无法适应于需要扩展变化的情况。
命令行参数
为了避免配置与代码的耦合,代码可以从外部接收输入。用户在启动程序时,传入相关的命令行参数,操作系统会将对应的参数传递在程序的启动栈中供程序读取。程序根据传入的命令行参数,处理相关的配置逻辑。相比硬编码来说具有了一定扩展变化性,但也不适用于有着较多配置项的情况,因为在配置较多的情况下,启动命令会变得复杂而较难维护。
配置文件
配置文件的引入解决了命令行参数无法维护较多配置项的问题,用户可以将配置写入文件,程序启动时读取配置文件进行配置。配置文件可以以多种格式进行编写,例如: json、ini、xml等等,这些配置文件通常都有对应编程语言的读取SDK,用户可以根据这些类型可提供的配置特性(如字段类型,字段分区等)来进行选择。
环境变量
在实际开发的过程中,代码可能会在多个环境运行,而不同的环境下可能有着不同的配置。通用的配置可以由一个配置文件来管理,但是不通用的配置项最好是以多个配置文件的形式来管理,例如config_debug
、config_production
,用户可以在启动时以命令行参数传入需要读取的配置文件来对不同的环境进行管理,此外也可以用环境变量
来指明当前的环境。
环境变量
是操作系统指定的一系列运行参数,以键值对的形式存在于系统中,不同的编程语言都可以通过系统模块来获取相应的环境变量。因此通过环境变量指定环境是十分实用的,可以使得程序便捷地切换配置环境。
配置校验
对于来自外部的配置,程序需要像处理输入一样对外部配置做一些校验。通常是需要校验配置的类型,以及配置的有效性,防止程序在错误的配置下产生异常行为。
动态配置
大多数程序只需要在程序启动时对配置进行初始化,但少部分程序需要具有动态性以适应变化的环境。程序如何接收动态配置对应着如何进行进程间通信的问题,常用的有管道、信号、socket等。在程序收到新配置后,可能需要进行一系列的操作才能变更配置,具体就不展开了。
版本控制思想
如果配置经常变更,那么可以参考代码版本控制,也对配置进行版本控制管理。当配置也纳入版本控制管理后,每一个代码版本都可以指定对应的配置版本。如此一来,当代码需要升级或回滚时,也可以自动根据配置版本来读取不同的配置。
配置中心
当系统向分布式发展时,如果每个机器上的服务都只从本地读取配置,那么当配置修改之后,需要修改每台机器上的配置文件才能使新配置生效,维护与管理的成本都较高。这时,通常会有独立的配置中心模块出现来管理系统的配置。
管理员在配置中心中修改配置后,配置中心可以通过推或拉的方式来同步配置。配置中心可以向系统中的服务广播推送新配置,也可以让各服务定时来拉取新配置进行变更。除了配置同步之外,配置中心也需要考虑高可用,使得新配置能够及时生效。
敏感配置
一些敏感配置,例如生产环境中db的配置信息,需要做一些特别的措施进行保护。但是安全的前提在于“可信”,如果没有可信的环境的话,那么任何额外的措施都是无效的。
If you do not “trust” server - you can’t protect “secrets” you store inside this server. encryption - Securely encrypting / decrypting appsettings.json on server - Stack Overflow
总结
配置作为系统中的重要组成部分,如果没有较好的管理方法,则会降低开发效率,因此我们有必要根据实际的配置复杂度来选择合适的管理方法。