当前位置: 首页 > news >正文

Nacos-2--Nacos1.x版本的通信原理

在Nacos 1.x版本中,客户端长轮询(Long Polling)和服务端UDP主动推送是两种不同的机制,分别用于配置管理和服务发现场景。它们的核心目标都是实现动态更新的实时感知,但实现方式、数据内容和适用场景完全不同。

1、长轮询(Long Polling)(配置管理)

1、长轮询的工作流程

  • 客户端发起请求:客户端(如Spring Boot应用)定期发起HTTP长轮询请求,携带本地配置的dataId、group和MD5校验值。
  • 服务端挂起请求:若配置未变化,服务端会挂起请求(默认30秒),期间保持连接不关闭
  • 配置变更触发响应:当服务端检测到配置更新(如通过控制台修改配置),会立即返回新配置内容(包括配置值和新MD5)。
  • 客户端处理响应:客户端收到响应后,对比MD5,若变化则更新本地缓存,并触发监听器回调(如刷新Spring Bean)

2、返回的内容是什么?

  • 配置内容:返回的是完整的配置数据(如application.properties的键值对)。
  • MD5校验值:用于客户端验证配置是否真正变化,避免网络传输中的数据不一致问题。

3、是否需要客户端重新拉取节点列表?

  • 不需要。长轮询的目标是同步配置数据,而不是服务实例列表
  • 如果涉及服务发现(如节点状态变化),需要通过服务发现接口(如nacos-client的服务订阅功能)获取实例列表。

4、特点

  • 返回内容:完整的配置内容(如application、properties的键值对)。
  • 实时性:延迟在0~30秒之间(取决于长轮询超时时间)。
  • 可靠性:依赖HTTP协议的重试机制,确保配置最终一致。

2、UDP主动推送(服务发现)

1、为什么需要UDP推送?

  • 长轮询的局限性:HTTP长轮询虽然能减少无效请求,但仍存在延迟(如30秒超时)和网络开销。
  • 服务发现的实时性需求:服务实例的上下线需要毫秒级通知,否则可能导致请求发送到已下线的节点。
  • UDP的优势:基于UDP的广播或单播可以实现低延迟、高并发的推送,适合服务实例变更的实时通知。

2、UDP推送的内容是什么?

  • 服务实例列表:推送的是服务名(ServiceName)对应的实例IP、端口、健康状态等元数据。即:已经发生变化的服务实例列表。
  • 变更类型:明确标识是新增实例、删除实例还是实例状态更新(如健康检查失败)。

3、UDP推送的实现原理

  • 客户端监听UDP端口:Nacos客户端在本地启动一个UDP Server,监听特定端口
  • 服务端主动推送:当服务端检测到实例变更(如心跳超时或新增注册),会通过UDP协议将变更后的实例列表发送到客户端监听的端口
  • 客户端更新本地缓存:收到UDP推送后,客户端立即更新本地服务实例缓存,确保后续请求使用最新实例。

4、特点

  • 返回内容:服务实例列表(包括IP、端口、健康状态等元数据)。
  • 实时性:毫秒级通知,延迟极低。
  • 可靠性:依赖UDP的无连接特性,可能存在丢包风险,但客户端会通过定时拉取兜底(如10秒一次的长轮询)。

3、长轮询与UDP推送的区别

在这里插入图片描述
主要区别:

  • 目的不同:虽然两者的目的都是为了使客户端能够及时获得服务列表的变化,但它们的工作机制有所不同。HTTP长轮询是一种拉模式,即客户端定期询问服务器是否有变化;而UDP推送是一种推模式,服务器主动将变更信息推送给客户端。
  • 实现方式不同:HTTP长轮询是基于HTTP协议的,它利用了现有的HTTP连接进行通信。而UDP推送则是基于UDP协议,具有更低的延迟和开销,但是可能不如TCP可靠。
  • 应用场景不同:在一些网络环境不太稳定的情况下,可能会更倾向于使用HTTP长轮询以保证消息的可靠性。而在要求快速响应的场景下,UDP推送则更为合适。

4、为什么需要两种机制?

1、配置管理与服务发现的目标不同

  • 配置管理:关注键值对的动态更新,对实时性要求较低(如日志级别调整可以容忍30秒延迟)。
  • 服务发现:关注实例列表的实时同步,对延迟敏感(如服务下线需立即感知,避免请求失败)。

