nacos核心源码深度剖析

文章目录

  • 一、nacos1.4.1版本:服务注册与发现架构原理
    • 1、基本原理
    • 2、Nacos&Ribbon&Feign核心微服务架构图
    • 3、Nacos架构图
    • 4、核心功能点
    • 5、核心功能源码分析
      • (1)客户端注册逻辑
      • (2)服务端注册接口
      • (3)客户端获取服务列表
      • (4)心跳机制
      • (5)服务端主动推送机制
      • (6)集群注意事项
      • (7)集群节点状态同步
      • (8)集群服务状态变动同步
      • (9)服务新增状态同步
      • (10)nacos集群新节点拉取其他节点数据
      • (11)整体架构图
    • 6、Nacos服务注册表结构
    • 7、源码导入
    • 8、CP架构以及Raft协议
  • 二、Nacos2.x版本:服务注册与发现源码解析
    • 1、Nacos 2.X 核心架构源码剖析
    • 2、Nacos 2.X grpcClient初始化源码剖析
    • 3、Nacos 2.X grpcServer启动源码剖析
    • 4、总结
  • 三、Nacos2.1.0版本:配置中心源码
    • 1、Nacos2.1.0配置中心源码分析
    • 2、获取配置
    • 3、注册监听器
    • 4、 nacos config server源码分析
    • 5、配置发布
    • 6、客户端监听器

一、nacos1.4.1版本:服务注册与发现架构原理

1、基本原理

1、微服务系统在启动时将自己注册到服务注册中心,同时外发布 Http 接口供其它系统调用(一般都是基于SpringMVC)
2、服务消费者基于 Feign 调用服务提供者对外发布的接口,先对调用的本地接口加上注解@FeignClient,Feign会针对加了该注解的接口生成动态代理,服务消费者针对 Feign 生成的动态代理去调用方法时,会在底层生成Http协议格式的请求,类似 /stock/deduct?productId=100
3、Feign 最终会调用Ribbon从本地的Nacos注册表的缓存里根据服务名取出服务提供在机器的列表,然后进行负载均衡并选择一台机器出来,对选出来的机器IP和端口拼接之前生成的url请求,生成调用的Http接口地址http://192.168.0.60:9000/stock/deduct?productId=100,最后基于HTTPClient调用请求

2、Nacos&Ribbon&Feign核心微服务架构图

在这里插入图片描述

3、Nacos架构图

在这里插入图片描述

4、核心功能点

服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。

服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。

服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)

服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。

5、核心功能源码分析

(1)客户端注册逻辑

相当于直接调用http请求,调用了nacos服务端的httpApi。

(2)服务端注册接口

通过http接口,接受注册方信息,存到注册表(多重Map)。
使用阻塞队列,异步注册。
写时复制,使用读写分离的思想。
在这里插入图片描述

在这里插入图片描述

(3)客户端获取服务列表

客户端在本地缓存了一个Map,如果Map中没有,会调用nacosAPI获取服务列表,并存到Map缓存中。
并开启一个定时任务,定时从nacos拉取服务列表,并更新Map。

(4)心跳机制

客户端注册实例之后,如果是临时实例,服务端会添加一个BeatInfo,启动一个定时任务,会定时5S的往nacos服务端发送心跳请求/nacos/v1/ns/instance/beat

服务端收到心跳之后,会更新服务最新的心跳时间。后台有个定时任务,会判断上一次心跳时间,如果超过15秒,就会设置为不健康状态,超过30秒,就会剔除该服务。
在这里插入图片描述
在这里插入图片描述
nacos集群中,只需要有一台nacos服务器做心跳健康检查即可:
也就是说,会根据服务名称,根据hash运算+服务器数量取模,只有符合标准才会判断健康检查。
检查完毕之后,通知给集群中其他nacos。
(nacos集群之间也有心跳)
在这里插入图片描述

在这里插入图片描述

(5)服务端主动推送机制

nacos服务端,服务ip列表有变化时,会发送一个事件:
在这里插入图片描述
这个事件中,会往客户端发送udp请求,把信息发给客户端。
(在服务注册发现时,客户端会发给服务端自己的udp端口)

(6)集群注意事项

注意,集群需要配置mysql。

(7)集群节点状态同步

ServerListManager是一个Component,启动时会加载:
在这里插入图片描述
会定时给其他nacos服务发送心跳。

(8)集群服务状态变动同步

当服务状态有变化时,会通知给集群中其他nacos服务。
ServiceManager中:还是会起一个定时任务进行同步。
在这里插入图片描述

(9)服务新增状态同步

有服务实例注册,并不是通过定时任务同步的,而是新增后,往一个Map里放一个任务,然后还是通过定时任务,进行同步:
拿到集群中,除了自己以外所有的节点,进行同步。

在这里插入图片描述
在这里插入图片描述

(10)nacos集群新节点拉取其他节点数据

在这里插入图片描述

