配置中心

一、传统配置管理的弊端

我们通常可以采用四种途径在程序中指定配置项,它们分别是硬编码、配置文件、环境 / 启动变量、数据库动态获取,我们先来了解一下这四种配置管理方式是如何实现的。

  • 硬编码:最简单粗暴的方式,在 Bean 初始化的上下文中,直接通过在代码中 hardcode 的方式指定配置信息;

  • 配置文件:使用 application 和 bootstrap 配置文件来设置配置项,这是目前比较“优雅”常用的方式;

  • 环境 / 启动变量:通过操作系统的环境变量,或者启动命令中的 -D 参数传入配置项;

  • 数据库 / 缓存动态获取:将配置项保存在数据库里,每次执行一个 select 语句实现动态查询。

二、分布式配置中心

在微服务的架构体系中,我们会使用一个中心化的分布式配置中心作为配置文件的管理者。

在应用程序端,我们只将一些必要的配置项添加到配置文件中(如 application.yml 和 bootstrap.yml),而大部分的配置项都被保存在配置中心集群里。客户端在启动的时候从配置中心获取所有的配置项,用于各个组件的初始化。 以Nacos Config 为例,画了一张架构图来帮你理解这个过程,你可以参考一下。

特性:

高可用性:微服务组件的高可用性是首要目标。配置中心并不是一个中心化的单点应用,而是一个通过集群对外提供服务的组件。在一致性算法的基础上,集群中各个节点之间会互相同步配置数据,或者从统一数据源读取配置数据。即便个别节点挂掉,也不影响整个集群的可用性;

环境隔离特性:Nacos 支持通过 Namespace 属性指定当前配置项所在的环境,你可以为自己的应用系统创建开发环境、预发环境和生产环境,不同环境之间的配置文件是相互隔离的;

多格式支持:Nacos 支持多种不同格式的配置内容,你可以使用纯文本、JSON、XML、YAML 和 Properties 多种文件后缀;

访问控制:Nacos 实现了权限管理功能,你可以在控制台创建用户账号和权限组,限制某个账号可以访问哪些命名空间,并配置账号的读写权限(只读、只写、读写)。通过这种方式,你可以保障敏感信息(如数据库用户名和密码)的安全;

职责分离:配置项从 jar 包中抽离了出来,修改配置项再也不需要重新编译打包应用程序了,完美实现了配置项管理与业务代码之间的职责分离;

版本控制和审计功能:配置项也是一种代码,而且配置 bug 往往比代码中的 bug 造成的影响更大。因此,在微服务架构中我们需要确保配置中心具备完善的版本控制和审计功能。

从图中你可以看出,通过 Nacos 的“历史版本”功能,你可以查看任何一个配置文件的历史修改记录,包括改动的时间和操作人。针对每一个改动记录,我们可以查看这一版本的配置详情,或者做线上配置项的回滚操作。

除了上面我们提到的功能以外,Nacos 还可以支持多文件源读取以及运行期配置变更,尤其是动态变更推送,更是微服务架构下不可或缺的配置管理能力。

三、应用场景

业务开关

动态配置的一个作用是通过业务开关控制功能的开启 / 关闭。比如在做主链路规划的时候,我们经常需要在一些非关键服务上预留一个“人工降级”开关,在业务运行期对特定业务做定向熔断。对于一些大需求点的功能更新,经常涉及到上下游多个微服务的改动,但每个微服务的上线时间往往是不一样的。这时候我们就可以在代码中预留一个“业务开关”,在当前服务上线之初,开关处于关闭状态,待所有上下游服务都完成了上线之后,再通过开关开启新功能。如果出现异常情况,还可以通过这个功能开关切换回老的执行逻辑。

业务规则更新

对于一些更新比较频繁的业务数据,我们可以把这部分数据放到配置中心中。比如说我在搭建新零售平台的商品中心的时候,会将一些运营文案信息部署到配置中心。这样一来,我们就可以根据运营活动随时更新资源位的布局、样式以及展位商品。

灰度发布验证

如果你即将发布新的配置项变更,但是在应用到整个集群之前你想先挑几台服务器测试一下,那么你可以使用 Nacos 的 Beta 发布功能,将配置项定向推送到特定 IP 地址的 Client 机器,完成线上测试。利用 Beta 发布 + 业务开关的组合,你还可以在线上定向开启特定 IP 服务器的业务开关,实现轻量级的灰度测试。