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

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

文章插图
最终从配置中心获取到的属性会放在项目启动时创建的 Environment 对象里面 。
3.2配置刷新源码流程
撸了一个简易的配置中心,顺带整合到了SpringCloud

文章插图
这个图新增了对于加了@ConfigurationProperties数据绑定的对象原理的分析 。
整合SpringCloud和测试一、整合SpringCloud1、ConfigCenterProperties
撸了一个简易的配置中心,顺带整合到了SpringCloud

文章插图
配置中心的配置信息 , 这里需要配置配置中心服务端的地址和使用的配置文件的id 。当然这部分信息需要写在bootstrap配置文件中 , 前面也说过具体的原因 。
2、ConfigCenterPropertySourceLocator上面分析知道 , 项目启动和刷新的时候,SpringCloud是通过PropertySourceLocator的实现从配置中心加载配置信息,所以这里就得实现一下

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

文章插图
核心的逻辑就是根据所配置的文件的id,从配置中心拉取配置信息 , 然后解析配置 。
3、ConfigContextRefresher这个是用来注册文件变动的监听器,来刷新文件的信息的 。
因为上面提到,当配置发生变化的时候,需要发布一个RefreshEvent事件来触发刷新配置的功能 。

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

文章插图
核心的逻辑就是当项目启动的时候 , 对所使用的配置文件进行注册一个监听器 , 监听器的实现就是当发生配置改动的时候,就发布一个RefreshEvent事件 。
4、两个配置类4.1 ConfigCenterBootstrapConfiguration
撸了一个简易的配置中心,顺带整合到了SpringCloud

文章插图
配置了ConfigCenterPropertySourceLocator、ConfigCenterProperties、ConfigService
4.2 ConfigCenterAutoConfiguration
撸了一个简易的配置中心,顺带整合到了SpringCloud

文章插图
配置了ConfigContextRefresher、ConfigCenterProperties、ConfigService
最后需要将两个配置类在spring.factories配置一下 。
这里有个需要注意,前面说过,SpringCloud会创建新的容器来加载配置 , 而这个容器只会加载spring.factories文件中键为@BootstrapConfiguration注解的配置类,所以需要将ConfigCenterBootstrapConfiguration跟BootstrapConfiguration配对,因为ConfigCenterBootstrapConfiguration配置了ConfigCenterPropertySourceLocator 。

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

文章插图
好了,到这里真的就完成了对SpringCloud整合了 。
二、测试1、新增一个配置文件启动配置中心的server端,然后打开ApiPost,新增一个配置文件

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

文章插图
新增文件类型为properties一个配置,内容为sanyou.username=sanyou键值对,当然可以写很多键值对,我这里就写了一个 , 新增成功之后,返回了文件的id:79765c73-c1ef-4ea2-ba77-5d27a64c4685
2、测试客户端这里我为了方便,就把测试代码跟客户端写在同一个服务了,正常情况肯定是把跟SpringCloud代码打成一个依赖引到项目中 。
在bootstrap.yml文件中配置配置中心的相关信息

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

文章插图
  • 配置中心服务端的地址是:localhost:8888
  • 使用的配置文件的id是刚才创建的:79765c73-c1ef-4ea2-ba77-5d27a64c4685
测试Controller

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

文章插图
提供一个接口,注入上面提到的UserService
启动项目 , 调用接口

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

文章插图
从断这里可以看出,实际注入的是一个UserService代理对象,并且最终找的是com.sanyou.configcenter.test.UserService@3a1e4fd3这个UserService对象
此时这次调用的返回值就是:sanyou

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

文章插图
接下来测试一下自动刷新属性的功能
现在修改一下配置中心的sanyou.username为sanyou666

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

文章插图
静静等待5秒钟 。。
此时控制台打印出 Refresh keys changed: [sanyou.username],也就是sanyou.username属性变了

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

文章插图

推荐阅读