撸了一个简易的配置中心,顺带整合到了SpringCloud( 三 )

撸了一个简易的配置中心,顺带整合到了SpringCloud

文章插图
变动通知代码实现
到这,一个简单的配置中心的服务端的和客户端就完成了,这里画张图来总结一下配置中心的核心原理 。

撸了一个简易的配置中心,顺带整合到了SpringCloud

文章插图
接下来就把这个简易的配置中心整合到SpringCloud中 。
SpringCloud配置中心的原理1、项目启动是如何从配置中心加载数据的?在SpringCloud环境下,当项目启动的时候,在SpringBoot应用容器创建之前,会先创建一个容器,这个容器非常重要,这个容器是用来跟配置中心交互,拉取配置的 。
这个容器在启动的时候会干两件事:
  • 加载bootstrap配置文件,这就是为什么配置中心的配置信息需要写在bootstrap配置文件的重要原因
  • 加载所有spring.factories文件中的键为org.springframework.cloud.bootstrap.BootstrapConfiguration对应的配置类,将这些配置类注入到这个容器中,注意这里是不会加载@EnbaleAutoConfiguration自动装配的类
当这两件事都做好之后,会从这个容器中获取到所有的PropertySourceLocator这个接口的实现类对象,依次调用locate方法 。

撸了一个简易的配置中心,顺带整合到了SpringCloud

文章插图
PropertySourceLocator
这个类很重要,先来看看注释
Strategy for locating (possibly remote) property sources for the Environment. Implementations should not fail unless they intend to prevent the application from starting.
扔到有道翻译如下:
为环境定位(可能是远程)属性源的策略 。实现不应该失败,除非它们打算阻止应用程序启动 。
说的简单点就是用来定位到(也就是获取的意思)项目启动所需要的属性信息 。同时要注意到括号内的 可能是远程 告诉我们一个很重要的信息,那就是获取的配置信息不仅仅可以存在本地,而且还可以存在远程 。
远程?作者这里就差直接告诉你可以从配置中心获取了 。。
所以从这个注释就可以发现,原来PropertySourceLocator就是起到在SpringCloud环境下从配置中心获取配置的作用 。
PropertySourceLocator是一个接口,所以只要不同的配置中心实现这个接口,那么不同的配置中心就可以整合到了SpringCloud,从而实现从配置中心加载配置属性到Spring环境中了 。
2、如何实现注入到Bean中的属性动态刷新?上面讲了在项目启动的时候SpringCloud是如何从配置中心加载数据的,主要是通过新建一个容器,加载bootstrap配置文件和一些配置类,最后会调用PropertySourceLocator来从配置中心获取到配置信息 。
那么在SpringCloud环境下,是如何实现注入到Bean中的属性动态刷新的呢?
举个例子

撸了一个简易的配置中心,顺带整合到了SpringCloud

文章插图
UserService
当在类上加一个@RefreshScope注解之后,那么当配置中心sanyou.username的属性有变化的时候,那么此时注入的username也会跟着变化 。
这种变化是如何实现的呢?
SpringCloud中规定,当配置中心客户端一旦感知到服务端的某个配置有变化的时候,需要发布一个RefreshEvent事件来告诉SpringCloud配置有变动 。

撸了一个简易的配置中心,顺带整合到了SpringCloud

文章插图
在SpringCloud中RefreshEventListener类会去监听这个事件,一旦监听到这个事件,就会进行两步操作来刷新注入到对象的属性 。

撸了一个简易的配置中心,顺带整合到了SpringCloud

文章插图

经验总结扩展阅读