当前位置: 首页 > 网络应用技术

NACOS动态配置源代码分析

时间:2023-03-05 16:47:46 网络应用技术

  通常分为两种类型:

  NACOS使用客户端拉方法,但采用长轮询问来获取配置方法

  一般业务流程如下:

  以下将根据三个内容分析源代码:

  如果要使用NACOS的配置功能,则需要介绍相应的依赖项:

  根据Springboot自动组件的特征,我们找到相应的Spring.factories文件,并

  单击以输入NACosconFigbootStrapConfiguration文件,请注意检查NacosconFigManager()方法

  在此方法中,创建了一个nacosconfigmanager对象。NacosconFigManager对象的构造函数调用CreateConfigservice(NacosconFigProperties)来创建ConfigService对象。

  ConfigService是一个仅具有一个Nacosconfigservice的实现的接口,因此我们直接找到Nacosconfigservice的构造函数:

  然后检查客户工作者的施工方法

  接下来,查看CheckConfiginfo()方法的内容:

  这是一个非常重要的对象cachemap。让我们看看它的外观:

  CACHEMAP的主要作用是存储监控更改的缓存集合。为了确保线程的安全性,使用了ConcurrentHashMap的结构。Key称为GroupKey,该字符串由Dataid,Group,tenant(租户)缝制的字符串;值是卡切达塔的对象。每个Dataid将容纳一个Cachedata的对象。

  上述longpollingrunnable对象被取回。它是实现可运行接口的内部客户端工作类。对于这种情况,我们直接查看其运行()方法:

  代码的这一部分更长,分配分为两个部分:

  有两种主要方法:CheckLocalConfig(Cachedata)和SuckListenermd5()方法

  该方法的作用是验证本地文档,分为三种情况:

  如果MD5值不同,请发送数据更改通知,请调用SafeNotifyListener方法,该方法的内容如下:

  在此方法中,已注册了DataID注册的客户端的数据内容。客户收到通知后,通过ReceiveConfiginfo()方法接收回调数据以处理自己的业务。

  其中有两种重要方法:checkupdatedataids()和getserverconfig()方法:

  此方法调用checkupdateconfigstr(sb.toString(),isInitializedcachelist),从服务器获取dataid列表,并将Long -rim查询的徽标添加到请求标题:

  在执行了CheckupDatedAtaids()方法之后,获得了更新的更换groupkeys,the ChangeGroupkeys列表的周期,调用getserverConfig()方法,并获得服务器的配置:

  在这一点上,已经分析了客户启动长期启动代码。

  在服务器代码com.alibaba.nacos.config.server.controller.configcontroller#侦听器中,查找客户端的/v1/cs/configs/侦听器接口。dopollingConfig()方法称为:

  记住这个LongpollingService对象,这非常重要。

  此方法对于addlongPollingClient()更为重要。详细的代码如下:

  在此方法中,比较MD5如果不同,则文件的内容已更改,并且GeneralResponse()的顺序直接响应客户端。如果不更改配置项,请创建客户端隆起对象并将其移交给正时线池。

  clientlongpolling对象实现可运行的接口。我们直接查看其运行方法。内容如下:

  运行方法中有两个逻辑。第一次看第二个。将当前的长-RIM查询对象放入AllSubs。AllSubs是一个队列,定义如下:

  查看第一个方法,创建一个可运行的对象,然后将其放入线程池中,每29.5S执行每29.5S执行一次。如果更改了配置(MD5不同),请调用SendResponse(更改组)方法以响应客户端。

  如果用户修改数据,将调用/nacos/v1/cs/configs接口。相应的代码条目是:com.alibaba.nacos.config.server.controller.configcontroller#publicishConfig,代码如下:如下:

  可以看出,NotifyConfigChange()将在三个位置中调用并创建configDataChangeEvent事件。该事件只有一个接收器com.alibaba.nacos.config.service.notify。

  在OneVent()方法中,创建一个异步对象以通知已更改操作的配置文件。异步对象的运行方法是:

  根据呼叫/v1/cs/communication/dataChange接口,查找相应的代码:com.alibaba.nacos.config.config.server.controller.communicationcontroller#notifeConfiginfo

  转储方法的内容如下:

  查看addTask()方法,可以追溯到com.alibaba.nacos.common.task.task.engine.nacosdexecutengine#addtask.in nacosdelaytaskexecutengine,您可以看到以下代码:

  检查processRunnable对象的运行方法,您将调用processTasks()方法。crocessStasks()方法将调用GetProcessor以获取相应的任务处理器

  在此处获得dumpprocessor对象,检查dumpprocessor,com.alibaba.nacos.config.config.server.dump.processor.dumpprocessor#的过程方法。

  ConfigDump()方法中的代码为:

  好吧,经过这么长时间,我终于达到了最重要的方法。该代码主要做两件事:

  在dump()方法中,最重要的方法是:updatemd5(groupkey,md5,lastModifieds),此方法的内容如下:

  在此方法中,创建并发送并发送了一个localDataChangeEvent事件。事件在哪里处理?交叉点您还记得上一个长的-Roll -up对象longpollingService对象吗?

  您可以看到LongPollingService接受LocalDataChangeEvent对象,并创建DatachAngask对象以查看其Run()方法:

  此步骤是取出队列中的所有长轮并响应。收到响应后,客户端将请求/v1/cs/configs接口以获取最新的配置。在这一点上,所有进程均为字符串。

  此处的文章只是整理了NACOS动态配置的主要过程。可以看到,使用大量异步线程处理来提高效率,并且某些逻辑看起来更加周围。错误或缺失,请批评和纠正,谢谢!

  原始:https://juejin.cn/post/7100157035232264199