Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!

这篇具有很好参考价值的文章主要介绍了Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当应用开始脱离单机运行和访问时,服务发现就诞生了。目前的网络架构是每个主机都有⼀个独立的 IP 地址,服务发现基本都是通过某种方式获取到服务所部署的 IP 地址。

DNS 协议是最早将⼀个网络名称翻译为网络 IP 的协议,在最初的架构选型中,DNS+LVS+Nginx 基本满足所有 RESTful 服务的发现,此时服务的 IP 列表通常配置在 nginx 或 LVS。后来出现 RPC 服务,服务的上下线更加频繁,人们开始寻求⼀种能够支持动态上下线并且推送 IP 列表变化的注册中心产品。

互联网软件行业普遍热捧开源产品,因为开源产品代码透明、可以参与共建、有社区进行交流和学习,当然更重要是免费。个人开发者或者中小型公司往往会将开源产品作为选型首选。

1 开源产品

1.1 Zookeeper

经典服务注册中心产品(虽然它最初的定位并不在于此),在很长⼀段时间里,是国人在提起 RPC 服务注册中心时心里想到的唯⼀选择,这很大程度上与 Dubbo 在中国的普及程度有关。

1.2 Consul 和 Eureka

都出现于 2014 年:

  • Consul 在设计上把很多分布式服务治理上要用到的功能都包含在内,可以支持服务注册、健康检查、配置管理、Service Mesh 等
  • Eureka借微服务概念流行,与 SpringCloud 生态的深度结合,也获取了大量的用户

1.3 Nacos

则携带着阿里巴巴大规模服务生产经验,试图在服务注册和配置管理这个市场上,提供给用户⼀个新的选择。

图 1 服务发现:

Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!

1.4 开源产品的优势

开发人员可以去阅读源代码,理解产品的功能设计和架构设计,同时也可以通过本地部署来测试性能,随之而来的是各种产品的对比文章。

不过当前关于注册中心的对比,往往停留在表面的功能对比上,对架构或者性能并没深入探讨。

1.5 痛点

是服务注册中心往往隐藏在服务框架背后,作为默默支持的产品。优秀的服务框架往往支持多种配置中心,但是注册中心的选择依然强关联与服务框架,⼀种普遍的情况是⼀种服务框架会带⼀个默认的服务注册中心。这样虽然免去了用户在选型上的烦恼,但是单个注册中心的局限性,导致用户使用多个服务框架时,必须部署多套完全不同的注册中心,这些注册中心之间的数据协同也是⼀个问题。

本文从各个角度深度介绍 Nacos 注册中心的设计原理,并试图从我们的经验和调研中总结和阐述服务注册中心产品设计上应该去遵循和考虑的要点。

2 数据模型

注册中心的核心数据:

  • 服务的名字
  • 它对应的网络地址

当服务注册了多个实例时,我们需要对不健康的实例过滤或针对实例的⼀些特征进行流量分配,就需要在实例存储⼀些如健康状态、权重等属性。随服务规模扩大,渐渐的又需要在整个服务级别设定⼀些权限规则、以及对所有实例都生效的⼀些开关,于是在服务级别又会设立⼀些属性。再往后,我们又发现单个服务的实例又会有划分为多个子集的需求,例如⼀个服务是多机房部署的,那么可能需要对每个机房的实例做不同的配置,这样又需要在服务和实例之间再设定⼀个数据级别。

对比

  • Zookeeper 没有针对服务发现设计数据模型,它的数据是以⼀种更加抽象的树形 K-V 组织的,因此理论上可以存储任何语义的数据
  • Eureka 或者 Consul 都做到实例级的数据扩展,可满足大部分的场景,不过无法满足大规模和多环境的服务数据存储
  • Nacos 在经过内部多年生产经验后提炼出的数据模型,则是⼀种服务-集群-实例的三层模型。基本满足服务在所有场景下的数据存储和管理。

Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!

Nacos 的数据模型虽然相对复杂,但它不强制你使用它里面的所有数据,在大多数场景下,你可以选择忽略这些数据属性,此时可降维成和 Eureka 和 Consul ⼀样的数据模型。

数据的隔离模型

作为⼀个共享服务型的组件,需要能够在多个用户或者业务方使用情况下,保证数据的隔离和安全,这在稍微大⼀点的业务场景中非常常见。另⼀方面服务注册中心往往会支持云上部署,此时就要求服务注册中心的数据模型能够适配云上的通用模型。

Zookeeper、Consul 和 Eureka 在开源层面都没有很明确的针对服务隔离的模型,Nacos 则在⼀开始就考虑到如何让用户能够以多种维度进行数据隔离,同时能够平滑的迁移到阿里云上对应的商业化产品。