(11)整体架构图

在这里插入图片描述

6、Nacos服务注册表结构

Map<namespace, Map<group::serviceName, Service>>
在这里插入图片描述
举例说明:
在这里插入图片描述

7、源码导入

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

选择Tag 1.4.1版本
源码整体结构(注意,nacos源码导入要求maven 3.2.5以上版本):
在这里插入图片描述

8、CP架构以及Raft协议

nacos主要是AP架构。(配置的ephemeral默认是true,就是AP架构,设置为false就是CP架构,即注册的节点是否是临时节点)
也就是说,既可以注册临时节点也可以注册持久化节点。最好是选择AP架构,使用临时节点。

查看Raft协议的动图网站:http://thesecretlivesofdata.com/raft/

注意!nacos集群架构,注册信息持久化是写在文件中的。配置信息持久化是写在mysql中的。

在这里插入图片描述
在这里插入图片描述
半数以上节点同步:
在这里插入图片描述

二、Nacos2.x版本:服务注册与发现源码解析

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

在这里插入图片描述

2、Nacos 2.X grpcClient初始化源码剖析

在这里插入图片描述

3、Nacos 2.X grpcServer启动源码剖析

在这里插入图片描述

4、总结

2.x版本:同一个服务下,节点必须是相同的(临时/非临时)。

nacos2.0使用大量的事件驱动方式
在这里插入图片描述

临时实例,使用了GRPC,持久化实例几乎没人用:
在这里插入图片描述

三、Nacos2.1.0版本:配置中心源码

1、Nacos2.1.0配置中心源码分析

在这里插入图片描述
配置中心核心接口ConfigService
在这里插入图片描述

2、获取配置

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

3、注册监听器

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

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

4、 nacos config server源码分析

配置dump
在这里插入图片描述
服务端启动时就会依赖 DumpService 的 init 方法,从数据库中 load 配置存储在本地磁盘上,并将一些重要的元信息例如 MD5 值缓存在内存中。服务端会根据心跳文件中保存的最后一次心跳时间,来判断到底是从数据库 dump 全量配置数据还是部分增量配置数据(如果机器上次心跳间隔是 6h 以内的话)。

全量 dump 当然先清空磁盘缓存,然后根据主键 ID 每次捞取一千条配置刷进磁盘和内存。增量 dump 就是捞取最近六小时的新增配置(包括更新的和删除的),先按照这批数据刷新一遍内存和文件,再根据内存里所有的数据全量去比对一遍数据库,如果有改变的再同步一次,相比于全量 dump 的话会减少一定的数据库 IO 和磁盘 IO 次数。

5、配置发布

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

6、客户端监听器

客户端将所有的dataId各自绑定一个监听器,当nacos上有配置变更,会刷新Environment、RefreshScope中的数据。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python:机器学习特征优选

作者&#xff1a;CSDN _养乐多_ 在Python中进行机器学习特征选择的方法有很多种。以下是一些常用的方法&#xff1a; 过滤法&#xff08;Filter Methods&#xff09;&#xff1a;通过统计方法或者相关性分析来评估每个特征的重要性&#xff0c;然后选择最相关的特征。常用的…

【0DAY】瑞友天翼应用虚拟化系统index.php接口处存在SQL注入漏洞导致程RCE

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

和comate一起,用JavaScript实现一个简易版五子棋小游戏

前言 五子棋起源于中国&#xff0c;是全国智力运动会竞技项目之一&#xff0c;是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子&#xff0c;下在棋盘直线与横线的交叉点上&#xff0c;先形成五子连珠者获胜。 这次和Baidu Comate智能代码助手共同完成这个小游戏…

HarmonyOS NEXT应用开发之多模态页面转场动效实现案例

介绍 本示例介绍多模态页面转场动效实现&#xff1a;通过半模态转场实现半模态登录界面&#xff0c; 与全屏模态和组件转场结合实现多模态组合登录场景&#xff0c;其中手机验证码登录与账号密码登录都为组件&#xff0c; 通过TransitionEffect.move()实现组件间转场达到近似页…

Linux入门攻坚——22、通信安全基础知识及openssl、CA证书

Linux系统常用的加解密工具&#xff1a;OpenSSL&#xff0c;gpg&#xff08;是pgp的实现&#xff09; 加密算法和协议&#xff1a; 对称加密&#xff1a;加解密使用同一个秘钥&#xff1b; DES&#xff1a;Data Encryption Standard&#xff0c;数据加密标准&…

meshlab: pymeshlab保存物体的横截面(compute planar section)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 # pymeshlab需要导入&#xff0c;其一般被命名为ml import pymeshlab as ml# 本案例所…

05.添加自定义触发器

添加自定义触发器 在系统中找到一个用户登录数量的监控项&#xff0c;用该监控项作为参考实例 测试监控项取值&#xff0c;2代表为登录系统终端数量 创建触发器 表达式设置条件&#xff0c;选择对应的监控项&#xff0c;根据对应的功能函数&#xff0c;在选择触发的结果 添…