2、协议选择的权衡

  • HTTP长轮询:基于通用协议,兼容性好,适合配置管理。
  • UDP推送:低延迟、低开销,适合服务发现的高并发场景。

3、Nacos 1.x的架构限制

  • 在Nacos 1.x中,服务发现和配置管理是两个独立模块,分别采用最适合的通信方式。
  • Nacos 2.0后,通过gRPC长连接统一了服务发现和配置管理的通信协议(取代UDP和HTTP长轮询)

5、Nacos1.x的实际场景协作

配置变更:通过HTTP长轮询实现。
服务(节点)状态变更:既可以通过UDP推送,也可以通过HTTP长轮询实现。二者是并行机制,不是“二选一”,但默认优先使用UDP推送以提高性能和实时性。如果UDP不可用(如网络限制、防火墙、客户端不支持等),会自动降级为HTTP长轮询

1、配置管理

  • 客户端通过HTTP长轮询获取配置变更(如application.properties的timeout=3000)。
  • 变更后,客户端更新本地配置并触发回调(如重新加载数据库连接池)。

2、服务发现

  • 客户端通过UDP推送或长轮询(作为兜底)获取服务实例列表。
  • 实例变更(如order-service新增一个节点)时,服务端立即通过UDP推送新列表,客户端更新负载均衡器(如Ribbon)的实例缓存。

两者如何协作?

  • 主流程:服务端优先通过UDP推送实例变更,客户端收到后立即更新本地缓存。
  • 兜底流程:如果UDP推送失败,客户端通过HTTP长轮询定期拉取实例列表,确保最终一致性。
  • 客户端逻辑:Nacos客户端会同时启动UDP监听和HTTP长轮询,优先使用UDP推送,失败时自动切换到HTTP长轮询。

6、总结

  • HTTP长轮询:用于配置管理,返回配置内容,客户端无需重新拉取节点列表。
  • UDP推送:用于服务发现,返回实例列表变更,解决长轮询的延迟问题。
  • 两者不是一回事:协议、数据内容、适用场景完全不同,但共同目标是实现动态更新的实时感知。

最终结论:
在这里插入图片描述

通过这种分层设计,Nacos 1.x在保证兼容性的同时,满足了不同场景下的实时性需求。在Nacos 2.0中,这些机制被gRPC长连接统一优化,进一步提升了性能和可靠性。

向阳前行,Dare To Be!!!

http://www.dtcms.com/a/328341.html

相关文章:

  • Web基础
  • 力扣47:全排列Ⅱ
  • 【8】Transformers快速入门:Decoder 分支和统计语言模型区别?
  • 图解软件系统组成
  • C#控制台项目,鼠标点击后线程会暂停
  • 什么是静态独享代理IP?如何选择可靠的静态独享代理IP供应商?
  • OAuth 2.0 授权码模式:安全架构解析
  • 龙虎榜——20250812
  • Java 8 Stream API 完全指南:优雅处理集合数据
  • 问卷系统测试报告
  • Unity UnityWebRequest常用操作
  • 从100到0.3美元:GPT-5用价格战血洗大模型赛道
  • 达梦数据闪回查询-快速恢复表
  • string 类元素访问方法
  • 《嵌入式Linux应用编程(四):Linux文件IO系统调用深度解析》
  • Origin2025b安装包免费,附Origin 2025安装教程
  • 智能机器人学习:智能机器人环境感知传感器介绍
  • 一个基于 PyTorch 的完整模型训练流程
  • 项目里程碑工具选型指南:16款优质系统
  • 基恩士3D视觉用于ABB机器人的KeyenceRobotVisionSetup.sys系统模块程序解析(九、KeyAbsMove)
  • 远程桌面环境协议对比
  • DDIA第五章:无主复制(去中心化复制)详解
  • 【Python办公】Mermaid代码转图片工具 - Tkinter GUI版本
  • wordpress数据库文件sql导入时出现#1253错误
  • 如何通过数据驱动需求决策
  • ZKmall开源商城的容灾之道:多地域部署与故障切换如何守护电商系统
  • Baumer高防护相机如何通过YoloV8深度学习模型实现木板表面缺陷的检测识别(C#代码UI界面版)
  • [java八股文][Mysql面试篇]架构
  • 构建Eclipse Rcp产品的核心文档帮助系统
  • C语言栈的实现