当前位置:

首页 > 系统应用 > 支持gRPC长链接,深度解读Nacos2.0架构设计及新模型

支持gRPC长链接,深度解读Nacos2.0架构设计及新模型

本文目录

    Nacos 简介Nacos源于2008年阿里巴巴的五彩石项目,该项目实现了微服务拆分与业务中台建设。随着云计算与开源环境的兴起,2018年,我们深切感受到开源软件行业的影响力,于是决定将Nacos开源,输出阿里在服务发现与配管管理方面十年的沉淀,推动微服务行业发展,加速企业数字化转型。目前 Naco

    Nacos 简介

    Nacos源于2008年阿里巴巴的五彩石项目,该项目实现了微服务拆分与业务中台建设。随着云计算与开源环境的兴起,2018年,我们深切感受到开源软件行业的影响力,于是决定将Nacos开源,输出阿里在服务发现与配管管理方面十年的沉淀,推动微服务行业发展,加速企业数字化转型。

    目前 Nacos 支持主流微服务开发语言 & 主流服务框架和配置管理框架,比如支持 Duboo 和 SCA, 还对接了一些云原生的组件比如 coreDNS 和 sentinel 等。

    客户端语言方面支持诸如 Ja va、go python 等主流语言,还有近期刚发布正式版本的 C# 和 C++,在此感谢所有社区贡献者的支持。

    Nacos 开源 2 年多以来,共发布了 34 个版本,其中有一些比较重要的里程碑版本;Nacos 还非常年轻,有很大的进步空间,欢迎社区及各界大佬一起共同建设。

    Nacos 1.X 架构及问题

    接下来我们看一下 nacos1.x 架构及其分析一下存在的比较重要的问题。首先来看一下架构简图。

    Nacos 1.X 架构层次

    Nacos 1.X 大致分为 5 层, 分别是接入、通信、功能、同步和持久化。

    接入层是用户最直接交互的层面,主要有 Nacos 客户端,以及依赖客户端的 Dubbo 和 SCA 以及用户操作的控制台 Console 组成。客户端和 Console 进行服务和配置操作,统一通过 HTTP 的 OpenAPI 发起通信请求。

    通信层主要基于 HTTP 的短连接请求模型进行,部分推送功能通过 UDP 进行通信。

    功能目前有服务发现和配置管理,这层也就是实际管理服务和配置的业务层。

    同步层有数据同步的 AP 模式 Distro 和 CP 模式 Raft,还有有一个最简易的水平通知 Notify,用处各不相同:

    • Distro:非持久化服务的同步模式。
    • Raft:持久化服务的同步模式、以及使用 Derby 作为配置的存储时同步配置操作。
    • Notify:使用 MySQL 作为配置的存储时,通知其他节点更新缓存及发起配置推送。

    持久化层 Nacos 使用 MySQL、Derby 和本地文件系统来进行数据的持久化 配置信息,用户信息,权限信息存储在 MySQL 或 Derby 数据库中, 持久化服务信息及服务和实例元数据信息存储在本地文件系统。

    Nacos 1.X 架构下的服务模型

    我们通过一个服务发现的流程,再深入熟悉一下 Nacos 1.X 架构和基于当前架构的 Nacos 服务发现模型。

    Nacos 客户端注册服务会通过 OpenAPI 发送 Http 注册服务的请求,请求内容会带上服务信息及实例信息,通常这个步骤是由微服务框架 SCA 和 dubbo 完成。

    服务端收到请求后,会先在 Contoller 中进行数据的读取和校验,比如 IP 是否合法,服务名是否正确等等。校验通过后,如果这个服务是第一次注册,Nacos 会在服务端生成一个 Service 对象,然后把这次注册的实例信息存入这个 Service 对象中;如果 Nacos 服务端已经有了这个 Service 对象,那么就会直接把新注册的实例信息存入对象。这个 Service 对象通过 命名空间+Group+Service 的组合来保证唯一性。

    完成实例存入 Service 的同时,会触发两个事件,其中一个事件是用于数据同步的,Nacos 服务端会根据这个服务是否是临时对象的信息,使用 Distro 或者 Raft 协议进行同步,通知其他的 Nacos 节点该服务发生了变更;另一个事件则通知在该 Nacos 服务节点上订阅了该服务的订阅者,并根据订阅者信息,通过 UDP 的方式,把最新的服务列表推送到订阅者客户端上。这就完成了一次服务注册流程。

    另外,对于那些被定义为持久化的服务的所有信息,都会通过 raft 协议,保证能够写入到文件系统中被持久化。

    最后,其他的 Nacos 节点,在通过同步而进行 Service 变更的时候也会触发通知订阅者的事件,从而使在其他 Nacos 服务节点上订阅该服务的订阅者也能收到推送。

    1.X 架构存在的问题

    粗略介绍了下 Nacos1.X 的架构和服务发现模型,接下来分析一下 Nacos1.X 架构所面临的几个比较重要的问题。

    一句话总结,心跳多,无效查询多,心跳续约感知变化慢,连接消耗大,资源空耗严重。

    • 心跳数量多,导致 TPS 居高不下

    通过心跳续约,当服务规模上升时,特别是类似 Dubbo 的接口级服务较多时,心跳及配置元数据的轮询数量众多,导致集群 TPS 很高,系统资源高度空耗。

    • 通过心跳续约感知服务变化,时延长

    心跳续约需要达到超时时间才会移除并通知订阅者,默认为 15s,时延较长,时效性差。若改短超时时间,当网络抖动时,会频繁触发变更推送,对客户端服务端都有更大损耗。

    • UDP 推送不可靠,导致 QPS 居高不下

    由于 UDP 不可靠,因此客户端测需要每隔一段时间进行对账查询,保证客户端缓存的服务列表的状态正确,当订阅客户端规模上升时,集群 QPS 很高,但大多数服务列表其实不会频繁改变,造成无效查询,从而存在资源空耗。

    • 基于 HTTP 短连接模型,TIME_WAIT 状态连接过多

    HTTP 短连接模型,每次客户端请求都会创建和销毁 TCP 链接,TCP 协议销毁的链接状态是 WAIT_TIME,完全释放还需要一定时间,当 TPS 和 QPS 较高时,服务端和客户端可能有大量的 WAIT_TIME 状态链接,从而会导致 connect time out 错误或者 Cannot assign requested address 的问题。

    • 配置模块的 30 秒长轮询引起的频繁 GC

    配置模块使用 HTTP 短连接阻塞模型来模拟长连接通信,但是由于并非真实的长连接模型,因此每 30 秒需要进行一次请求和数据的上下文切换,每一次切换都有引起造成一次内存浪费,从而导致服务端频繁 GC。

    Nacos 2.0 架构及新模型

    Nacos 2.0 架构层次

    Nacos 2.X 在 1.X 的架构基础上 新增了对长连接模型的支持,同时保留对旧客户端和 openAPI 的核心功能支持。

    通信层目前通过 gRPC 和 Rsocket 实现了长连接 RPC 调用和推送能力。

    在服务端测,新增一个链接层,用来将不同类型的 Request 请求,将来自不同客户端的不同类型请求,转化为相同语意的功能数据结构,复用业务处理逻辑。同时,将来的流量控制和负载均衡等功能也会在链接层处理。

    其他架构分层在大体上保持不变。

    Nacos 2.0 新服务模型

    虽然 Nacos2.0 的在架构层次上并未做太大的变化,但是具体的模型细节却有不小的改动,依旧使用注册服务的流程,再深入了解一下 Nacos2.0 服务模型的变化。

    由于通信采用了RPC方式,所以某一客户端的所有请求,无论是注册还是订阅,都通过同一个链接和同一个服务节点进行。这与之前通过HTTP连接有所不同,那时每次请求可能都在不同的Nacos节点上。如此一来,服务发现的数据内容便从原来的无状态化,转变为了与连接状态绑定的有状态数据。为了适应这一变化,数据模型需要做出调整,因此抽象出了一个新的数据结构,将同一个客户端通过该链接发布和订阅的内容关联起来,暂且命名为Client。这里的Client并非指客户端本身,而是与该客户端相关的数据内容,一个链接对应一个Client。

    当客户端发布了服务时,该客户端所发布的所有服务与订阅者信息会被更新到与该客户端链接相对应的 Client 对象中,然后通过事件机制触发对索引信息的更新。这个索引信息是客户端链接和服务的索引,方便快速聚合生成需要推送的服务纬度的数据。

    索引信息更新完成后,会触发推送事件,此时会将所有和该服务有关的 Client 对象,通过刚产生的索引信息聚合起来,当数据聚合完成后,再从客户端链接中筛选出订阅该服务的订阅者的客户端链接,将推送数据通过该链接,推送回去。这样一次发布变更的主链路就完成了。

    回过头看数据同步,客户端发布了服务时实际更新的对象从原来的 Service 变成 Client 对象,所以需要同步的内容也变成了 Client 对象;同时服务端间的通信方式也会换成 RPC。这里只有真正被客户端更新的 Client 对象会触发同步,如果是通过同步而更新的 Client 对象不会再次触发同步。

    最后看 Metadata,Metadata 是从 1.X 版本中的 Service 对象和 Instance 对象中分离出来的一些属性:比如服务的元数据 label 标签,实例的上下线状态、权重和元数据 label 标签等。这些元数据可以被 openAPI 单独修改,在聚合数据时生效。之所以将元数据拆分出来,区别于基础数据,原因是基础数据比如:ip 端口,服务名等一经发布不应该被修改,而且应当以发布时的信息为准;但其他的原数据,比如上下线状态和权重,通常是在运行过程中动态调节的,因此拆分开之后,分为两条不同的处理工作流应该更加合理。

    Nacos 2.0 架构的优缺点

    前面简要介绍了 Nacos 2.0 的架构和新模型的工作方式,接下来我们分析一下这样的改动有哪些优缺点。

    优点

    • 客户端不再需要定时发送实例心跳,只需要有一个维持连接可用 keepalive 消息即可。重复 TPS 可以大幅降低。

    • TCP 连接断开可以被快速感知到,提升反应速度。

    • 长连接的流式推送,比 UDP 更加可靠;nio 的机制具有更高的吞吐量,而且由于可靠推送,可以加长客户端用于对账服务列表的时间,甚至删除相关的请求。重复的无效 QPS 可以大幅降低。

    • 长连接避免频繁连接开销,可以大幅缓解 TIME_ WAIT 问题。

    • 真实的长连接,解决配置模块 GC 问题。

    • 更细粒度的同步内容,减少服务节点间的通信压力。

    缺点

    没有银弹的方案,新架构也会引入一些新问题:

    • 内部结构复杂度上升,管理连接状态,连接的负载均衡需要管理。

    • 数据又原来的无状态,变为与连接绑定的有状态数据,流程链路更长。

    • RPC 协议的观测性不如 HTTP。即使 gRPC 基于 HTTP2.0Stream 实现,仍然不如直接使用 HTTP 协议来的直观。

    Nacos 2.X 规划

    接下来简单分享下 Nacos 2.X 的后期规划,主要分为文档、质量和 Roadmap。

    在文档和质量方面,Nacos 1.X 都做的不是很好。文档内容较少,仅有简单使用文档;和版本有一定脱节,更新不及时;没有对技术内容的说明,参与贡献难度高。代码质量及测试质量也不是很高,虽然已经使用 checkstyle 进行了 codeStyle 的校验以及开启了社区协作 review。但是这还远远不够。Nacos 2.X 将会逐步更新、细化官网使用文档;通过电子书对技术细节进行解析;通过 Github 展示技术方案,促进讨论及贡献;并且对代码进行大量重构及 UT 和 IT 的治理工作,在未来将 Benchmark 也会开源出来,方便给开源用户进行压测。

    而 RoadMap 方面,Nacos 2.X 会对项目做大幅度的重构,完成初步插件化,并对刚才 2.0 架构的一些缺点,如负载均衡,可观测性进行提升。

    加入我们

    欢迎在 Nacos github 上提交 issue 与 PR 进行讨论和贡献,或加入 Nacos 社区群参与社区讨论。

    除了参与开源,我们也欢迎更多有能力及有意愿的同学加入阿里云共建云原生,详情请看云原生应用平台。

    本文整理自 Spring Cloud Alibaba Meetup 杭州站演讲,点击此处立即参与 1 月 9 日下周六的上海站 Meetup,听 Nacos 用户分享 Nacos 在知名互联网教育公司的落地实践。

    作者简介

    杨翊,花名席翁。Nacos PMC,主要参与的是服务发现模块,和做一些内核重构和提升的工作。Apache SharadingSphere PMC,主要负责和参与过的模块有 路由模块、分布式事务、 数据同步、以及弹性扩容。

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    系统应用
    相关文章 更多
    win10正在玩游戏弹出更新重启怎么禁止
    win10正在玩游戏弹出更新重启怎么禁止

    Win10玩游戏时突然弹出更新重启提示?不要强制关机。本文教你如何通过设置“活动时间”避免自动重启,利用“安排重启”规划空闲时间,以及合理使用“暂停更新”功能。区分不同状态下的应对策略,既保护游戏进度又维持系统安全。

    win10自动更新抢占网络带宽该怎么处理
    win10自动更新抢占网络带宽该怎么处理

    Win10自动更新抢占带宽导致游戏卡顿或网页打不开?本教程教你通过任务管理器确认更新进程,利用暂停更新、按流量计费连接和传递优化带宽限制,精准控制Windows Update下载速度,解决网络拥堵问题。

    win10家庭版有没有简单办法阻止强制更新
    win10家庭版有没有简单办法阻止强制更新

    Win10家庭版用户常受强制更新困扰。本文详解如何利用系统自带的暂停更新、活动时间和安排重启功能,在不破坏系统稳定性的前提下减少更新打扰,并分析注册表修改的风险及系统支持现状。

    win10升级新版本后取消开机密码失效怎么修复
    win10升级新版本后取消开机密码失效怎么修复

    Windows 10更新后开机突然要求输入密码?本文解析自动登录失效的真实原因,提供通过netplwiz重新保存凭据、关闭Windows Hello干扰及排查账户策略的完整步骤,助你恢复免密进入桌面。

    win10更新没下载完反复重试该怎么停止任务
    win10更新没下载完反复重试该怎么停止任务

    Windows 10更新下载失败反复重试怎么办?不要直接停用服务。本文教你通过设置页面暂停更新、启用按流量计费连接以及调整活动时间,安全地暂时停止下载任务并避免意外重启。

    win10怎么取消系统准备强制升级新版本
    win10怎么取消系统准备强制升级新版本

    面对Win10强制升级新版本的提示,本文解析家庭版与专业版的应对差异。介绍如何通过暂停更新、设置活动时间临时避让,以及利用组策略控制功能版本。强调Windows 10支持终止后的安全风险,避免使用高风险的禁用服务手段。

    win10组策略找不到更新选项该怎么处理
    win10组策略找不到更新选项该怎么处理

    Win10组策略编辑器中找不到Windows Update选项怎么办?本文分析家庭版与专业版的权限差异,厘清本地策略与域策略的区别,提供设置页替代方案及企业环境排查思路,避免盲目修改注册表或安装非官方补丁。

    win10取消开机密码会影响电脑里的文件安全吗?
    win10取消开机密码会影响电脑里的文件安全吗?

    很多人为了便捷选择取消 Win10 开机密码,这会导致文件丢失吗?本文详解取消密码后文件访问权限的变化、BitLocker 加密的有效性以及更安全的替代方案,帮助用户在便利与数据安全之间做出正确选择。

    win10弹出立即重启更新怎么延后这个操作
    win10弹出立即重启更新怎么延后这个操作

    Win10弹出立即重启更新会打断工作?本文介绍如何通过Windows Update页面安排重启时间、设置活动时段以及暂停后续更新,有效延后重启操作,保护未保存的工作成果。

    win10自动更新在夜间偷偷运行怎么限制
    win10自动更新在夜间偷偷运行怎么限制

    Win10晚上自动下载或重启怎么办?不要直接禁用服务。本文教你通过设置活动时间、安排指定重启时间及短期暂停更新,精准控制Windows Update行为,避免夜间网络占用和意外重启,同时保留系统安全性。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。