Nacos注册中心源码剖析

文章目录

    • Nacos核心功能源码架构图
    • Nacos服务端源码单机运行
      • 源码单机运行
      • 源码集群运行
      • Nacos 1.4.X 注册中心CP架构Raft源码剖析
        • 集群数据一致性(持久化实例CP模式Raft协议实现)
        • 注册中心CAP架构剖析
    • Nacos 2.X 核心架构源码剖析
      • grpcClient初始化源码剖析
      • grpcServer启动源码剖析
      • 配置中心源码分析
        • nacos config client源码分析
          • 获取配置
          • 注册监听器
        • nacos config server源码分析
          • 配置dump
          • 配置发布

为什么要看源码 描述
提升技术功底 学习源码里的优秀设计思想,比如一些疑难问题的解决思路,还有一些优秀的设计模式,整体提升自己的技术功底
深度掌握技术框架 源码看多了,对于一个新技术或框架的掌握速度会有大幅提升,看下框架demo大致就能知道底层的实现,技术 框架更新再快也不怕
快速定位线上问题 遇到线上问题,特别是框架源码里的问题(比如bug),能够快速定位,这就是相比其他没看过源码的人的优势
对面试大有裨益 面试一线互联网公司对于框架技术一般都会问到源码级别的实现
知其然知其所以然 对技术有追求的人必做之事,使用了一个好的框架,很想知道底层是如何实现的
拥抱开源社区 参与到开源项目的研发,结识更多大牛,积累更多优质人脉
看源码方法 描述
先使用 先看官方文档快速掌握框架的基本使用
抓主线 找一个demo入手,顺藤摸瓜快速静态看一遍框架的主线源码,画出源码主流图,切勿一开始就陷入源码的细枝末节,否 则会把自己绕晕,凭经验猜
画图做笔记 总结框架的一些核心功能点,从这些功能点入手深入到源码的细节,边看源码边画源码走向图,并对关键源码的理解 做笔记,把源码里的闪光点都记录下来,后续借鉴到工作项目中,理解能力强的可以直接看静态源码,也可以边看源码边debug码执 行过程,观察一些关键变量的值
整合总结 所有功能点的源码都分析完后,回到主流程图再梳理一遍,争取把自己画的所有图都在脑袋里做一个整合

Nacos核心功能源码架构图

Nacos注册中心源码剖析_第1张图片
Nacos服务注册表结构:Map>
Nacos注册中心源码剖析_第2张图片
举例说明:
Nacos注册中心源码剖析_第3张图片

Nacos服务端源码单机运行

# 下载nacos源码
git clone https://github.com/alibaba/nacos.git

**选择Tag 1.4.1版本 **
源码整体结构(注意,nacos源码导入要求maven 3.2.5以上版本):
Nacos注册中心源码剖析_第4张图片

源码单机运行

直接运行console模块里的 com.alibaba.nacos.Nacos.java

 # 增加启动vm参数
 ‐Dnacos.standalone=true

Nacos注册中心源码剖析_第5张图片

源码集群运行

nacos集群需要配置mysql存储,需要先创建一个数据,名字随便取,然后执行 distribution/conf 目录下的 nacos-mysql.sql 脚本, 然后修改 console\src\main\resources 目录下的 application.properties 文件里的mysql配置,如下所示:

### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

运行console模块里的 com.alibaba.nacos.Nacos.java,需要增加启动vm参数端口号和实例运行路径nacos.home(对应的目录需要自 己提前创建好),每台server的nacos.home目录里需要创建一个conf文件夹,里面放一个cluster.conf文件,文件里需要把所有集群机 器ip和端口写入进去,见下图:
image.png
Nacos注册中心源码剖析_第6张图片

Nacos 1.4.X 注册中心CP架构Raft源码剖析

集群数据一致性(持久化实例CP模式Raft协议实现)

Nacos注册中心源码剖析_第7张图片

注册中心CAP架构剖析

Nacos注册中心源码剖析_第8张图片

Nacos 2.X 核心架构源码剖析

Nacos 2.X 核心架构源码剖析
Nacos 2.X grpcClient初始化源码剖析
Nacos 2.X grpcServer启动源码剖析

grpcClient初始化源码剖析

Nacos注册中心源码剖析_第9张图片

grpcServer启动源码剖析

Nacos注册中心源码剖析_第10张图片

配置中心源码分析


Nacos配置中心实战&源码分析

nacos config client源码分析

配置中心核心接口ConfigService
Nacos注册中心源码剖析_第11张图片

获取配置

获取配置的主要方法是 NacosConfigService 类的 getConfig 方法,通常情况下该方 法直接从本地文件中取得配置的值,如果本地文件不存在或者内容为空,则再通过grpc从 远端拉取配置,并保存到本地快照中
Nacos注册中心源码剖析_第12张图片

注册监听器

配置中心客户端会通过对配置项注册监听器达到在配置项变更的时候执行回调的功能

ConfigService#getConfigAndSignListener
ConfigService#addListener

Nacos 可以通过以上方式注册监听器,它们内部的实现均是调用 ClientWorker 类的addCacheDataIfAbsent。其中 CacheData 是一个维护配置项和其下注册的所有监听器 的实例,所有的 CacheData 都保存在 ClientWorker 类中的原子 cacheMap 中,其内部 的核心成员有:
Nacos注册中心源码剖析_第13张图片

nacos config server源码分析

配置dump

Nacos注册中心源码剖析_第14张图片
服务端启动时就会依赖 DumpService 的 init 方法,从数据库中 load 配置存储在本地 磁盘上,并将一些重要的元信息例如 MD5 值缓存在内存中。服务端会根据心跳文件中保存 的最后一次心跳时间,来判断到底是从数据库 dump 全量配置数据还是部分增量配置数据 (如果机器上次心跳间隔是 6h 以内的话)。
全量 dump 当然先清空磁盘缓存,然后根据主键 ID 每次捞取一千条配置刷进磁盘和 内存。增量 dump 就是捞取最近六小时的新增配置(包括更新的和删除的),先按照这批 数据刷新一遍内存和文件,再根据内存里所有的数据全量去比对一遍数据库,如果有改变的 再同步一次,相比于全量 dump 的话会减少一定的数据库 IO 和磁盘 IO 次数。

配置发布

发布配置的代码位于 ConfigController#publishConfig中。集群部署,请求一开始也 只会打到一台机器,这台机器将配置插入Mysql中进行持久化。服务端并不是针对每次配置 查询都去访问 MySQL ,而是会依赖 dump 功能在本地文件中将配置缓存起来。因此当单台机器保存完毕配置之后,需要通知其他机器刷新内存和本地磁盘中的文件内容,因此它会 发布一个名为 ConfigDataChangeEvent 的事件,这个事件会通过grpc调用通知所有集群节点(包括自身),触发本地文件和内存的刷新。
Nacos注册中心源码剖析_第15张图片

你可能感兴趣的:(Spring,Cloud,Alibaba,java,面试,开发语言)