Nacos注册中心AP模式核心源码分析(集群模式)

文章目录

  • 概述
  • 一、客户端新注册实例信息在集群间同步
  • 二、服务端集群节点信息在集群间同步
    • 2.1、DistroMapper
    • 2.2、ProtocolManager
    • 2.3、ServerListManager
    • 2.4、RaftPeerSet
  • 三、客户端实例状态信息在集群间同步
  • 四、服务端新节点上线同步集群数据


概述

  在Nacos集群模式下,客户端可以选择注册在集群中的某一台机器上:

server:port: 9002
spring:application:name: stock-servicecloud:nacos:discovery:# 指定nacos server的地址server-addr: localhost:8847# 指定集群名称cluster-name: njmetadata:version: v3#ephemeral: falsenamespace: public

  当客户端启动完成后,集群中8847所在的服务端,首先获取到了客户端实例,随后88678857也同步获取到了客户端实例 。
在这里插入图片描述
  这里就牵涉到两个问题:

  1. 客户端只向集群中的某一台机器进行了注册,集群中的其他节点是如何感知到的?
  2. 如果客户端下线,或者健康状态发生改变,其他节点又是如何同步的?

  也就是文中的四点:

  • 客户端启动,注册实例到集群中的某个节点,该注册信息在整个集群中的同步。
  • 客户端实例状态信息发生改变,在集群间同步。
  • 服务端集群节点状态信息在集群间同步。
  • 服务端新上线的节点,同步集群中的节点信息。

一、客户端新注册实例信息在集群间同步

  当客户端发起注册实例的请求,到达服务端后,在DistroConsistencyServiceImpl#put方法中,除了单机模式下将实例信息放入阻塞队列之外,集群模式下还需要进行同步。默认的延迟时间是1s。
在这里插入图片描述
  在sync方法中,首先会去创建一个DistroDelayTask任务实例,然后放入NacosDelayTaskExecuteEngine中。该类是Nacos自己实现的延迟任务执行引擎。这里的套路就和注册实例信息一样,首先将实例放入队列中,然后再由其他线程异步获取并执行逻辑。
在这里插入图片描述
  最终调用到的是DistroSyncChangeTask#run方法,同样是发起http请求,通知集群中的其他节点,如果返回失败,还会进行重试:
在这里插入图片描述
在这里插入图片描述
  访问的是服务端的/distro/datum:
在这里插入图片描述
  请求发送到服务端的DistroControlleronSyncDatum
在这里插入图片描述
  最终执行onPut方法,将实例信息放入队列中。
在这里插入图片描述

二、服务端集群节点信息在集群间同步

  如果集群中的某个节点宕机了,或者集群启动,那么集群之间需要同步状态信息,是通过registerServerStatusReporter定时任务实现的,默认2s一次。
在这里插入图片描述
  真正执行逻辑的是ServerStatusReporterrun方法中的synchronizer.send
在这里插入图片描述
  同样是发送http请求,通知其他节点,调用的是OperatorController/server/status接口。
在这里插入图片描述
  为了观察集群中某个节点下线后,其他节点是如何同步状态的,手动模拟某个节点下线:
在这里插入图片描述
  在onReceiveServerStatus方法中,首先会对传入的configInfo参数进行一系列的处理,获取IP端口,权重等信息,然后调用 memberManager.update(server);方法。
在这里插入图片描述
  update方法,如果当前节点的状态已经是DOWN,就会直接从memberAddressInfos中删除该实例信息:
在这里插入图片描述
  并且在实例信息有改变的情况下,还会通过notifyMemberChange();方法去发布一个事件:
在这里插入图片描述
  实际上该事件是放在DefaultPublisherqueue属性中的,该属性是一个阻塞队列。
在这里插入图片描述
  真正处理该事件的方法,是DefaultPublisher的run方法:
在这里插入图片描述
  receiveEvent又调用了notifySubscriber,这里的subscribers订阅者有四个,这四个订阅者都是MemberChangeListener的子类
在这里插入图片描述

2.1、DistroMapper

  DistroMapperonEvent,主要的用途是用于Distro一致性协议中的数据同步路由。在该方法中,主要完成了三件事:

  1. 选出健康节点,并生成节点 IP 列表。
  2. 排序节点列表,确保顺序一致。
  3. 替换旧的健康节点列表。

