什么是配置中心?
在单体架构的时候我们可以将配置写在配置文件中,但有⼀个缺点就是每次修改配置都需要重启服务才能生效。 当应用程序实例比较少的时候还可以维护。
如果转向微服务架构有成百上千个实例,每修改⼀次配置要将全部实例重启,不仅增加了系统的不稳定性,也提高了维护的成本。
那么如何能够做到服务不重启就可以修改配置?所有就产生了四个基础诉求:
- 需要支持动态修改配置
- 需要动态变更有多实时
- 变更快了之后如何管控控制变更风险,如灰度、回滚等
- 敏感配置如何做安全配置
因此,基于上面的一些需求,就渐渐衍生出了配置中心,目前比较主流的有:Nacos、Apollo、SpringCloud Config、Disconf(百度)。 那么,对于配置中心,我们可能会有几个问题。 - 什么是配置中心 ○ 定义:配置中心是一个独立的系统,用于集中管理应用程序的配置信息。 ○ 作用:它允许在不同环境和服务间共享和管理配置信息,同时支持动态配置更新。
- 配置中心的作用和优点 ○ 管理和集中配置:集中存储应用配置,方便管理和维护。 ○ 动态更新:支持在不重启服务的情况下更新配置。 ○ 环境隔离:支持不同环境(开发、测试、生产)的配置隔离。 ○ 提高可靠性和安全性:集中管理有助于加强安全性和容错性。
- 配置中心的使用场景 ○ 微服务架构:在微服务环境中管理跨多个服务的配置。 ○ 多环境部署:管理不同环境(开发、测试、生产)的配置信息。 ○ 动态配置需求:需要动态调整应用配置的场景,如特性开关、参数调整等。
那么,从上面的了解,以及我最近对Nacos的学习,可以得出,一个优秀的配置中心可以提供如下一些功能:
- 动态配置管理 ○ 功能描述:支持添加、修改、删除配置项,能够在运行时动态应用这些变更,无需重启服务。 ○ 具体功能:提供API和用户界面来实时更新配置,支持各种数据格式(如JSON、YAML)的配置文件。
- 版本控制和回滚 ○ 功能描述:维护配置的历史版本,支持快速回滚到任意历史版本。 ○ 具体功能:提供版本历史记录,界面或API操作回滚,确保错误配置快速修正。
- 环境和分组管理 ○ 功能描述:支持不同环境(如开发、测试、生产)的配置隔离,并按服务或模块分组管理配置项。 ○ 具体功能:提供环境标签、配置项分组功能,使配置管理更加清晰和有序。
- 服务发现和注册 ○ 功能描述:配置中心与服务注册和发现机制集成,自动或手动将服务与相应配置关联。 ○ 具体功能:与现有服务发现系统(如Eureka、Consul)集成,自动同步服务与配置。
- 安全性 ○ 功能描述:包括用户认证、授权、敏感信息加密等安全措施。 ○ 具体功能:提供用户登录、权限控制,对敏感配置进行加密存储和传输。
- 高可用性和容错性 ○ 功能描述:保证配置中心的稳定性和可靠性,包括数据备份、故障转移等机制。 ○ 具体功能:配置中心集群部署,自动故障切换,数据备份和恢复机制。
- 客户端SDK/API ○ 功能描述:提供易于使用的客户端库或API,方便不同的应用和服务获取和更新配置信息。 ○ 具体功能:为主流开发语言提供SDK,文档和示例代码,简化集成流程。
- 用户友好的界面 ○ 功能描述:提供直观的用户界面用于配置管理,支持配置的查看、编辑、发布等操作。 ○ 具体功能:图形界面操作,配置项搜索、编辑、发布功能,支持多用户协作。
- 通知和回调机制 ○ 功能描述:配置变更通知到相关服务或客户端,支持回调机制来处理配置更新。 ○ 具体功能:变更通知机制(如Webhook、消息队列),客户端回调接口。
- 配置审核和跟踪 ○ 功能描述:记录配置的变更历史,支持审核配置变更,追踪配置的更新和使用情况。 ○ 具体功能:变更日志记录,审计追踪,配置使用报告。
- 健康检查和监控 ○ 功能描述:监控配置中心的健康状况,提供日志记录、性能指标等监控功能。 ○ 具体功能:健康检查API,性能监控指标,日志记录系统。
Nacos厉害就厉害在不仅代码优雅,而且完全实现了上面的所有要求,并且他不单单是将所有的上面的这些功能耦合在一个模块中,从而现成一个很重的模块,而是使用Sidecar模式。 Sidecar模式是一种在微服务架构中广泛使用的设计模式,它主要用于将应用程序的核心功能与那些可以与其他服务共享的辅助功能(如监控、日志记录、配置、网络通信等)分离。在这种模式中,每个微服务与一个附属的辅助服务(Sidecar)并行运行,Sidecar服务可以看作是主服务的延伸,负责处理非业务逻辑的工作。
Sidecar模式的特点:
- 分离关注点: 将与业务逻辑无关的功能(如日志、监控、配置管理等)从应用程序中分离出来,以简化微服务的开发和维护。
- 提升可复用性: 由于Sidecar中的功能可以被多个服务共享,因此提高了代码的可复用性。
- 增强安全性和可靠性: Sidecar可以处理诸如服务发现、负载均衡、断路器、安全通信等,从而增强微服务的安全性和可靠性。
- 易于维护和扩展: Sidecar的使用使得对系统进行升级和扩展更加容易,因为可以独立地更新Sidecar组件而不影响主服务。
- 语言和平台透明: Sidecar模式允许每个服务独立选择最适合的编程语言和技术栈,因为Sidecar可以为所有服务提供统一的接口和功能。 简单的了解完毕一个配置中心需要提供的功能,我们接下来来分析一下如何自己实现一个简单的配置中心。
如何自己设计一个配置中心?
也就是设计一个配置中心需要考虑些什么。 从上面的点我们可以知道,一个注册中心在得到用户的配置信息之后,需要做如下几件事情:
- 动态的更新(增删改)项目的配置信息。
- 如何动态修改@Value以及@ConfigurationProperties等注解修饰的属性的对应的值。
我们首先从第一点进行分析,在之前我们学习SpringBoot配置信息加载的时候,我们知道,我们的配置文件的加载,和EnvironmentPostProcessor有一些关联。
我们找到实现类SystemEnvironmentPropertySourceEnvironmentPostProcessor,可以发现,在2.7.8的boot版本中,配置文件的加载和
以及PropertySource会有一些关联。
也就是说,使用这两个类,估计能帮助我们完成对配置信息的获取以及修改。
所以我们先来研究一下ConfigurableEnvironment。
接下来的几篇文章,我就会对这些重点类的源码进行分析。