【Nacos 架构 原理】服务发现模块之Nacos注册中心服务数据模型

news2024/12/25 12:17:50

文章目录

        • 服务(Service)和服务实例(Instance)
          • 定义服务
          • 服务元数据
          • 定义实例
          • 实例元数据
          • 持久化属性
        • 集群
          • 定义集群
        • 生命周期
          • 服务的生命周期
          • 实例的生命周期
          • 集群的生命周期
          • 元数据的生命周期

服务(Service)和服务实例(Instance)

在服务发现领域中,服务指的是由应用程序提供的一个或一组软件功能的一种抽象概念(例如登录服务和支付服务)。服务和应用不同,应用范围更广,即一个应用可能包含多个服务。Nacos选择服务作为注册中心最基本的概念

服务实例是某个服务的具体提供能力的节点,一个实例仅从属一个服务,而一个服务可以包含一个或多个实例。许多场景下,实例又被称为服务提供者(Provider),而使用该服务的实例被称为服务消费者(Consumer)。

定义服务

在 Nacos 中,服务的定义包括以下几个内容:

  • 命名空间(Namespace):Nacos 数据模型中最顶层、也是包含范围最广的概念,用于在类似环境或租户等需要强制隔离的场景中定义。Nacos 的服务也需要使用命名空间来进行隔离。
  • 分组(Group):Nacos 数据模型中次于命名空间的一种隔离概念,区别于命名空间的强制隔离属性,分组属于一个弱隔离概念,主要用于逻辑区分一些服务使用场景或不同应用的同名服务,最常用的情况主要是同一个服务的测试分组和生产分组、或者将应用名作为分组以防止不同应用提供的服务重名。
  • 服务名(Name):该服务实际的名字,一般用于描述该服务提供了某种功能或能力。
    在这里插入图片描述
    Nacos之所以将服务进行拆分为命名空间分组服务名,除了方便隔离使用场景,还方便用户发现唯一服务的优点。注册中心的实际使用场景中,同个公司的不同开发者会开发类似的服务,如果仅仅使用服务名来做服务的定义和表示,容易在一些通用服务 上出现冲突,比如登录服务。
    通常推荐使用由运行环境作为命名空间、应用名作为分组和服务功能作为服务名的组合来确保该服务的天然唯一性
服务元数据

服务定义只是为服务设置了一些基本信息,用于描述和快速找到服务。
服务元数据进一步定义了Nacos中服务的细节属性和描述信息,主要包含:

  • 健康保护阈值(ProtectThreshold):为了防止因过多实例故障,导致所有流量全部流入剩余实例,继而造成流量压力将剩余实例被压垮形成的雪崩效应。应将健康保护阈值定义为一个 0 到 1 之间的浮点数。当域名健康实例数占总服务实例数的比例小于该值时,无论实例是否健康,都会将这个实例返回给客户端。这样做虽然损失了一部分流量,但是保证了集群中剩余健康实例能正常工作。
  • 实例选择器(Selector):用于在获取服务下的实例列表时,过滤和筛选实例。该选择器也被称为路由器,目前Nacos支持通过将实例的部分信息存储在外部元数据管理 CMDB 中,并在发现服务时使用 CMDB 中存储的元数据标签来进行筛选的能力。
  • 拓展数据(extendData):用于用户在注册实例时自定义扩展的元数据内容,形式为 K-V 。可以在服务中拓展服务的元数据信息,方便用户实现自己的自定义逻辑。
定义实例

由于服务实例是具体提供服务的节点,因此Nacos在设计实例的定义时,主要需要存储该实例的一些网络相关的基础信息,主要包含以下内容

  • 网络IP地址:该实例的IP地址,在Nacos2.0版本后支持设置为域名
  • 网络端口:该实例的端口信息
  • 健康状态(Healthy):用于表示该实例是否为健康状态,会在Nacos中通过健康检查的手段进行维护,具体内容将在Nacos健康检查机制中详细说明
  • 集群(Cluster):用于标识该实例归属于哪个逻辑集群,有关于集群的相关内容,将在后文详细说明。
  • 扩展数据(extendData):用于用户自定义扩展的元数据内容,形式为K-V。可以在实例中拓展该实例的元数据信息,方便用户实现自己的自定义逻辑和标识该实例。
实例元数据

和服务元数据不同,实例的元数据主要作用于实例运维相关的数据信息。主要包含:

  • 权重(Weight):实例级别的配置。权重为浮点数,范围为 0-10000。权重越大,分配给该实例的流量越大。
  • 上线状态(Enabled):标记该实例是否接受流量,优先级大于权重和健康状态。用于运维人员在不变动实例本身的情况下,快速地手动将某个实例从服务中移除。
  • 拓展数据(extendData):不同于实例定义中的拓展数据,这个拓展数据是给予运维人员在不变动实例本身的情况下,快速地修改和新增实例的扩展数据,从而达到运维实例的作用。
持久化属性

