首页 > 其他分享 >Nacos工作原理

Nacos工作原理

时间:2022-12-16 16:56:18浏览次数:51  
标签:配置文件 通知 配置 nacos refresh Nacos 工作 bean 原理

如果让你设计一个动态配置的功能,你会怎么做?注意是动态配置,不是配置中心。

先在大脑里面考虑3分钟,也许你有答案了。

对的,你肯定想的和下面一样:

 

 

  

上图是需要人工发起通知的动态配置架构,实现很简单。

但我们为什么要人工操作两次呢,可不可以简化到一次?

对于上图只需要稍作调整,就能达到只需要一次修改配置文件操作。

 

 

 

这样看起来简单多了。

采用定时任务,可以减少人工操作次数,但同时带来了一定的性能损耗。

回到nacos,它多采用的模型是定时任务来获取配置文件。

如果是一台机器,一个配置文件,上面的架构似乎完美胜任,如果将应用变成n个,机器n台,配置文件n个,

此时就会存在问题,人工操作不可能完成上面的工作,也容易出错。必须要自动化才能既保证效率提高,还

能保证不出错。

对此,只需要将上面的架构稍微改一改,就能满足需求。

 

 

 

nacos就是以上架构,十分的简单。

现在来看下他是如何集成到SpringCloud里面取得。

先来了解SpringBoot/SpringCloud中几个关键类。

MapPropertySource<T>:这个是spring中属性配置的数据源,所有的配置文件都要转成这样的形式。
RefreshEvent:发送该事件,可以类似调用RefreshEndpoint#refresh,也就是通知spring刷新配置文件。
EnvironmentChangeEvent:发送该事件,会通知环境已经发生变化。
ContextRefresher:刷新管理类。
NacosContextRefresher:nacos配置上下文管理类。
RefreshScope:该注解会把bean加入到'refresh'的scope中。

ClientWorker:nacos配置中心客户端,会定时http请求服务器。
其通信图如下:

 

 

 

1.在nacos上修改配置。

2.nacos客户端中ClientWorker会每隔10ms异步读取一次配置中心文件md5值。

3.和本地md5值比较,有变化的从服务器拉取。

4.将文件保存/缓存到本地。

5.通知NacosContextRefresher配置文件有变化。

6.NacosContextRefresher判断是否需要更新配置。

7.发送事件通知ContextRefresher去更新。

8.这里是更新配置的关键步骤。

9.准备一份before配置,然后通过构建新的Environment的方式拿到新的配置, 接着比较变化,得到有变化的keys。

10.构建Environment时会去读取配置文件,文件优先读本地,如果本地没有通过Http请求服务商。

11.构建NacosPropertiesSource,并重新生成ConfigurationProperties对象。

12.通知RefreshScope去更新。

13.销毁scope='refresh'的bean。

14.通知bean容器去构建新的bean(懒加载)。

15.将属性(@Value注解)注入到新的bean。

标签:配置文件,通知,配置,nacos,refresh,Nacos,工作,bean,原理
From: https://www.cnblogs.com/mr-wuxiansheng/p/16987787.html

相关文章

  • 翻译工作总结
        今天翻看了我以前的新浪博客,发现这篇文章的点击量有二千多次,特转载如下。具体参见:​​http://blog.sina.com.cn/s/blog_621fd7f80100f0uc.html​​。  步入......
  • 两年开发工作总结及未来展望
        “无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点​​这里​......
  • SEH溢出原理
    0x01SEH概念及原理windows系统的结构化异常处理机制(structuredexceptionhandingSEH),常见的try/except或者try/catch就是异常处理代码。当程序产生异常之后,就会从栈......
  • vue2 数据响应式原理模拟继续优化
    上次简单的模拟了数据响应式,当我们第一次修改值依赖函数会执行一次,再修改一次值依赖函数会执行两次,这需要做下去重,去掉重复绑定的依赖。采用的方法是给每个dev实例添加一个......
  • Dubbo源代码注册中心由zookeeper更改为nacos
    下载了dubbo源代码,本地进行demo测试,本地电脑只有nacos,所以将dubbo默认的zookeeper调整为nacos。//本人用的dubbo-demo-annotation,其他demo同理//服务提供方publiccla......
  • Nacos 2.2 正式发布,这次更新太炸了!
    大家好,我是栈长,Nacos2.2.0正式发布了!Nacos2.2.0还真是一个比较重要的版本,因为它涉及了太多重大更新,今天栈长给大家来解读下。Nacos2.2.0重大更新1、删除冗余代码......
  • 换工作?试试远程工作「GitHub 热点速览 v.22.40」
    近日,潜在某个技术交流群的我发现即将毕业的小伙伴在焦虑实习、校招,刚好本周GitHub热榜有个远程工作项目。不妨大家换个思路,“走”出去也许有更多的机会。当然,除了全球的远......
  • python编程中的if __name__ == 'main': 的作用和原理
    大多数编排得好一点的脚本或者程序里面都有这段if__name__=='main':,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与打架分享。  1、这段代码的功能 ......
  • Kubernetes快速实战与核心原理剖析
    K8S概览1.1K8S是什么?K8S官网文档:https://kubernetes.io/zh/docs/home/K8S是Kubernetes的全称,源于希腊语,意为“舵手”或“飞行员”,官方称其是:用于自动部署、扩展和管理“......
  • 手写一个Redux,深入理解其原理-面试进阶
    Redux可是一个大名鼎鼎的库,很多地方都在用,我也用了几年了,今天这篇文章就是自己来实现一个Redux,以便于深入理解他的原理。我们还是老套路,从基本的用法入手,然后自己实现一个R......