首先要了解我们的任务
就是要动态地修改配置这个修改不限于修改配置文件或者类似nacos以及阿波罗这种分布式的框架从外部获取配置文件这种情况。
这篇文章也算是对自己这两天阅读源码的交代 大体的了解了流程以及明白了实现的原理。最起码写的自己能看明白了点,说实话过段时间我就忘了。23333
然后 要说一下spring里大量地使用了事件, 解耦很好,谁想关注这块的逻辑 谁监听这个事件就可以,以往的代码都要调用逻辑,当你逻辑越来越多牵扯模块越来越多的时候总有一天你会发现逻辑加不动了,还不如拆分成事件 每个模块关注自己的实现即可。
最后说一下大体的原理
简略的说就是销毁我们想要更新的对象就可以了
详细地说 刷新我们的env配置其中将已经加载好的配置进行修改 或者替换 或者重新加入一份 然后我们已经依赖这些配置注入到spring中的对象怎么办呢? 要知道有些属性可以动态的修改 有些缺不能,所以我们要做的是把所有从配置文件到依赖的对象比如redis依赖redisProperties,这时候redis的luttence也要进行处理。 处理的方案就是利用spring的懒加载机制,获取一个对象获取不到时会使用工厂加载这个对象,这时候我们将此需要重新加载的对象销毁就可以,下次在使用这个对象时候spring就会为我们新创建出一个对象。
其中前面几个技术点就是 scope 以及cloud的refreshScope,这个注解就是为我们在刷新配置的时候清除对象的。还有env内的各种对象
上图为nacos的 propertySource对象 通过它注入到spring也就让spring的envlement配置加载配置文件,我们可以像nacos这样实现随后就是我们的配置加入到了spring中。
这个类管理了nacos的远程配置文件,内部包括md5验证以及定时任务长轮询请求验证配置文件是否有变化,30S一次如果有变化会立马推送过来,内部实现还是比较有趣的有兴趣的可以看看。所以nacos要做的是这样的发现配置文件变化然后对这个类的配置文件进行更新,随后发送refresh事件刷新spring就完成了配置文件的动态更新,下面列代码。
这个类是关键 下面罗列一下重要代码。
内部创建单例的ConfigService 这个可是关键
这里还有个小技巧由于maven依赖问题 它这里是没法直接new这个对象的 所以它使用了反射,反射是可以的哦, 但是他这么做是不是说明了可能结构有点问题?还有一些地方的代码我看也有一些冲突。鄙人愚见 请别喷我。。。
在构造器内有一个worker对象,这个对象就负责异步的和nacosServer交互内部使用定时任务线程池完成操作,具体源码细节这里不深究。
构造器内就定义了任务,请求服务器检查MD5值,然后再次请求server服务器获取最新的修改配置文件 解析加载到nacos配置文件内。
上图是按照你有多少个配置文件,一个配置文件相当于一个cachedata,启动多个长轮询任务,这一块我看的有点模糊应该是这样子的。
再来看一下长轮询任务
注意红标代码 将变更的配置文件替换本地的cache
那么问题来了 这时候进行数据的替换的时候 我们要怎么通知spring来进行刷新呢?
找了半天发现在nacos启动的时候后注册监听器 然后在
这个方法里进行调用listener 这方法起名是不是有点问题?反正我找了半天。
这时候就会对listener进行调用
注册监听器的方法在这里 我们可以看到 这个listener会发送reflush时间对spring 这时候关于nacos的刷新就结束了。
处理这个事件的逻辑 就是先更新配置文件,然后再刷新所有@configproperties注解的配置类,然后重新绑定。 对于加了@refreshScose注解的类 后直接销毁
再次发布了一个事件 更新完配置环境之后 EnvironmentChangeEvent发送这个事件
所以说 这就是从nacos里了解出的动态加载机制,我们如果想手写当然没问题,有样学样,先做配置类然后发布刷新事件即可
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容