Nacos 提供两种类型的服务持久化服务非持久化服务,分别给类DNS 的基础的服务组件场景和上层实际业务服务场景使用。为了标示该服务是哪种类型的服务,需要在创建服务时选择服务的持久化属性。考虑到目前大多数使用动态服务发现的场景为非持久化服务的类型(如Spring Cloud,Dubbo,Service Mesh等),Nacos 将缺省值设置为了非持久化服务。
在 Nacos2.0 版本后,持久化属性的定义被抽象到服务中,一个服务只能被定义成持久化服务或非持久化服务,一旦定义完成,在服务生命周期结束之前,无法更改其持久化属性。
持久化属性将会影响服务及实例的数据是否会被 Nacos 进行持久化存储,设置为持久化之后,实例将不会再被自动移除,需要使用者手动移除实例。

集群

集群是Nacos中一组服务实例的一个逻辑抽象的逻辑,它介于服务和实例之间,是一部分服务属性的下沉和实例属性的抽象。

定义集群

在 Nacos 中,集群中主要保存了有关健康检查的一些信息和数据:

  • 健康检查类型(HealthCheckType):使用哪种类型的健康检查方式,目前支持:TCP,HTTP,MySQL;设置为NONE可以关闭健康检查。
  • 健康检查端口(HealthCheckPort):设置用于健康检查的端口。
  • 是否使用实例端口进行健康检查(UseInstancePort):如果使用实例端口进行健康检查,将会使用实例定义中的网络端口进行健康检查,而不再使用上述设置的健康检查端口进行。
  • 拓展数据(extendData):用于用户自定义扩展的元数据内容,形式为 K-V 。可以自定义扩展该集群的元数据信息,方便用户实现自己的自定义逻辑和标示该集群。
    在这里插入图片描述
生命周期

在注册中心中,实例数据都和服务实例的状态绑定,因此服务实例的状态直接决定了注册中心实例数据的生命周期。而服务作为实例的聚合抽象,生命周期也会由服务实例的状态来决定。

服务的生命周期

服务的生命周期相对比较简单,是从用户向注册中心发起服务注册的请求开始。在Nacos中,发起服务注册有两种方式,一种是直接创建服务,一种是注册实例时自动创建服务;前者可以让发起者在创建时期就制定一部分服务的元数据信息,而后者只会使用默认的元数据创建服务。
生命周期期间,用户可以向服务中新增,删除服务实例,同时也能够对服务的元数据进行修改。
用户主动发起删除服务的请求或一定时间内服务下没有实例(无论健康与否)后,服务才结束其生命周期,等待下一次的创建。

实例的生命周期

实例的生命周期开始于注册实例的请求。但是根据不同的持久化属性,实例后续的生命周期有一定的不同
持久化的实例:会通过健康检查的状态维护健康状态,但是不会自动的终止该实例的生命周期;在生命周期结束之前,持久化实例均可以被修改数据,甚至主动修改其健康状态唯一终止持久化实例生命周期的方式就是注销实例的请求
非持久化的实例:会根据版本的不同,采用不同的方式维持健康状态:如果是 Nacos1.0 的版本,会通过定时的心跳请求来进行续约,当超过一定时间内没有心跳进行续约时,该非持久化实例则终止生命周期;如果是Nacos2.0 的版本,会通过 gRPC 的长连接来维持状态,当连接发生中断时,该非持久化实例则终止生命周期。当然,非持久化实例也可以通过注销实例的请求,主动终止其生命周期,但是由于长连接和心跳续约的存在,可能导致前一个实例数据的生命周期刚被终止移除,立刻又因为心跳和长连接的补偿请求,再次开启实例的生命周期,给人一种注销失败的假象

集群的生命周期

集群的生命周期则相对复杂,由于集群作为服务和实例的一个中间层,因此集群的生命周期与实例和服务的生命周期均有关。
集群的生命周期开始与该集群第一个实例的生命周期同时开始,因为一个实例必定归属于一个集群,哪怕是默认的集群,因此当第一个实例的生命周期开始时,也就是集群生命周期的开始
一个集群下不存在实例时,集群的生命周期也不会立刻结束,而是会等到这个服务的生命周期结束时,才会一起结束生命周期

元数据的生命周期

元数据的生命周期基本和对应的数据模型保持一致。但是也如前文所说,元数据通常为运维人员的主动操作的数据,会被 Nacos 进行一段时间内的记忆,因此元数据的生命周期的终止相比对应的数据要滞后;若这滞后期间内,对应的数据又重新开始生命周期,则该元数据的生命周期将被立刻重置,不再终止。

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

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

相关文章

vue3中el-input在form表单按下回车刷新页面

摘要&#xff1a; 在input框中点击回车之后不是调用我写的回车事件&#xff0c;而是刷新页面&#xff01; 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 再写一个input 表单 &#xff0c;并设置style“display:none” <ElInput style"display…

畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)

畅阅读系统小程序 目录 基于java的畅阅读系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师…

用C语言实现通讯录(顺序表实现)

SeqList.h 顺序表的头文件 #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #include "Contact.h" typedef PerInfo SLDatatype;//PerInfo为结构体类型//动态顺序表 typedef struct SeqList {SLDatatype…

量产小妙招---向量间的Project和Product

