1、前言
配置中心作用:
- 配置实时生效:传统的静态配置方式要想修改某个配置只能修改之后重新发布应用,要实现动态性,可以选择使用数据库,通过定时轮询访问数据库来感知配置的变化。轮询频率低感知配置变化的延时就长,轮询频率高,感知配置变化的延时就短,但比较损耗性能,需要在实时性和性能之间做折中。配置中心专门针对这个业务场景,兼顾实时性和一致性来管理动态配置
- 配置管理流程:配置的权限管控、灰度发布、版本管理、格式检验和安全配置等一系列的配置管理相关的特性也是配置中心不可获取的一部分
2、主流开源配置中心介绍
2.1 Spring Cloud Config
2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。
- 具备权限管理(依赖Git的权限管理能力);
- 具备版本管理&回滚(通过Git来做版本管理,更方便);
- 不支持配置文件格式校验;
- 使用Spring Cloud Bus推送配置变更,Spring Cloud Bus兼容 RabbitMQ、Kafka等,支持查询订阅Topic和Consumer的订阅关系;
- 支持多环境,通过Profile的方式隔离多个环境,在Git上配置多个Profile的配置文件,客户端启动时指定Profile就可以访问对应的配置文件;
- 支持多集群部署,搭建多套Config Server,使用同一个Git的多个仓库,来实现物理隔离;
- 多语言支持,服务于Java生态,一开始只是针对Java微服务应用;对于非Java应用的微服务调用,可以使用Sidecar提供了HTTP API,但动态配置方面还不能很好的支持;
- 原生不支持配置实时推送,但是可以依赖Git的WebHook、Spring Cloud Bus和客户端/bus/refresh端点实现:
- 基于Git的WebHook,配置变更触发Server端refresh
- Server端接收到请求并发送给Spring Cloud Bus
- Spring Cloud Bus接到消息并通知给客户端
- 客户端接收到通知,请求Server端获取最新配置
- 包含config-server、Git和Spring Cloud Bus三大组件:
- config-server提供给客户端获取配置
- Git用于存储和修改配置
- Spring Cloud Bus通知客户端配置变更
2.1.1 优点:
- 集中化配置管理: Spring Cloud Config 提供了集中式的配置管理,允许将配置信息存储在版本控制系统中,例如 Git。这使得配置信息的管理变得更加方便,可以随时追踪配置的变更历史。
- 动态刷新: Spring Cloud Config 支持配置的动态刷新,可以在不重启服务的情况下更新配置。这对于快速调整系统配置而无需重启整个应用程序非常有用。
- 多环境支持: 支持多个环境(如开发、测试、生产)的配置文件,可以方便地切换不同环境的配置。
- 安全性: 支持基于 Spring Security 的安全性,可以通过身份验证和授权来保护配置信息的访问。
- 易于集成: 由于是 Spring 生态系统的一部分,与其他 Spring Cloud 组件(如 Eureka、Ribbon、Feign等)集成相对容易,可以构建出更全面的微服务架构。
2.1.2 缺点:
- 单点故障: 如果配置服务器出现故障,整个系统的配置获取将会受到影响。为了缓解这个问题,可以考虑使用高可用的配置服务器。
- 网络开销: 在每次服务启动时,需要从配置服务器获取配置信息,可能会引入一定的网络开销。可以通过缓存配置信息来减轻这一影响。
- 学习成本: 对于新手来说,配置中心的概念和 Spring Cloud Config 的使用可能需要一些学习成本。理解如何配置和管理配置服务器以及客户端的行为可能需要一些时间。
- 依赖外部存储: 使用 Spring Cloud Config 需要依赖外部存储(如 Git)来存储配置信息。这可能增加了一些额外的依赖和复杂性。
2.2 Apollo
2016年5月,携程开源的配置管理中心,具备规范的权限、流程治理等特性。
- Apollo通过项目的维度来对配置进行权限管理,一个项目的owner可以授权给其他用户配置的修改发布权限;
- 具备版本管理&回滚;
- 支持配置文件格式校验;
- 可以通过灰度实例列表查看监听配置的实例列表,但实例监听的配置(Apollo称为命名空间)目前还没有展示出来;
- 支持多环境,在控制台创建配置的时候就要指定配置所在的环境,客户端在启动的时候指定JVM参数ENV来访问对应环境的配置文件;
- 支持多集群部署,Apollo的控制台和数据更新推送服务分开部署,控制台部署一套就可以管控多个集群;
- 基于HTTP长轮询实现配置推送,客户端和配置中心建立HTTP长连接,当配置变更时,配置中心把配置推送到客户端;
- 多语言支持,提供了Open API。其他不支持的语言,Apollo的接入成本相对较低;
- 分为MySQL,Config Service,Admin Service,Portal四个模块:
- MySQL存储Apollo元数据和用户配置数据
- Config Service提供配置的读取、推送等功能,客户端请求都是落到Config Service上
- Admin Service提供配置的修改、发布等功能,Portal操作的服务就是Admin Service
- Portal提供给用户配置管理界面
2.2.1 优点:
- 实时生效: 配置修改后,Apollo 能够实时生效,无需重启应用。这对于快速调整系统配置而无需停机非常有用。
- 版本管理: Apollo 提供了配置版本管理功能,可以方便地追踪配置的变更历史,支持灰度发布和快速回滚。
- 灵活的配置规则: 支持多种配置规则,包括公共配置、私有配置、命名空间配置等,能够满足不同环境和应用的需求。
- 支持多语言: 提供多语言的客户端 SDK,可以方便地在不同语言的应用中集成 Apollo。
- 集中管理: 集中管理所有应用的配置,使得配置信息变得更加集中和可控。
- 权限管理: 支持基于命名空间的权限管理,可以限制不同用户对不同配置的访问权限。
- 开源且活跃: Apollo 是开源项目,得到了广泛的社区支持和贡献。活跃的社区可以提供及时的技术支持和更新。
2.2.2 缺点:
- 学习曲线: 对于新手来说,Apollo 的概念和使用可能需要一些学习成本。需要理解如何配置和管理配置中心以及客户端的行为。
- 外部依赖: 使用 Apollo 需要依赖外部的数据库(默认是 MySQL)来存储配置信息。这增加了一些额外的依赖和复杂性。
- 单点故障: 如果 Apollo 服务器发生故障,可能会影响整个系统的配置获取。为了缓解这个问题,可以考虑使用多个 Apollo 服务器实现高可用性。
- 配置安全性: Apollo 提供了基于角色的权限管理,但对于敏感配置信息的加密和安全性需求,可能需要额外的工作。
- 可能引入网络开销: 在配置变更时,客户端需要通过网络从配置中心获取最新的配置信息。这可能引入一定的网络开销。
2.3 Nacos
2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。
- 不具备权限管理能力;
- 具备版本管理&回滚;
- 支持配置文件格式校验;
- 可以查看监听配置的实例,也可以查看实例监听的配置情况;
- 支持多环境,通过命名空间来支持多环境,每个命名空间的配置相互隔离,客户端指定想要访问的命名空间就可以达到逻辑隔离的作用;
- 支持多集群,控制台和后端配置服务是部署在一起的,可以通过不同的域名切换来支持多集群;
- 基于HTTP长轮询实现配置推送,客户端和配置中心建立HTTP长连接,当配置变更时,配置中心把配置推送到客户端;
- 多语言支持,支持主流的语言,例如Java、Go、Python、Nodejs、PHP等,也提供了Open API;
- 分为Nacos Service和MySQL模块:
- Nacos对外提供服务,支持配置管理和服务发现
- MySQL提供Nacos的数据持久化存储
2.3.1 优点:
- 服务发现和注册: Nacos提供了强大的服务发现和注册功能,支持多种协议,包括HTTP、DNS和UDP等。
- 动态配置: Nacos支持动态配置管理,可以实时推送配置变更,而不需要重新启动应用。
- 多数据中心支持: Nacos 支持多数据中心的部署,可以满足多地域、多集群的应用需求。
- 健康检查: Nacos提供了健康检查功能,可以定期检查服务的健康状态,并将不健康的实例从服务列表中剔除。
- 支持多种语言: Nacos 提供了丰富的客户端 SDK,支持多种编程语言,包括Java、Go、Python等,方便在不同语言的应用中使用。
- 灵活的命名空间和分组: Nacos 支持命名空间和分组的概念,可以更灵活地组织和管理配置和服务。
- 开源且活跃: Nacos 是一个开源项目,得到了广泛的社区支持和贡献。活跃的社区可以提供及时的技术支持和更新。
2.3.2 缺点:
- 学习曲线: 对于新手来说,Nacos 的概念和使用可能需要一些学习成本。需要理解如何配置和管理服务注册、配置中心以及客户端的行为。
- 数据库依赖: Nacos 使用数据库存储注册中心和配置信息,默认情况下使用嵌入式数据库。对于一些特殊场景,可能需要额外的工作来配置和管理数据库。
- 可能引入网络开销: 在服务注册和发现时,客户端需要通过网络与 Nacos 服务器通信。这可能引入一定的网络开销,特别是在规模较大的系统中。
- 社区相对年轻: 尽管 Nacos 在阿里巴巴内部有广泛的应用,但相对于一些老牌的开源项目,其社区相对年轻。这可能意味着在一些特殊场景下的问题可能得不到及时解决。
3. 实际使用
推荐使用spring cloud config,搭配推配置信息的acm(前身是淘宝的diamond)。 阿里云配置管理(ACM)是一种分布式配置管理服务,能够实现配置的集中管理和实时推送。以下是关于推送配置信息的 ACM 的一些特点:
4. 阿里云配置管理(ACM)
阿里云配置管理(ACM)是一种分布式配置管理服务,能够实现配置的集中管理和实时推送。以下是关于推送配置信息的 ACM 的一些特点:
特点:
- 实时推送: ACM 支持实时推送配置变更,当配置发生变化时,ACM 会将最新的配置信息主动推送给订阅了该配置的客户端,无需轮询。
- 支持多语言: ACM 提供了多语言的客户端 SDK,支持 Java、Python、Node.js、.NET 等多种编程语言,方便在不同语言的应用中使用。
- 命名空间管理: ACM 支持配置的命名空间管理,可以为不同的环境或应用设置不同的命名空间,方便灵活的配置管理。
- 配置推送策略: ACM 提供了多种配置推送策略,包括发布灰度、直连模式、订阅集群等,可以根据实际需求进行配置。
- 版本管理: ACM 支持配置的版本管理,可以方便地追踪配置的变更历史,支持回滚到指定版本。
- 配置加密: ACM 支持配置的加密功能,可以对敏感配置信息进行加密,提高配置的安全性。
- Web 控制台: ACM 提供了 Web 控制台,通过 Web 控制台可以方便地进行配置的管理和查看。
- 支持 Spring Cloud: ACM 提供了与 Spring Cloud 配合使用的相关组件,方便在 Spring Cloud 微服务架构中集成使用。
使用 ACM 推送配置的步骤:
- 创建配置: 在 ACM 控制台中创建配置,设置配置的命名空间、数据 ID 和配置内容。
- 集成客户端 SDK: 在应用中集成 ACM 的客户端 SDK,选择相应的编程语言,导入 SDK 并初始化。
- 订阅配置: 在应用中订阅相应的配置,通过 SDK 提供的订阅接口订阅配置信息。
- 处理配置变更: 当配置发生变更时,ACM 会主动推送最新的配置信息给订阅了该配置的客户端,客户端通过相应的回调方法处理配置的变更。
- 实时生效: 客户端在收到配置变更的通知后,可以实时生效,无需重启应用。
通过以上步骤,应用就能够实现配置的集中管理和实时推送,提高配置的灵活性和可维护性。