通常分为两种类型:
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