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源码之前,要 ...
随机推荐
- Docker安装Nacos动态服务发现、配置和服务管理平台
一.通过DockerHub拉镜像,版本查看:https://github.com/nacos-group/nacos-docker //稳定版,有权限 docker pull nacos/nacos- ...
- python进阶(17)偏函数partial
什么是偏函数partial python中提供一种对于函数固定属性的函数 偏函数的作用 把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数 偏函数的语法 使用偏函数必须先导入from ...
- .Net之配置文件
1. 说明 默认情况下读取配置Configuration的默认优先级:ConfigureAppConfiguration(自定义读取)>CommandLine(命令行参数)>Environ ...
- java语言写一个建议的五子棋
经过16天的java学习,也学得了不少关于Java方面的知识,我想分享一下我用java写的一个简单的五子棋. 游戏规则: (1)对局双方各执一色棋子.(2)空棋盘开局.(3)白先.黑后,交替下子,每次 ...
- APK程序Dex文件无源码调试方法讨论
那些不靠谱的工具 先来说说那些不靠谱的工具,就是今天吭了我小半天的各种工具,看官上坐,待我细细道来.IDA pro IDA pro6.6之后加入了dex动态调试功能,一时间普天同庆.喜大普奔.兴奋之后 ...
- 基于Xposed Hook实现的Android App的协议算法分析小工具-CryptoFucker
本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80962121 在进行Android应用的网络协议分析的时候,不可避免涉及到网络传 ...
- hdu2158 最短区间版大家来找碴
题意: 最短区间版大家来找碴 Problem Description 给定一个序列,有N个整数,数值范围为[0,N).有M个询问,每次询问给定Q个整数,可能出现重复值 ...
- 关于PHP动态的接收传递的GET,POST和COOKIE变量
0x01 我们知道 PHP 接收的变量最常用的是 GET,POST,COOKIE 这三个变量.GET变量是附在 url 后传输的,而 POST 变量是放在 http 包中传输的,COOKIE 则是浏览 ...
- UVA11389巴士司机问题
题意: 有n个巴士司机,然后有2n个活,其中有n个是上午,n个是下午,每个自己都要选择一个上午的和一个下午的,每个活都有驾驶距离,如果一个司机每天的驾驶距离大于d,那么超出的部分就要每个单 ...
- Linux下 sudo命令
平常使用Linux的时候,都是用普通用户登录执行命令,但是有些命令需要root权限才能执行,如果切换到root用户去执行,就需要输入root密码,为了系统的安全性,应该尽可能少的直接在终端上输入roo ...