1 背景 在日常工作中&#xff0c;不管是在感知或者规控&#xff0c;或者其它的模块中&#xff0c;经常需要处理两个向量之间的关系&#xff0c;这就引入了本篇博客和读者朋友们讨论的一个话题&#xff1a;Project和Product。 2 Project和Product 向量间的Project和Product在定义…

STM32单片机编程调试常见问题(二) Keil5软件调试中常见的配置问题

文章目录 一.概要二.‌Keil5‌调试时无法打断点并且部分代码语句执行被优化三.Keil5烧录STM32程序代码后无法自动复位四.Keil5调试时Watch界面中的变量不会实时更新五.Keil5编译后无法进行 go to跳转到变量或函数六.Keil5编辑时注释输入中文显示乱码问号七.Keil5退出调试时出现…

C. Bitwise Balancing

原题 C. Bitwise Balancing 解析 题意如图 我们要求 a , 其实 a 只要满足条件即可, 我们可以发现每一位都不会影响到其它位, 因此对每一位检查, 发现对b c a, d 有固定结果 b c a d 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 bcd 无法为 011 和 1…

【Python】2. 变量和数据类型

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

python和r语言的区别是什么

在从事数据分析行业中&#xff0c;我们都会从R与Python当中进行选择&#xff0c;但是&#xff0c;从这两个异常强大、灵活好用的数据分析语中选择&#xff0c;却是非常难以选择的。 为了让大家能选择出更适合自己的语言&#xff0c;我们将两种语言进行简单的对比。 Stack Ove…

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第十八章 Linux编写第一个自己的命令

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

Web APIs——Dom获取属性操作

1.变量声明 1.1以后声明变量我们优先使用哪个&#xff1f; const 有了变量先给const&#xff0c;如果发现它后面是要被修改的&#xff0c;再改为let 1.2 为什么const声明的对象可以修改里面的属性&#xff1f; 因为对象是引用类型&#xff0c;里面存储的是地址&#x…

从设计到做出一张光刻掩模版要多久?

知识星球里的学员问&#xff1a;光刻掩模版是如何做出来的&#xff0c;麻烦详细讲解下。 如上图&#xff0c;设计分为四步&#xff1a; 1. 讨论工艺步骤&#xff08;约1小时&#xff09;&#xff1a;工艺人员和设计人员会首先讨论掩膜板的设计要求&#xff0c;明确最终所需的图…

【含文档】基于Springboot+Vue的古风生活体验交流网站(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

红外画面空中目标检测系统源码分享

红外画面空中目标检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

麒麟操作系统部分目录介绍

图形系统目录 文字系统目录 &#xff08;1&#xff09;/bin&#xff1a;存放普通用户可以使用的命令文件。 &#xff08;2&#xff09;/boot&#xff1a;包含内核和其它系统程序启动时使用的文件。 &#xff08;3&#xff09;/dev&#xff1a;设备文件所在目录。在操作系统中…

【Linux】解锁磁盘文件奥秘,高效数据管理的实战技巧

磁盘文件 1. 引言2. 磁盘的机械构成3. 磁盘的物理存储3.1. CHS定位寻址法 4. 磁盘的逻辑存储4.1. LBA地址4.2. inode4.3. 分区、分组4.4. Boot Block4.5. 块组 — Block group4.5.1. inode Table4.5.2. Data Blocks4.5.3. inode Bitmap4.5.4. Block Bitmap4.5.5. GDT4.5.6. Sup…

c++primer第十三章 类继承

本章内容&#xff1a;单个类就可以提供用于管理对话框的全部资源。通常&#xff0c;类库是以源代码的方式提供的&#xff0c;这意味着可以对其进行修改&#xff0c;以满足需求。但是&#xff0c;C-提供了比修改代码更好的方法来扩展和修改类。这种方法叫作类继承(class inheria…

【Android 源码分析】Activity生命周期之onDestroy

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

命令行操作的基本指令【Linux】学完使用操作命令行就像喝汤一样快

致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 一、认识操作系统 1.1计算机层级结构 操作系统是一款进行软硬件资源管理的软件 计算机从最接近我们的开始是软件->操作系统->设备驱动->硬件,我们学习软件要学习他的使用方法,而…

【光伏混合储能】VSG并网运行,构网型变流器,虚拟同步机仿真

摘要 本文提出了一种基于光伏发电与混合储能系统结合的虚拟同步发电机&#xff08;VSG&#xff09;控制策略&#xff0c;该策略能够在并网运行时稳定电网电压和频率。通过仿真分析&#xff0c;验证了该策略在各种运行工况下的有效性&#xff0c;展示了其在电力系统中的广泛应用…

RDI ADCP命令与ASCII输出结构

RDI ADCP命令与ASCII输出结构 一、RDI垂直式ADCP:1.1固定命令&#xff1a;1.2 向导命令 二、RDI水平式ADCP三、ADCP 公共目录四、常用BBTalk命令五、ADCP的ASCII输出数据文件、流量与数据结构5.1 ASCII类输出&#xff1a;5.2 ASCII 输出数据文件头5.3 ASCII 输出数据集5.4 导航…