前言

NacosAP模式源码分析目录

Nacos源码结构介绍

Nacos版本基于1.4.0版本,整体的项目结构如下:


看到目录,第一眼的感觉就是职责分明,给人的感觉就是高手,关于源码部分我也没全看完,目前只是注册中心相关看完了,配置中心的就是略微看了一下,我先给大家介绍下重点的模块的作用的,到时候大家再结合上面几篇文章去理解源码:

  1. address模块: 主要查询nacos集群中节点个数以及IP的列表;
  2. api模块: 主要给客户端调用的api接口的抽象;
  3. client模块: 主要是对依赖api模块和common模块,对api的接口的实现,给nacos的客户端使用;
  4. cmdb模块: 主要是操作的数据的存储在内存中,该模块提供一个查询数据标签的接口;
  5. config模块: 主要是服务配置的管理, 提供api给客户端拉去配置信息,以及提供更新配置 的,客户端通过长轮询的更新配置信息.数据存储是Mysql;
  6. naming模块: 主要是作为服务注册中心的实现模块,具备服务的注册和服务发现的功能;
  7. console模块: 主要是实现与前端进行交互.具有权限校验、服务状态、健康检查等功能;
  8. 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本身是不可靠的,不能保证所有的变更信息都可以同步到客户端,所以消费者还有一个定时任务的兜底机制;

谈谈收获

看完这部分源码收获我觉得主要有两方面的收获:

技术方面

技术方面的收获的是最多的,这里简单聊几个例子:

  1. 从整体的框架的设计,还是到模块中类实现的设计,单一原则体现的淋淋尽致,下图是整体框架设计,体现到代码上就是每个模块职责很清晰,依赖关系很明确,另外框架层面的做的插件化的思想、高可用的思想,都是我们可以借鉴学习的;
  2. 很多技术细节的实现很精妙,比如服务变更时候的异步队列的设计、CopyOnWrite的思想、Spring事件机制的应用等等,这些都在我的博客中源码分析的细节中讲到,大家可以稍微花一些功夫看看;
写作方面

这部分其实还没形成一个完整的思想,只是初步的一个思考,关于这种源码分析的,以后会采用以下方式:

  1. 框架选型的思考, 分析类似中间件对比;
  2. 框架搭建和使用介绍;
  3. 源码代码模块介绍和框架模块功能性的描述,类似就是做一个整体功能介绍;
  4. 每个模块功能源码的分析,附带时序图和类图关系,后面我会对Nacos系列的文章的内容进行一个改造;
  5. 完成每个模块的介绍以后会统一做代码的整体关键步骤的源码分析图和总结;

结束

欢迎大家点点关注,点点赞!

Nacos源码结构和AP模式注册中心实现介绍的更多相关文章

  1. [源码阅读] 阿里SOFA服务注册中心MetaServer(1)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(1) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(1) 0x00 摘要 0x01 服务注册中心 1.1 服务注册中心简 ...

  2. [源码阅读] 阿里SOFA服务注册中心MetaServer(2)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(2) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(2) 0x00 摘要 0x01 MetaServer 注册 1.1 ...

  3. [源码阅读] 阿里SOFA服务注册中心MetaServer(3)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(3) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(3) 0x00 摘要 0x01 概念 1.1 分布式一致性 1.2 ...

  4. SpringCloud 源码系列(3)—— 注册中心 Eureka(下)

    十一.Eureka Server 集群 在实际的生产环境中,可能有几十个或者几百个的微服务实例,Eureka Server 承担了非常高的负载,而且为了保证注册中心高可用,一般都要部署成集群的,下面就 ...

  5. SpringCloud 源码系列(1)—— 注册中心 Eureka(上)

    Eureka 是 Netflix 公司开源的一个服务注册与发现的组件,和其他 Netflix 公司的服务组件(例如负载均衡.熔断器.网关等)一起,被 Spring Cloud 整合为 Spring C ...

  6. Dubbo源码学习总结系列七---注册中心

    Dubbo注册中心是框架的核心模块,提供了服务注册发现(包括服务提供者.消费者.路由策略.覆盖规则)的功能,该功能集中体现了服务治理的特性.该模块结合Cluster模块实现了集群服务.Dubbo管理控 ...

  7. SpringCloud 源码系列(2)—— 注册中心 Eureka(中)

    五.服务注册 1.实例信息注册器初始化 服务注册的代码位置不容易发现,我们看 DiscoveryClient 初始化调度任务的这个方法,这段代码会去初始化一个实例信息复制器 InstanceInfoR ...

  8. Nacos源码深度解析1-服务注册初始化(客户端)

    一.初始化 NamingService naming = NamingFactory.createNamingService(properties); 二.通过反射传入properties生成Naco ...

  9. Nacos源码系列—关于服务注册的那些事

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 nacos,即可免费获取源码 简介 首先我们在看Nacos源码之前,要 ...

随机推荐

  1. JDBC_08_解决SQL注入问题 (登录和注册)

    解决SQL注入问题 只要用户提供的信息不参与sql语句的编译过程,那么尽管用户输入的信息中含有sql关键字那么也不会起作用了 要想使用户提供信息不参与sql语句的编译过程,那么必须使用 java.sq ...

  2. python 迭代器,生成器,表达式

    1.迭代器 (1)什么是迭代器: #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复, ...

  3. ingress controller 和ingress使用实例

    ingress controller安装 k8s集群版本:1.15+ 官方文档: https://kubernetes.github.io/ingress-nginx/ 创建基础配置 kubectl ...

  4. 计算机网络-已知IP地址和子网掩码,求广播地址

    首先说结论--广播地址=该IP所在的下一跳-1 例题: 已知IP地址是192.72.20.111,子网掩码是255.255.255.224,求广播地址 要知道下一跳就需要先求出网段间隔,网段间隔=25 ...

  5. git Windows下重命名文件,大小写敏感问题

    作为一个重度强迫症患者,是不忍受文件名,有字母大小拼写错误的,但是在git下,已是受控版本文件要改过来,要费些周章了. 一.环境 Widnows + git version 2.24.0 + Tort ...

  6. 判断post,ajax,get请求的方法

    判断post,ajax,get请求的方法 define('IS_GET',isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] ...

  7. css3动画大全

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. PAT 乙级 -- 1001 -- 害死人不偿命的(3n+1)猜想

    题目: 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年 ...

  9. Mac/Win录屏工具推荐-LICEcap

    轻小.便捷.操作简单 下载 LICEcap v1.30 for macOS LICEcap v1.28 for Windows 参考地址

  10. Nginx解决跨域问题(CORS)

    跨域 解决跨域问题一般有两种思路: CORS 在后端服务器设置 HTTP 响应头,把你需要运行访问的域名加入加入 Access-Control-Allow-Origin中. jsonp 把后端根据请求 ...