NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
## 一、为什么要进行统一配置管理 为了避免参数变化引起的频繁的程序改动,通常我们在应用程序中将常用的一些系统参数、启动参数、数据库参数等等写到配置文件或其他的存储介质里面。 * 配置常见的存储方式:配置文件、数据库等 * 配置对于应用程序是只读的,程序通过读取配置来影响程序的运行行为 * 配置是区分环境的同一份程序部署到生产、测试、开发、演示环境下,需要做不同的配置 传统应用程序的配置分散,导致了在进行部署、运维方面,需要极大的成本。那么传统的应用程序配置面临哪些问题? **问题一:应用程序多实例集群部署,每个微小的配置的修改将导致每个实例都需要重新打包部署** ![](https://img.kancloud.cn/a8/0b/a80b102ae50fb3c0df9f04464ed7e9f9_672x541.png) **问题二:每一套环境的配置不同,难于维护,增加了人工犯错的几率** ![](https://img.kancloud.cn/8e/9d/8e9d4be21c62830951ea4d3d338ac669_718x512.png) **问题三:没有严格的配置管理权限控制,导致公司的核心数据泄露** 不知道大家有没有看过一条报道,国外某著名的公司,在开源代码的数据库连接配置中,携带了其"生产环境"的数据库配置信息,导致其核心的用户数据泄露。 除了上面的三点,还有很多传统的配置管理方式面临的问题,所以我们要进行集中的统一的配置管理。这点在微服务应用中体现的更为明显。 ## 二、分布式配置管理中心 比起“分布式配置中心”这个词,我更喜欢集中的配置管理中心叫做“统一配置管理中心”。“分布式”修饰的是应用程序,而“统一”才是修饰配置管理中心的关键词。但是大家都叫分布式配置管理中心,我也就从了大家。但是在理解上要区分过来。 理想的配置管理中心应该是: * 支持多应用配置管理 * 支持多环境(生产、测试等)配置管理 * 支持配置权限管理 * 支持配置版本化管理、配置回滚 * 支持配置的动态发布、灰度发布(后文会给大家介绍) ![](https://img.kancloud.cn/f9/25/f9251b04d135062829afe2efd6fe47ad_865x502.png) 配置中心将配置从应用中剥离出来,统一管理,优雅的解决了配置的动态变更、持久化、运维成本等问题。应用自身既不需要去添加管理配置接口,也不需要自己去实现配置的持久化,更不需要引入“定时任务”以便降低运维成本。**总得来说,配置中心就是一种统一管理各种应用配置的基础服务组件。** ​ 在系统架构中,配置中心是整个微服务基础架构体系中的一个组件,如下图,它的功能看上去并不起眼,无非就是配置的管理和存取,但它是整个微服务架构中不可或缺的一环。 ## 三、主流配置中心 目前市面上用的比较多的配置中心有: ### Spring Cloud Config 2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。 [https://github.com/spring-cloud/spring-cloud-config](https://github.com/spring-cloud/spring-cloud-config) ### Apollo 2016年5月,携程开源的配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。 [https://github.com/ctripcorp/apollo](https://github.com/ctripcorp/apollo) ### Nacos 2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。 [https://github.com/alibaba/nacos](https://github.com/alibaba/nacos) ### 如何选择 * 如果你希望完成单纯的分布式配置集中管理,其实三者都能满足你的需求。 * 如果你考虑到已经用Nacos实现了服务注册中心,不想单独搞出来一个配置管理中心,合二为一的话,nacoos可能是你的最佳选择 * 携程的Apollo与nacos很多相似之处,有颇多的亮点。从笔者的使用感受而言,目前apollo从文档细节到方便度要好于nacos(截止2020年4月)。但是nacos毕竟开源时间较短,依托alibaba的支持,有很大的潜力和发展空间。 * spring cloud config对比其他两者,在功能以及友好度方面都逊色。唯一的优点可能是它比较轻量级。 | 对比项目/配置中心 | spring cloud**config** | **apollo** | **nacos(重点)** | | --- | --- | --- | --- | | 开源时间 | 2014.9 | 2016.5 | 2018.6 | | 配置实时推送 | 弱支持(Spring Cloud Bus) | 支持(HTTP长轮询1s内) | 支持(HTTP长轮询1s内) | | 版本管理 | 支持(Git) | 自动管理 | 自动管理 | | 配置回滚 | 弱支持(Git+Bus) | 支持 | 支持 | | 配置的灰度发布 | 理念上支持,可操作性不强 | 支持 | 1.1.0开始支持 | | 权限管理 | 不支持(没有区分用户、角色、权限的概念) | 支持 | 1.2.0开始支持 | | 多集群多环境 | 对集群概念支持较弱 | 支持 | 支持 | | 多语言 | 只支持Java | Go,C++,Python,Java,.net,OpenAPI | Python,Java,Nodejs,OpenAPI | | 分布式高可用最小集群数量 | **Config**\-Server2+Git+MQ | **Config**2+Admin3+Portal\*2+Mysql=8 | **Nacos**\*3+MySql=4 | | 配置格式校验 | 不支持 | 支持 | 支持 | | 通信协议 | HTTP和AMQP | HTTP | HTTP | | 数据一致性 | Git保证数据一致性,**Config**\-Server从Git读取数据 | 数据库模拟消息队列,**Apollo**定时读消息 | HTTP异步通知 |