在这里插入图片描述
  当 Nacos 集群成员发生变化时,DistroMapper 会自动更新健康节点列表,并保持节点顺序一致,保障 AP 模式下的数据同步路由稳定运行。

2.2、ProtocolManager

  ProtocolManageronEvent用于当集群成员列表发生变化时,分别通知 AP 协议组件(Distro)和 CP 协议组件(Raft),以更新它们各自的一致性成员信息,启用不同的线程进行处理。ProtocolManager 是这两种协议的统一协调者。
在这里插入图片描述

2.3、ServerListManager

  ServerListManageronEvent用于接收到成员列表变更事件后,直接用最新的成员列表替换本地的servers列表。ServerListManager 是用于维护当前 Nacos 节点所感知的集群服务器列表的,会被其他组件依赖:

  • 服务注册、发现时选择服务器;
  • 启动时检查集群节点是否就绪;
  • 分布式协议中做心跳/同步时依据节点列表操作

在这里插入图片描述

2.4、RaftPeerSet

  RaftPeerSetonEvent用于Naocs CP模式下的raft算法,在该方法中,主要完成了:

  • 获取当前的最新成员列表, 和上一次的成员列表比较,找出新增或变更的节点。
  • 如果成员发生了变化(比如新节点加入或节点 IP 变化),通知 Raft 协议层更新 投票成员列表
  • 更新缓存,记录最新的集群节点状态
    在这里插入图片描述

三、客户端实例状态信息在集群间同步

  这里利用到的是scheduleServiceReporter定时任务。默认一分钟执行一次。
在这里插入图片描述
  真正执行逻辑的是ServiceReporterrun方法:
在这里插入图片描述
  distroMapper.responsible(serviceName)是关键代码,该方法主要用于判断当前节点是否负责处理某个服务(serviceName) 的数据同步和持久化

  • 获取当前 Nacos 集群中所有 健康的节点地址。
  • 如果 Distro 没启用,或者是单机模式,直接返回 true,所有服务都由自己负责。
  • 健康节点列表为空,表示 Distro 还没初始化好,此时不能确定责任关系。
  • 获取当前节点在健康节点列表中的索引。
  • 用服务名做 Hash,然后和健康节点数量取模,得到这个服务应由哪个节点处理(索引)。
  • 判断这个 target 索引,是否属于当前节点。

在这里插入图片描述
  同样是发送http请求,通知其他节点,调用的是ServiceControllerserviceStatus方法,主要用于验证当前服务节点的服务信息是否和其他节点保持一致。
在这里插入图片描述
  在ServiceControllerserviceStatus方法中,如果发现服务状态有变化,则会调用addUpdatedServiceToQueue方法,向阻塞队列中存入信息:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
  UpdatedServiceProcessor的run方法,再次开启任务:
在这里插入图片描述
  所以最终执行逻辑的是ServiceUpdaterrun
在这里插入图片描述
  实例的健康状态发生了改变:
在这里插入图片描述
  发布事件,被实现了ApplicationListener<ServiceChangeEvent>的实现类监听,最终通过udp协议,推送给客户端。
在这里插入图片描述


  在集群模式下,服务端检查心跳的定时任务,实际上也是由集群中的某一个节点去完成的
在这里插入图片描述
  这里就是利用了上面提到的hash算法,不满足条件的节点直接return,不会执行心跳检查任务。

四、服务端新节点上线同步集群数据

  上线的新节点,需要从其他节点同步数据,是通过DistroLoadDataTask任务实现的:
在这里插入图片描述
  在load方法中:

  • 首先获取集群中除了自己的其他节点。如果没有获取到,就会阻塞等待。
  • 如果还没有注册任何数据类型,同样阻塞等待。
  • 从其他 Nacos 节点获取数据快照;

在这里插入图片描述
  然后循环调用loadAllDataSnapshotFromRemote方法,该方法有两个关键操作:

  • 根据地址调用DistroController/distro/datums接口,获取数据。
  • 将数据写入内存中。
    在这里插入图片描述

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

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

相关文章

