Nacos源码结构和AP模式注册中心实现介绍
前言
NacosAP模式源码分析目录
Nacos源码结构介绍
Nacos版本基于1.4.0版本,整体的项目结构如下:

看到目录,第一眼的感觉就是职责分明,给人的感觉就是高手,关于源码部分我也没全看完,目前只是注册中心相关看完了,配置中心的就是略微看了一下,我先给大家介绍下重点的模块的作用的,到时候大家再结合上面几篇文章去理解源码:
- address模块: 主要查询nacos集群中节点个数以及IP的列表;
- api模块: 主要给客户端调用的api接口的抽象;
- client模块: 主要是对依赖api模块和common模块,对api的接口的实现,给nacos的客户端使用;
- cmdb模块: 主要是操作的数据的存储在内存中,该模块提供一个查询数据标签的接口;
- config模块: 主要是服务配置的管理, 提供api给客户端拉去配置信息,以及提供更新配置 的,客户端通过长轮询的更新配置信息.数据存储是Mysql;
- naming模块: 主要是作为服务注册中心的实现模块,具备服务的注册和服务发现的功能;
- console模块: 主要是实现与前端进行交互.具有权限校验、服务状态、健康检查等功能;
- core模块: 主要初始化属性加载,监听器相关内容,用于加载nacos的default的配置信息,config和naming都依赖于这个包;
我觉得上面8个模块相对来说是比较重要,对于大家研究Nacos源码是必须要掌握的,关系间的依赖如下:

模块之间的调用关系如下:
看到调用关系就可以感觉出来,整体上源码不算太难,耐心看看还是可以看懂的。
Nacos AP模式源码核心部分介绍

服务注册
Nacos Client通过/nacos/v1/ns/instance接口将服务信息(包括服务的名称、IP、端口、状态等信息)注册到Nacos Server的注册表中,存放于类ServiceManager的内部对象Map<String, Map<String, Service>> serviceMap,这是一个两层Map的嵌套结构,第一层的Key是Namesapce名称,第二层的Key是Group名称和Service名称的组合,第二层的Value是Service的对象。
服务心跳
用户服务和订单服务注册后,每个客户端会通过定时任务来维持一个定时心跳来持续通知Nacos Server,默认 5s发送一次心跳;
服务健康检查
Nacos Server通过定时任务检查注册服务实例的健康状况,对于超过15s没有收到客户端心跳的实例会将它的 healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送 心跳则会重新注册);
服务同步
服务同步我觉得主要分为两方面同步,一是Nacos Server集群之间的同步,会过/nacos/v1/ns/instance/distro/datum互相同步服务实例的信息,二是服务的消费者同步变更新到客户端,服务消费者(Nacos Client)会接收服务端的UDP推送过来的服务变更信息(检测到不正常的服务的时候服务发生变更),及时更新到本地缓存中,这是Nacos的亮点和其他注册中心不一样的地方,面试的时候可以和面试官聊,会让面试官眼前一亮的,因为UDP本身是不可靠的,不能保证所有的变更信息都可以同步到客户端,所以消费者还有一个定时任务的兜底机制;
谈谈收获
看完这部分源码收获我觉得主要有两方面的收获:
技术方面
技术方面的收获的是最多的,这里简单聊几个例子:
- 从整体的框架的设计,还是到模块中类实现的设计,单一原则体现的淋淋尽致,下图是整体框架设计,体现到代码上就是每个模块职责很清晰,依赖关系很明确,另外框架层面的做的插件化的思想、高可用的思想,都是我们可以借鉴学习的;

- 很多技术细节的实现很精妙,比如服务变更时候的异步队列的设计、CopyOnWrite的思想、Spring事件机制的应用等等,这些都在我的博客中源码分析的细节中讲到,大家可以稍微花一些功夫看看;
写作方面
这部分其实还没形成一个完整的思想,只是初步的一个思考,关于这种源码分析的,以后会采用以下方式:
- 框架选型的思考, 分析类似中间件对比;
- 框架搭建和使用介绍;
- 源码代码模块介绍和框架模块功能性的描述,类似就是做一个整体功能介绍;
- 每个模块功能源码的分析,附带时序图和类图关系,后面我会对Nacos系列的文章的内容进行一个改造;
- 完成每个模块的介绍以后会统一做代码的整体关键步骤的源码分析图和总结;
结束
欢迎大家点点关注,点点赞!