简洁大气APP下载单页源码

源码介绍 简洁大气APP下载单页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 效果截图 源码下载 简洁大气APP下载单页源码

Jenkins +配置邮件 centos8.5 安装部署 运维系列一

1 jenkins的war包下载地址: Download and deploy 2 xftp 等方式上传到服务器 #安装jdk tar zxvf jdk-11.0.8_linux-x64_bin.tar.gz mv jdk-11.0.8/ /usr/local/jdk vim /etc/profile export JAVA_HOME/usr/local/jdk export PATH$JAVA_HOME/bin:$PATH CLASSPATH.:$JAVA_…

中国居民消费新特征:中枢回落,即时满足,去地产化

随着收入预期和财富效应的转变&#xff0c;居民更倾向于通过短期集中式的消费来获得即时满足的快乐&#xff0c;服务消费表现出了更强的韧性。服务消费强于商品消费、消费去地产化、汽车挑大梁的特征延续。 特征一&#xff1a;消费倾向高于2020-22年&#xff0c;低于2017-19年…

libcity笔记:详细流程(以DeepMove为例)

1 主调用 python run_model.py --task traj_loc_pred --model DeepMove --dataset gowalla --batch_size5有task、dataset、model三个必须命令行参数batch_size一个可选命令行参数没有confg_file 1.1 libcity/utils/argument_list.py/str2bool 将字符串表示的布尔值转换为 Pyt…

结合kimi chat的爬虫实战思路

背景 想钻研一下项目组件&#xff0c;找找之后的学习方向。不能自以为是&#xff0c;所以借着网开源项目网站上公布的项目内容看一下&#xff0c;那些是我可以努力去学习的&#xff08;入门的&#xff09;。首先需要获取相关内容&#xff0c;于是爬取整理。 任务1&#xff1a…

操作系统实战(二)(linux+C语言)

实验内容 通过Linux 系统中管道通信机制&#xff0c;加深对于进程通信概念的理解&#xff0c;观察和体验并发进程间的通信和协作的效果 &#xff0c;练习利用无名管道进行进程通信的编程和调试技术。 管道pipe是进程间通信最基本的一种机制,两个进程可以通过管道一个在管道一…

[Linux] git工具的安装和使用

目录 前言 安装 1.构建仓库 2.将仓库克隆到本地 使用 1.三板斧 1.git add 新增 2.git commit 提交 3.git push 推送 2.常用指令 前言 git 是一个代码托管平台&#xff0c;它的创始人是大名鼎鼎的 Linux 之父&#xff1a; 林纳斯托瓦兹&#xff0c;git的诞生可以使我们对…

解释 RESTful API 以及如何使用它构建 web 应用程序

RESTful API&#xff08;Representational State Transfer&#xff09;是一种设计风格&#xff0c;用于创建网络应用程序的 API。它基于HTTP协议&#xff0c;通过使用标准的HTTP方法&#xff08;如GET、POST、PUT和DELETE&#xff09;来实现对资源的操作。 RESTful API的设计原…

python turtle

名字动画 #SquareSpiral1.py import turtle t turtle.Pen() turtle.bgcolor("black")my_nameturtle.textinput("输入你的姓名","你的名字&#xff1f;") colors["red","yellow","purple","blue"] for…

金融业开源软件应用 管理指南

金融业开源软件应用 管理指南 1 范围 本文件提供了金融机构在应用开源软件时的全流程管理指南&#xff0c;对开源软件的使用和管理提供了配套 组织架构、配套管理规章制度、生命周期流程管理、风险管理、存量管理、工具化管理等方面的指导。 本文件适用于金融机构规范自身对开…

Redis 入坑基本指南

引言 本指南将帮助您了解如何安装、配置和基本使用 Redis。Redis 是一款开源的高性能键值存储系统&#xff0c;可用于缓存、数据库、消息中间件等多种用途。 1. 安装 Redis a. 下载 Redis&#xff1a; 可以从 Redis 官方网站&#xff08;https://redis.io&#xff09;下载最…

课程作业管理系统,基于 SpringBoot+Vue+MySQL 开发的前后端分离的课程作业管理系统设计实现

目录 一. 前言 二. 功能模块 2.1. 管理员功能模块 2.2. 教师功能模块 2.3. 学生功能模块 三. 部分代码实现 四. 源码下载 一. 前言 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势…

shell脚本编写-测试同一网段内主机是否在线

除了可以使用ansible自动化运维工具判断主机是否在线以外&#xff0c;还可以通过编写Shell脚本来实现。 1、编写脚本 #! /bin/bash #测试192.168.81.0/24网段中哪些主机处于开机状态&#xff0c;哪些主机处于关机状态# #方法一&#xff1a;使用for循环判断 # for i in {1..25…