vscode和cursor对ubuntu22.04的remote ssh和X-Windows的无密码登录

这里写自定义目录标题 写在前面需求的描述问题的引出 昨天已使能自动登录上午我的改变UBUNTU 22.04关闭密码规则一&#xff1a;修改 /etc/pam.d/common-password 文件二&#xff1a;修改 /etc/security/pwquality.conf 文件方法三&#xff1a;禁用 pam_pwquality.so 模块 vscod…

论文阅读:基于增强通用深度图像水印的混合篡改定位技术 OmniGuard

一、论文信息 论文名称:OmniGuard: Hybrid Manipulation Localization via Augmented Versatile Deep Image Watermarking作者团队:北京大学发表会议:CVPR2025论文链接:https://arxiv.org/pdf/2412.01615二、动机与贡献 动机: 随着生成式 AI 的快速发展,其在图像编辑领…

一周学会Pandas2 Python数据处理与分析-NumPy数组创建

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili NumPy数组创建最常用的方式是直接创建&#xff0c; numpy 可以直接创建或者将 python的其他元素转为 array 对象。 下…

【全球首发】DeepSeek谷歌版1.1.5 - 免费GPT-4级别AI工具

【全球首发】DeepSeek谷歌版1.1.5 - 免费GPT-4级别AI工具 资源简介 DeepSeek谷歌版1.1.5是目前全球领先的免费AI助手&#xff0c;性能超越国内主流AI产品&#xff0c;提供类似GPT-4的智能体验。 版本信息 最新版本&#xff1a;1.1.5&#xff08;2024最新版&#xff09;应用…

小程序29-事件穿参-mark 自定义数据

小程序进行事件传参的时候&#xff0c;除了使用 data-*属性 传递参数外&#xff0c;还可以 使用 mark 标记传递参数 mark 是一种自定义属性&#xff0c;可以在组件上添加&#xff0c;用于来识别具体触发事件的 target 节点。同时 mark 还可以用于承载一些自定义数据 在组件上使…

高级:分布式系统面试题精讲

一、引言 分布式系统在现代软件开发中占据重要地位&#xff0c;其设计和实现需要考虑多个关键因素。面试官通过相关问题&#xff0c;考察候选人对分布式系统核心概念的理解、实际应用能力以及在复杂场景下的问题解决能力。本文将深入分析分布式系统的CAP定理、一致性协议、分布…

【Android Studio 下载 Gradle 失败】

路虽远行则将至&#xff0c;事虽难做则必成 一、事故现场 下载Gradle下载不下来&#xff0c;没有Gradle就无法把项目编译为Android应用。 二、问题分析 观察发现下载时长三分钟&#xff0c;进度条半天没动&#xff0c;说明这个是国外的东西&#xff0c;被墙住了&#xff0c;需…

系统思考:思考的快与慢

在做重大决策之前&#xff0c;什么原因一定要补充碳水化合物&#xff1f;人类的大脑其实有两套运作模式&#xff1a;系统1&#xff1a;自动驾驶模式&#xff0c;依赖直觉&#xff0c;反应快但易出错&#xff1b;系统2&#xff1a;手动驾驶模式&#xff0c;理性严谨&#xff0c;…

从情感分析到朴素贝叶斯法:基于朴素贝叶斯的情感分析如何让DeepSeek赋能你的工作?

文章目录 1.概率论基础1.1 单事件概率1.2 多事件概率1.3 条件概率1.3.1 多事件概率与条件概率的区别 1.4 贝叶斯定理传统思维误区贝叶斯定理计算 2. 朴素贝叶斯法2.1 基本概念2.2 模型2.3 学习策略2.4 优化算法2.5 优化技巧拉普拉斯平滑对数似然 3. 情感分析实战3.1 流程3.2 模…

获取inode的完整路径包含挂载的路径

一、背景 在之前的博客 缺页异常导致的iowait打印出相关文件的绝对路径-CSDN博客 里的 2.2.3 一节和 关于inode&#xff0c;dentry结合软链接及硬链接的实验-CSDN博客 里&#xff0c;我们讲到了在内核里通过inode获取inode对应的绝对路径的方法。对于根目录下的文件而言&#…

