为什么我会经常阅读源码呢,因为阅读源码能让你更加接近大佬,哈哈,这是我瞎扯的。
这篇文章将会带大家阅读nacos源码 以及 教大家阅读源码的技巧,我们正式开始吧!
先给大家献上一张我梳理的高清源码图,方便大家对nacos的源码有一个整体上的认识。
有了这张图,我们就很容易去看nacos源码了。
首先我们得要找一个切入点进入到nacos源码中,那么就从nacos依赖入手
进入这个依赖文件,会发现它又依赖了一个组件:
进入依赖之后,我们发现它长这样:
从这张图中,我们发现了义务教育英语一个熟悉的配置文件spring.factories,这是sringboot自动装配的必备文件
因为这张主要说的是服务注册源码,所以我们可以只用关注(nacosrviceregistryautoconfiguration)自动装配文件
我们看到的是三个bean注入,这里给大家介绍一个看源码的小技巧:自动装配的文件中申明的bean类,我们只需要看带有auto的bean,这个往往是入口;nacosautorviceregistration 带有auto,我们点进去看看里面都有什么:
里面有一个register()方法,我在这里打个断点,因为我猜测这个就是注册的入口,我现在使用debug模式,启动一个服务,看它会不会调用这个方法:
这里贴上我debug后,进入register方法的调用链截图
看到这个调用链,看到一个onapplicationevent的回调方法,找到这个方法所在的类abstractautorviceregistration
这个类继承了applicationlistener这个多播器监听器,spring启动之后,会发布多播器事件,然后回调实现多播器组件的onapplicationevent方法,我们从这个方法开始分析:
因为springcloud提供了多种注册中心扩展,但是我们这里只引用了nacos注册中心,所以这里直接调用的是nacosrviceregistry的register方法:
进入到registerinstance方法
rverproxy通过调用对http进行封装的reapi方法,向服务端接口(“/nacos/v1/ns/instance”)发送请求,
我们知道na郑振铎cos经常是以集群形式部署的,那客户端是如何选择其中一个节点发送呢,肯定得实现负载均衡的逻辑,我们点击reqapi,看它是如何实现的
到这里,客户端注法人委托书册的代码已经分析完了,不过这还不是本篇的结束,我们还得继续分析服务端是如何处理客户端发送过来的注册请求:
如果需要查看服务端源码的话,则需要将nacos源码下下来 下载地址
我们从服务注册api接口地址(/nacos/v1/ns/instance),可以找到对应的controller为(com.alibaba.nacos.naming.controllers.instancecontroller)
因为注册实例发送的是post请求,所以直接找被postmapping注解的register方法
我们点击进入到registerinstance方法:
在nacos中,注册实例后,还需要将注册信息同步到其他节点,所有在nacos中存在两种同步模式ap和cp,ap和cp主要体现在集群中如何同步注册信息到其它集群节点的实现方式上;
nacos通过ephemeral 字段值来决定是使用ap方式同步还是cp方式同步,默认使用的的ap方式同步注册信息。com.alibaba.nacos.naming.core.rvicemanager.addinstance()
我们在进入到consistencyrvice软考含金量.put方法中
点击put方法时,会看到有三个实现类,根据上下文(或者debug方式),可以推断出这里引用的是delegateconsistencyrviceimpl实现类
从下面的方法中 可以判断通过key来判断使用ap还是cp来同步注册信息,其中key是由ephemeral字段组成;
ap 方式同步的流程(ephemeralconsistencyrvice) 本地服务器处理注册信息&将注册信息同步到其它节点
nacos将key做为一个task,添加到notifer中阻塞队列tasks中,并且使用单线程执行,其中notifer是初始化的时候,作为一个线程被放到线程池中(线数学手抄报的内容程池只设置了一个核心线程);
这里有一个点需要告诉大家:在大多数分布式框架,都会采用单线程的阻塞队列来处理耗时的任务,一方面解决并发问题,另一方面能够解决并发带来的写写冲突问题。
线程中的主要处理逻辑就是,循环读取阻塞队列中的内容,然后处理注册信息,更新到内存注册列表中。
nacos同样也是把注册key作为一个task存放到 taskdispatcher 中的taskshedule阻塞队列中,然后开启线程循环读取阻塞队列:
使用ap方式作同步的过程很简单,但是这里面有两种设计思路来解决单个key同步的问题:
如果有新的key推送上来,nacos就发起一次同步,这会造成网络资源浪费,因为每次同步的就只有一个key或者几个key;
同步少量的key解决方案: 只有积累到指定数量的key,才发起批量同步距离上次同步时间超过配置的限制时间,则忽略key数量,直接发起同步 cp 方式同步的流程(raftconsistencyrviceimpl)
cp模式追求的是数据一致性,为了数据一致性,那么肯定得选出一个leader,由leader首先同步,然后再由leader通知follower前来获取最新的注册节点(或者主动推送给follower)
nacos使用raft协议来进行选举leader,来实现cp模式。
同样进入到 raftconsistencyrviceimpl的put方法
进入到raftcore.signalpublish方法中,我提取几个关键的代码
同样采用同样队列的方式,去处理本地注册列表
遍历所有集群节点,发送http同步请求
到此,nacos服务注册及服务实例同步的主干源码已经分析完了。
对于刚开始接触nacos源码的同学,可以先把头上的图多看几遍,然后对照着源码找到对应的位置 ,最后结合图再结合本文,整体连贯的看下来,相信会有很大收获的;虽然阅读源码的过程很痛苦,但是你只要坚持下来了,掌握到了阅读源码的技巧,你就会发现再难的源码,你都能把它啃下来;后面我会专门写一篇教你如何高效阅读源码的文章,希望对于刚接触源码的同学能有所帮助。
到此这篇关于nacos源码阅读方法的文章就介绍到这了,更多相关nacos源码阅读内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-06 01:33:13,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/306049862b4e02a27854b890e74c17f4.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Nacos源码阅读方法.doc
本文 PDF 下载地址:Nacos源码阅读方法.pdf
留言与评论(共有 0 条评论) |