Nacos源码结构和AP模式注册中心实现介绍的更多相关文章
- [源码阅读] 阿里SOFA服务注册中心MetaServer(1)
[源码阅读] 阿里SOFA服务注册中心MetaServer(1) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(1) 0x00 摘要 0x01 服务注册中心 1.1 服务注册中心简 ...
- [源码阅读] 阿里SOFA服务注册中心MetaServer(2)
[源码阅读] 阿里SOFA服务注册中心MetaServer(2) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(2) 0x00 摘要 0x01 MetaServer 注册 1.1 ...
- [源码阅读] 阿里SOFA服务注册中心MetaServer(3)
[源码阅读] 阿里SOFA服务注册中心MetaServer(3) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(3) 0x00 摘要 0x01 概念 1.1 分布式一致性 1.2 ...
- SpringCloud 源码系列(3)—— 注册中心 Eureka(下)
十一.Eureka Server 集群 在实际的生产环境中,可能有几十个或者几百个的微服务实例,Eureka Server 承担了非常高的负载,而且为了保证注册中心高可用,一般都要部署成集群的,下面就 ...
- SpringCloud 源码系列(1)—— 注册中心 Eureka(上)
Eureka 是 Netflix 公司开源的一个服务注册与发现的组件,和其他 Netflix 公司的服务组件(例如负载均衡.熔断器.网关等)一起,被 Spring Cloud 整合为 Spring C ...
- Dubbo源码学习总结系列七---注册中心
Dubbo注册中心是框架的核心模块,提供了服务注册发现(包括服务提供者.消费者.路由策略.覆盖规则)的功能,该功能集中体现了服务治理的特性.该模块结合Cluster模块实现了集群服务.Dubbo管理控 ...
- SpringCloud 源码系列(2)—— 注册中心 Eureka(中)
五.服务注册 1.实例信息注册器初始化 服务注册的代码位置不容易发现,我们看 DiscoveryClient 初始化调度任务的这个方法,这段代码会去初始化一个实例信息复制器 InstanceInfoR ...
- Nacos源码深度解析1-服务注册初始化(客户端)
一.初始化 NamingService naming = NamingFactory.createNamingService(properties); 二.通过反射传入properties生成Naco ...
- Nacos源码系列—关于服务注册的那些事
点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 nacos,即可免费获取源码 简介 首先我们在看Nacos源码之前,要 ...
随机推荐
- 学就完事了!万星项目带你做 3D 游戏——GitHub 热点速览 v.21.18
本文首发于「HelloGitHub」微信公众号,搜索「HelloGitHub」点击关注解锁更多宝藏! 作者:HelloGitHub-小鱼干 新手开始学习的时候,都会遇到一个问题:如何开始学 xx?Se ...
- 趁五一撸个纯Flutter版的心情日记App
前言 最近真的是太忙了,只能趁着五一期间把之前Android版的心情日记App移植到Flutter平台,并且已经上架华为应用市场以及苹果App Store. 整体框架沿用了两个星期,用Flutter撸 ...
- 源码篇:ThreadLocal的奇思妙想(万字图文)
前言 ThreadLocal的文章在网上也有不少,但是看了一些后,理解起来总感觉有绕,而且看了ThreadLocal的源码,无论是线程隔离.类环形数组.弱引用结构等等,实在是太有意思了!我必须也要让大 ...
- POJ2594 最小路径覆盖
题意: 题意就是给你个有向无环图,问你最少放多少个机器人能把图全部遍历,机器人不能走回头路线. 思路: 如果直接建图,跑一遍二分匹配输出n - 最大匹配数会跪,原因是这个题目和以 ...
- ConcurrentHashMap源码解读二
接下来就讲解put里面的三个方法,分别是 1.数组初始化方法initTable() 2.线程协助扩容方法helpTransfer() 3.计数方法addCount() 首先是数组初始化,再将源码之前, ...
- Postman报文进行解密之RSA私钥解密
接口返回的数据也是加密的,需要对数据解密才能看到返回的数据是否正确,就需要用RSA解密. 返回数据的解析可以在postman的Tests进行后置处理,获取加密后的返回数据: var data = JS ...
- Windows反调试技术(下)
OD的DBGHELP模块 检测DBGHELP模块,此模块是用来加载调试符号的,所以一般加载此模块的进程的进程就是调试器.绕过方法也很简单,将DBGHELP.DLL改名. #include <Wi ...
- windows的SEH异常处理以及顶层异常处理
前言 windows的SEH结构化异常处理是基于线程的,传统的SEH结构化异常会基于堆栈形成一条包含异常回调函数地址的链(SEH链).而fs:[0](TEB的第一个字段)指向这条链的链头,当有异常发生 ...
- (转)通过gitlab统计git提交的代码量
git的代码量大多数都是根据命令行统计,或者根据第三方插件统计.但是都不满足我的需求,因为我们代码都由gitlab管理,于是想到了通过gitlab暴露出来的接口获取数据. 第一步,生成私钥 登录你的g ...
- NIOSII IDE在WIN7下 couldn't allocate heap
首先,所有的文件夹都不能有空格和中文 其次,出现这些SB错误 make -s all includes 3 [main] ? (3732) c:\altera\91\quartus\bin\cygwi ...