痛点    



通常来讲,Spring 项目的配置项是存储在工程文件的代码库里,开发者可以通过修改 application.properties,或者 bootstrap.properties 文件,为 Spring 项目设置项目的配置项,例如配置数据库的连接池信息,服务发现的注册地址等等。


同时通过 application-{profile}.properties 来区分生产和开发环境的配置,并且在运行时指定 spring.profiles.active={profile} 来加载不同环境下的配置。


但在微服务架构中,把配置文件存储在代码工程文件里却并不合适,因为:

A. 微服务数量较多,需要集中管理,配置文件也需要多次下发。

B. 服务运行时,配置项需要动态调整,并且需要热生效,不能出服务现宕机时间。

C. 敏感信息应该做权限隔离,不应该放在工程文件里。


基于上述的痛点,Spring Cloud 项目引入了 Config 这个子项目。Spring Cloud Config 是 Spring Cloud 项目提供的一个配置管理的组件,它用于存储 Spring 项目中的配置文件。



Spring Cloud 实战


一篇文章带你了解 Spring Cloud Config_java


首先用一张图介绍 Spring Cloud Config 项目组成。它由服务端和客户端组成,并进行互相通信。SpringBoot 项目会内置这个组件。其中,客户端和服务端由两个独立的微服务组成。


· Config 客户端向服务端发起配置文件的请求,Config Server 会向 Git 仓库进行文件的读取和回传


· 当用户更新了配置文件的内容时,需要主动刷新服务的配置项  (@RefreshScope),告知客户端向 Config Server 获取最新版本的配置


那么我们来看看 Spring Cloud Config 如何配置:


A. 创建两个 Spring Boot 项目


从 start.spring.io 里下载项目模版并创建两个 Spring Boot 项目,一个叫config-server,另一个叫 config-client.


B. 配置 config-Server 项目


在 config-Server 中启用 Spring Cloud Config。

实现启用很简单,只需一行代码:


一篇文章带你了解 Spring Cloud Config_java_02


同时,在 config-server 项目中设置服务的端口,可任意设置。Server.port=8980

然后在 resource 目录下创建 bootstrap.properties 文件,用于设置配置文件存放的路径。


一篇文章带你了解 Spring Cloud Config_java_03


这里的 bootstrap.properties 文件也是资源文件的一种,不过它会在任何资源加载之前优先得到加载。


C. 配置 config-client 项目


一篇文章带你了解 Spring Cloud Config_java_04


在 config-client 项目中,创建 bootstrap.properties 文件,将 spring.cloud.config.url 的地址指向刚才配置的 config-server 的地址:localhost:8980。这样客户端会向指定的 config 服务器请求配置文件。


项目初始化好了后,我们先来创建一个最基本的 rest 资源:


一篇文章带你了解 Spring Cloud Config_java_05


这里创建一个 rest 资源“message”,它会从项目的资源文件读取内容,我们给它设置了一个默认内容“Default Hello”,然后打印到页面上:

一篇文章带你了解 Spring Cloud Config_java_06

下面,让我们来看客户端服务如何向 config server 请求配置文件:


D. 读取 git 配置

先在 config-server 的指定路径下初始化 Git 仓库:

一篇文章带你了解 Spring Cloud Config_java_07


创建 config-client.properties 文件,给变量 “message” 设置新的值: “Hi Viewer”,然后加入 Git 管理:


一篇文章带你了解 Spring Cloud Config_java_08


重启客户端服务,看到以下信息,则说明客户端服务从 config-server 读取配置信息了:


一篇文章带你了解 Spring Cloud Config_java_09


服务起来之后,刷新页面,得到更新的消息:


一篇文章带你了解 Spring Cloud Config_java_10

说明 config-server 正常工作!


E. 动态更新配置项

一篇文章带你了解 Spring Cloud Config_java_11


修改本地的资源文件 “message” 的内容,并且将修改提交到 git 仓库,此时,虽然更新了 git 仓库的消息内容,但 config-server 并不会主动监测到资源文件的变更,而需要主动触发 refresh 接口,让后台刷新 message 对象的最新内容。因为需要使用 Post 请求,所以这里我们用 Postman 触发这个请求,如下所示:


一篇文章带你了解 Spring Cloud Config_java_12


触发这个请求之后,再次刷新 config-client 的资源地址,会发现新的内容已经被更新,而且服务并没有重启:


一篇文章带你了解 Spring Cloud Config_java_13

这也验证了 Spring Cloud Config 提供的热生效特性。



    总结    


Spring Cloud Config 方便的将配置文件和应用程序进行了隔离,解决了微服务应用配置分离的痛点,之后也能方便的解决微服务容器化部署时,配置文件独立管理的问题。