图 3 服务的四层的数据逻辑隔离模型:

Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!
用户账号对应可能是⼀个企业或独立的个体,这个数据⼀般情况不会透传到服务注册中心。⼀个用户账号可新建多个命名空间,每个命名空间对应⼀个客户端实例,这个命名空间对应的注册中心物理集群是可以根据规则进行路由的,这样可以让注册中心内部的升级和迁移对用户无感知,同时根据用户的级别,为用户提供不同服务级别的物理集群。

再往下是服务分组和服务名组成的二维服务标识,可以满足接口级别的服务隔离。

Nacos 1.0.0 介绍的另外⼀个新特性是:临时实例和持久化实例。在定义上区分临时实例和持久化实例的关键是健康检查的方式。临时实例使用客户端上报模式,而持久化实例使用服务端反向探测模式。临时实例需要能够自动摘除不健康实例,而且无需持久化存储实例,那么这种实例就适用于类 Gossip 的协议。右边的持久化实例使用服务端探测的健康检查方式,因为客户端不会上报心跳,那么自然就不能去自动摘除下线的实例。

图 4 临时实例和持久化实例:

Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!

大中型公司,这两种类型的服务都有:

  • ⼀些基础组件如数据库、缓存等,这些往往不能上报心跳,这种类型的服务在注册时,就需要作为持久化实例注册
  • 上层的业务服务,例如微服务或者 Dubbo 服务,服务的 Provider 端支持添加汇报心跳的逻辑,可使用动态服务的注册方式

Nacos 2.0 沿用持久化及非持久化的设定,但有调整。Nacos 1.0 中持久化及非持久化的属性是作为实例的⼀个元数据进行存储和识别。导致同⼀个服务下可同时存在持久化实例和非持久化实例。但实际使用中,这种模式:

  • 会给运维人员带来极大的困惑和运维复杂度
  • 从系统架构来看,⼀个服务同时存在持久化及非持久化实例的场景也是存在⼀定矛盾

导致该能力事实上未被广泛使用。为简化 Nacos 的服务数据模型,降低运维复杂度,提升 Nacos 易用性,在 Nacos2.0 中:

  • 是否持久化的数据抽象至服务级别
  • 不再允许⼀个服务同时存在持久化实例和非持久化实例,实例的持久化属性继承自服务的持久化属性

3 数据⼀致性

分布式系统永恒话题,协议层面上看,⼀致性的选型已经很长时间没有新的成员加入了。目前来看基本

可归两家:

  • 基于 Leader 的非对等部署的单点写⼀致性
  • 对等部署的多写⼀致性

选用服务注册中心,没有⼀种协议能覆盖所有场景,如:

  • 当注册的服务节点不会定时发送心跳到注册中心时,强⼀致协议看起来是唯⼀的选择,因为无法通过心跳来进行数据的补偿注册,第⼀次注册就必须保证数据不会丢失
  • 而当客户端会定时发送心跳来汇报健康状态时,第⼀次的注册的成功率并不是非常关键(当然也很关键,只是相对来说我们容忍数据的少量写失败),因为后续还可以通过心跳再把数据补偿上来,此时 Paxos 协议的单点瓶颈就会不太划算了,这也是Eureka 为什么不采用 Paxos 协议而采用自定义的 Renew 机制

这两种数据⼀致性协议有各自使用场景,对服务注册需求不同,就会导致使用不同协议。Zookeeper 在 Dubbo 体系下表现出的行为,其实采用 Eureka 的 Renew 机制更合适,因为 Dubbo 服务往 Zookeeper 注册的就是临时节点,需要定时发心跳到 Zookeeper来续约节点,并允许服务下线时,将 Zookeeper 上相应的节点摘除。Zookeeper 使用 ZAB 虽保证数据的强⼀致,但是它的机房容灾能力的缺乏,无法适应⼀些大型场景。

Nacos 因为要支持多种服务类型的注册,并能够具有机房容灾、集群扩展等必不可少的能力,1.0.0 正式支持 AP 和 CP 两种⼀致性协议并存。1.0.0 重构数据的读写和同步逻辑,将与业务相关的 CRUD 与底层的⼀致性同步逻辑进行了分层隔离。然后将业务的读写(主要是写,因为读会直接使用业务层的缓存)抽象为 Nacos 定义的数据类型,调用⼀致性服务进行数据同步。在决定使用 CP 还是 AP ⼀致性时,使用⼀个代理,通过可控制的规则进行转发。

目前的⼀致性协议实现,⼀个是基于简化的 Raft 的 CP ⼀致性,⼀个是基于自研协议 Distro 的AP ⼀致性。Raft 协议不必多言,基于 Leader 进行写入,其 CP 也并不是严格的,只是能保证⼀半所见⼀致,以及数据的丢失概率较小。Distro 协议则是参考了内部 ConfigServer 和开源 Eureka,在不借助第三方存储的情况下,实现基本大同小异。Distro 重点是做了⼀些逻辑的优化和性能的调优

