Nacos注册中心源码剖析

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

Nacos核心功能源码架构图

Nacos核心功能源码架构图.png
Nacos服务注册表结构:Map<namespace, Map<group::serviceName, Service>>
Nacos服务注册表结构.png
举例说明:
举例.png

Nacos服务端源码单机运行

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

**选择Tag 1.4.1版本 **
源码整体结构(注意,nacos源码导入要求maven 3.2.5以上版本):
image.png

源码单机运行

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

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

image.png

源码集群运行

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
image.png

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

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

Nacos源码剖析-集群数据一致性(持久化实例CP模式Raft协议实现).jpg

注册中心CAP架构剖析

注册中心CAP架构剖析.jpg

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

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

grpcClient初始化源码剖析

Nacos 2.X grpcClient初始化源码剖析(下)1.png

grpcServer启动源码剖析

Nacos 2.X grpcServer启动源码剖析(下)2.png

配置中心源码分析

Nacos2.1.0配置中心源码分析(1).png
Nacos配置中心实战&源码分析

nacos config client源码分析

配置中心核心接口ConfigService
image.png

获取配置

获取配置的主要方法是 NacosConfigService 类的 getConfig 方法,通常情况下该方 法直接从本地文件中取得配置的值,如果本地文件不存在或者内容为空,则再通过grpc从 远端拉取配置,并保存到本地快照中
image.png

注册监听器

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

ConfigService#getConfigAndSignListener
ConfigService#addListener

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

nacos config server源码分析

配置dump

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

配置发布

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值