本文使用 Spring Cloud 进行集中式配置管理,将以往的配置文件从项目中摘除后放到git 或svn中集中管理,并在需要变更的时候,可以通知到各应用程序,应用程序刷新配置不需要重启。
先套用下面这张图来看一下我们需要做的事情:
Git Repository 为存放配置的地方,当然你也可以选择SVN。
本文的Git 地址为:https://github.com/xzxiaoshan/config-repo
接着我们创建多模块Maven工程,包括 sample-cloud-all 、 sample-cloud-configserver 、 sample-cloud-client ,整体结构如下图:
其中config-repo 为配置文件存放位置,并非一个Maven工程,只是为了便于本地修改和提交。
整体源码地址在Github上,所以本文就不贴代码了
地址:https://github.com/xzxiaoshan/spring-cloud
至此,config-server 和 config-client 已经完成了,并且可以正常使用了。
再说一下基本原理:
git 上存放我们的远程配置文件
config-server 连接到 git
config-client 连接到config-server
当我们启动config-client 服务的时候,client 会通过连接的 config-server 拿到远程git 上面的配置文件,然后通过 Spring 加载到对象中。
那么,当我们修改了 git 上的远程配置文件后,如何在不重启 config-client 服务的情况下让项目中引用的配置信息更新呢?
首先,我们在 config-client 工程中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<optional>true</optional>
</dependency>
然后在需要自动更新配置变量的Java类上,使用注解 @RefreshScope 修饰。
以后当我们再更新git上面的配置文件后,在 config-client 端执行POST 请求 http://localhost:8080/refresh 就可以更新刷新配置变量到内存中了。
如果我们 config-client 做的是分布式部署,岂不是要每一个机器都POST一下 /refresh 请求,这样显然不是最好的方法。
Spring Cloud Bus 为我们解决了这样的问题。
先看一下下面这张套用的图:
图中的 Cloud Bus 作为依赖库存在于每个App 中,并不是独立的服务。
官网源码地址 https://github.com/spring-cloud/spring-cloud-bus
因为时间原因,对于 Spring Cloud Bus 请大家自行了解下。
Cloud Bus 需要依赖AMQP、Redis、Kafka 这样的组件做为代理才可以使用。
经过对Spring Cloud 的统一配置管理的了解和测试,本人发现这个做的并不好,特别是在分布式部署上虽然完全可以支持,但是总感觉使用起来比较麻烦。
个人还是推荐大家使用百度开源的 Disconf 进行集中化配置管理。而且这个目前也比较成熟,很多商用项目已经在使用。
目前 Spring Cloud 还并不成熟,所以大家慢慢学习和研究,博主也期待 Spring Cloud 真正强大的一天早一天到来。