【51单片机】2-6【I/O口】【电动车简易防盗报警器实现】

1.硬件 51最小系统继电器模块震动传感器模块433M无线收发模块 2.软件 #include "reg52.h" #include<intrins.h> #define J_ON 1 #define J_OFF 0sbit switcher P1^0;//继电器 sbit D0_ON P1^1;//433M无线收发模块 sbit D1_OFF P1^2; sbit vibrate …

leetcode二叉树刷题调试不方便的解决办法

1. 二叉树不易构建 在leetcode中刷题时&#xff0c;如果没有会员就需要将代码拷贝到本地的编译器进行调试。但是leetcode中有一类题可谓是毒瘤&#xff0c;那就是二叉树的题。 要调试二叉树有关的题需要根据测试用例给出的前序遍历&#xff0c;自己构建一个二叉树&#xff0c;…

蓝桥杯嵌入式客观题二

十四届模拟一 1. 2.串口通信是一种传输线按位数据顺序传输方式 3.USART_SR是属于STM32微控制器USART的状态寄存器。 4.STM32G431RBT6是32位的ARM微控制器 ARM处理器是英国ARM公司设计的一种低功耗RISC微处理器 5.中断配置‌EXTI->FTSR&#xff08;下降沿触发选择寄存器…

OrangePi入门教程(待更新)

快速上手指南 https://www.hiascend.com/developer/techArticles/20240301-1?envFlag1 教学课程(含开发板配置和推理应用开发) https://www.hiascend.com/developer/devboard 开发推理应用 https://www.hiascend.com/developer/techArticles/20240326-1?envFlag1

王者荣耀的游戏匹配机制

王者荣耀的匹配机制主要基于ELO评分系统&#xff08;隐藏分机制&#xff09;和段位匹配&#xff0c;旨在平衡对局双方实力&#xff0c;同时通过多种策略控制玩家胜率趋近50%。 一、匹配机制核心 1. ELO评分&#xff08;隐藏分&#xff09; - 系统根据玩家的胜负、KDA、伤害量、…

PPTAgent:一款开源免费生成和评估幻灯片的项目

这篇文章介绍一下PPTAgent&#xff0c;一个从文档自动生成演示文稿的创新系统。该系统从人类的展示创作方法中汲取灵感&#xff0c;采用两步流程来确保卓越的整体质量。此外&#xff0c;本文还介绍了PPTEval&#xff0c;这是一个综合评估框架&#xff0c;可以跨多个维度评估演示…

谷歌开源单个 GPU 可运行的Gemma 3 模型,27B 超越 671B 参数的 DeepSeek

自从 DeepSeek 把训练成本打下来之后&#xff0c;各个模型厂家现在不再堆参数进行模型的能力对比。而是转向了训练成本优化方面&#xff0c;且还要保证模型能力不减反增的效果。包括使用较少的模型参数&#xff0c;降低 GPU 使用数量&#xff0c;降低模型内存占用等等技术手段。…

回归预测 | Matlab实现NRBO-Transformer-LSTM多输入单输出回归预测

回归预测 | Matlab实现NRBO-Transformer-LSTM多输入单输出回归预测 目录 回归预测 | Matlab实现NRBO-Transformer-LSTM多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【JCR一区级】Matlab实现NRBO-Transformer-LSTM多输入单输出回归预测&#xf…

Photoshop 2025 Mac中文Ps图像编辑

Photoshop 2025 Mac中文Ps图像编辑 文章目录 Photoshop 2025 Mac中文Ps图像编辑一、介绍二、效果三、下载 一、介绍 Adobe Photoshop 2025 Mac版集成了多种强大的图像编辑、处理和创作功能。①强化了Adobe Sensei AI的应用&#xff0c;通过智能抠图、自动修复、图像生成等功能…

7. 记忆(Memory)机制:让AI拥有“短期记忆”与“长期记忆”

引言&#xff1a;当AI学会"记住你" 2025年某银行智能客服因无法记住用户身份&#xff0c;每次对话都要求重复验证&#xff0c;引发大量投诉。引入LangChain 记忆系统后&#xff0c;客户满意度提升62%。本文将基于MemorySaver与FAISS本地存储&#xff0c;教你构建符合…