Spring Cloud Config 是由 Spring Cloud 团队开发的项目,它可以为微服务架构中各个微服务提供集中化的外部配置支持,可以将各个微服务的配置文件集中存储在一个外部的存储仓库或系统(例如 Git 、SVN 等)中,对配置进行统一管理,以支持各个微服务运行。
Spring Cloud Config为分布式系统中的外部化配置提供服务器端和客户端支持,有了 Config 服务器,就有了一个中心位置来管理跨所有环境的应用程序的外部属性。客户机和服务器上的概念都映射到 Spring Environment 和 PropertySource 的抽象,它们非常适合 Spring 应用程序,也可以用于运行在任何语言中的任何应用程序。
当应用程序通过部署管道从开发到测试再到生产时,可以管理这些环境之间的配置,并确保应用程序在迁移时拥有运行它们所需的一切。服务器存储后端的默认实现使用 Git,因此它很容易支持配置环境的标记版本,并且可以访问用于管理内容的各种工具,添加替代实现并将其插入 Spring 配置中是比较容易的。除了 Git 外,Spring Cloud Config 还提供了对其他存储方式的支持,其他来源包括任何与 JDBC 兼容的数据库、Subversion(SVN)、HashiCorp Vault、Credhub 和本地文件系统。。
两大角色
- Config Server:也被称为分布式配置中心,它是一个独立运行的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密信息和解密信息的访问接口。通过使用 @EnableConfigServer 注释,服务器可嵌入到 Spring 引导应用程序中。
- Config Client:指的是微服务架构中的各个微服务,它们通过 Config Server 对配置进行管理,并从 Config Sever 中获取和加载配置信息。
工作原理
Spring Cloud Config 工作流程如下:
- 开发或运维人员提交配置文件到远程的 Git 仓库。
- Config 服务端(分布式配置中心)负责连接配置仓库 Git,并对 Config 客户端暴露获取配置的接口。
- Config 客户端(每个微服务)通过 Config 服务端暴露出来的接口,拉取配置仓库中的配置。
- Config 客户端获取到配置信息,以支持服务的运行。
特点
- 由 Spring Cloud 团队开发,能够与 Spring 生态体系无缝集成。
- 将所有微服务的配置文件集中存储在一个外部的存储仓库或系统(例如 Git)中,统一管理。
- Config Server (配置中心)将配置以 REST 接口的形式暴露给各个微服务,以方便各个微服务获取。
- 微服务可以通过 Spring Cloud Config 向配置中心统一拉取属于它们自己的配置信息。
- 当配置发生变化时,微服务不需要重启即可感知到配置的变化,并自动获取和应用最新配置。
- 一个应用可能有多个环境,例如开发(dev)环境、测试(test)环境、生产(prod)环境等等,开发人员可以通过 Spring Cloud Config 对不同环境的各配置进行管理,且能够确保应用在环境迁移后仍然有完整的配置支持其正常运行。
Config + Bus 实现配置的动态刷新
Spring Cloud Bus 又被称为消息总线,它能够通过轻量级的消息代理(例如 RabbitMQ、Kafka 等)将微服务架构中的各个服务连接起来,实现广播状态更改、事件推送等功能,还可以实现微服务之间的通信功能。目前 Spring Cloud Bus 支持两种消息代理:RabbitMQ 和 Kafka。
-
Spring Cloud Bus 基本原理:Spring Cloud Bus 会使用一个轻量级的消息代理来构建一个公共的消息主题 Topic(默认为“springCloudBus”),这个 Topic 中的消息会被所有服务实例监听和消费。当其中的一个服务刷新数据时,Spring Cloud Bus 会把信息保存到 Topic 中,这样监听这个 Topic 的服务就收到消息并自动消费。
-
动态刷新配置的原理:当 Git 仓库中的配置发生了改变,只需要向某一个服务(既可以是 Config 服务端,也可以是 Config 客户端)发送一个 POST 请求,Spring Cloud Bus 就可以通过消息代理通知其他服务重新拉取最新配置,以实现配置的动态刷新。
-
动态刷新配置的流程:
1)当 Git 仓库中的配置发生改变后,运维人员向 Config 服务端发送一个 POST 请求,请求路径为“/actuator/refresh”。
2)Config 服务端接收到请求后,会将该请求转发给服务总线 Spring Cloud Bus。
3)Spring Cloud Bus 接到消息后,会通知给所有 Config 客户端。
4)Config 客户端接收到通知,请求 Config 服务端拉取最新配置。
5)所有 Config 客户端都获取到最新的配置。
【名词解释】
SVN —— Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统,Subversion 在 2000 年由 CollabNet Inc 开发,现在发展成为 Apache 软件基金会的一个项目,同样是一个丰富的开发者和用户社区的一部分。SVN相对于的RCS、CVS,采用了分支管理系统,它的设计目标就是取代CVS,互联网上免费的版本控制服务多基于Subversion。SVN管理着随时间改变的数据,这些数据放置在一个中央资料档案库(repository) 中,这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。
HashiCorp Vault —— 大多数软件项目都会不同程度的用到诸如登录密码、Token、证书、API Key 等私密信息,这些信息用明码保存显然是很不安全的,如果不小心签入到版本控制系统,还会造成重大安全问题,Vault 就是为了解决这一问题而创立的。它提供了如下功能:集中管理各种私密信息;为私密信息设置租期(Lease),到期后自动失效;密钥的动态生成、注销和滚动更新;动态创建无需保存的一次性登录密钥;作为数据加密/解密接口;完整的审计记录;命令行以及 RESTful API 访问接口;
Credhub —— Spring Credhub 提供了客户端支持,用于从运行在Cloud Foundry 平台中的CredHub 服务器中存储、检索和删除凭据。Credhub 提供HTTP API 来安全地存储、生成、检索和删除各种类型的凭据,为 Credhub API 提供了一个 Java 绑定,使得将 Spring 应用程序与 Credhub 集成起来变得很容易。
【参考链接】