图 5 Nacos ⼀致性协议:

Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-692868.html

到了这里,关于Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 30个前端和设计必备网站,让你的工作更轻松!

    当今互联网时代,前端开发和设计领域变化迅速,每天都会有新技术和工具不断涌现。无论你是一名前端工程师还是一名设计师,都需要不断了解最新的前沿技术和工具。下面是30个前端和设计经常会用到的网站,以及每个网站的功能介绍。 链接:https://www.w3schools.com/ W3Scho

    2024年01月16日
    浏览(51)
  • Nacos 的底层实现原理 & 注册中心的两种调用方式

    目录 1. Nacos 的底层实现原理 1.1 配置中心自动刷新实现原理 1.2  注册中心底层实现原理 2. Nacos 注册中心的两种调用方式  2.1 RestTemplate + Spring Cloud LoadBalancer 的调用方式 2.2 使用 OpenFeign + Spring Cloud LoadBalancer  Nacos 配置中心的自动刷新,其底层是基于 长轮询+事件驱动 的方式来

    2024年02月05日
    浏览(44)
  • 手写SpringCloud系列-一分钟理解微服务注册中心(Nacos)原理。

    手写SpringCLoud项目地址,求个star github:https://github.com/huangjianguo2000/spring-cloud-lightweight gitee:https://gitee.com/huangjianguo2000/spring-cloud-lightweigh 1. 总结服务注册中心 我们可以理解注册中心就是一个HashMap,服务注册上去,需要用的时候去拉取,通过服务名称可以找到对应服务的IP地址和

    2024年02月14日
    浏览(43)
  • 轻松搭建远程Node.js服务端,让你的应用在公共网络中畅行无阻!

    Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation(原为 Node.js Foundation,已与 JS Foundation 合并)持有和维护,亦为 Linux 基金会的项目。Node.js 采用 Google 开发的 V8 运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高

    2024年02月11日
    浏览(58)
  • Spring Boot进阶(51):如何在Spring Boot项目中轻松集成HTML:让你的应用更具吸引力!

            我们都知道,Spring Boot作为一款广泛应用于企业级的开发框架,其通过简化开发过程、提高开发效率赢得了众多开发者的青睐。在实际项目开发中,集成 HTML作为 Web 应用程序中的一个基本需求,也是现在极其常见的场景之一。在此,我将为大家分享一下Spring Boot如何

    2024年02月11日
    浏览(47)
  • Spring Boot进阶(58):轻松搞定数据存储!Spring Boot与PostgreSQL完美集成,让你的应用更稳定更高效!

            PostgreSQL是一种广泛使用的开源关系型数据库,具有可靠性高、性能优异、拥有丰富的数据类型和扩展等优点,越来越多的企业和开发者开始使用它来存储和管理数据。而Spring Boot是一种快速开发的框架,可以简化开发过程并提高开发效率。本文将介绍如何使用Sp

    2024年02月10日
    浏览(54)
  • 【Spring Cloud】深入探索 Nacos 注册中心的原理,服务的注册与发现,服务分层模型,负载均衡策略,微服务的权重设置,环境隔离

    在微服务架构中,服务注册中心是整个体系中的关键组件之一。它负责服务的注册、发现和管理,为微服务之间的通信提供了基础设施。在这方面,Nacos(Namespace Aware Clustered Object Storage)作为一种服务发现和配置管理系统,提供了丰富的功能,旨在简化微服务架构中的服务注

    2024年02月06日
    浏览(168)
  • 九、Nacos源码系列:Nacos配置中心原理(一)- SpringCloud应用启动时拉取配置

    熟悉Spring的小伙伴都知道,Spring 提供了强大的扩展机制。其中包括 ** ApplicationContextInitializer **,该扩展是在上下文准备阶段(prepareContext), 容器刷新之前做一些初始化工作 ,比如我们常用的配置中心 client 基本都是继承该初始化器,在容器刷新前将配置从远程拉到本地,然

    2024年02月19日
    浏览(52)
  • Nacos 注册中心和配置中心

                            打开nacos虚拟机

    2024年02月06日
    浏览(34)
  • Vue实现二维码,让你的数据轻松传递

    在我们生活中,二维码的应用越来越广泛,特别是在移动互联网的时代,二维码成为了快速传达信息的一种利器。在这篇文章中,我们将会介绍如何在Vue框架下,实现一个具备扫描和查看数据的二维码。 在这一篇文章中,我们将会使用到以下两个库: qrcode.js :一个简单易用

    2024年02月05日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包