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

文章目录

        • 服务(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.mfbz.cn/a/887337.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Meachines] [Easy] Sea WonderCMS-XSS-RCE+System Monitor 命令注入

信息收集 IP AddressOpening Ports10.10.11.28TCP:22,80 $ nmap -p- 10.10.11.28 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 e3:54:…

计算机视觉——图像修复综述篇

目录 1. Deterministic Image Inpainting 判别器图像修复 1.1. sigle-shot framework (1) Generators (2) training objects / Loss Functions 1.2. two-stage framework 2. Stochastic Image Inpainting 随机图像修复 2.1. VAE-based methods 2.2. GAN-based methods …

第 21 章 一条记录的多幅面孔——事务的隔离级别与 MVCC

21.1 事前准备 CREATE TABLE hero ( number INT, NAME VARCHAR ( 100 ), country VARCHAR ( 100 ), PRIMARY KEY ( number ) ) ENGINE INNODB CHARSET utf8;INSERT INTO hero VALUES ( 1, 刘备, 蜀 );21.2 事务隔离级别 在保证事务隔离性的前提下,使用不同的隔…

RTX4060+ubuntu22.04+cuda11.8.0+cuDNN8.6.0 如何根据显卡型号和系统配置cuda和cuDNN所需的安装环境

文章目录 🌕电脑原配置🌕安装cuda和cuDNN前的环境选择🌙cuDNN与CUDA tookit和nvidia driver的对应关系🌙cuda版本选择⭐查看自己的nvidia driver版本和最大支持的CUDA版本⭐最小支持版本 🌙查看11.8.0版本的cuda和ubun…

Redis:hash类型

Redis:hash类型 hash命令设置与读取HSETHGETHMGETHSETNX 哈希操作HEXISTSHDELHKEYSHVALSHGETALLHLENHINCRBYHINCRBYFLOAT 内部编码ziplisthashtable 目前主流的编程语言中,几乎都提供了哈希表相关的容器,Redis自然也会支持对应的内容&#xf…

数据结构之树(4)

摘要:本篇主要讲哈夫曼树、并查集、二叉排序树、平衡二叉树等,非常非常非常重要!!! 一、哈夫曼树 基于霍夫曼树,利用霍夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,…

OpenCV透视变换

#透视变换 import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread(coins.jpg,1)imgInfo img.shape height imgInfo[0] width imgInfo[1] #src 4->dst 4 (左上角 左下角 右上角 右下角) matSrc np.float32([[200,100],[200,400],[600,100],[wid…

Linux:进程间通信之信号量

system V的进程间通信除了共享内存,还有消息队列和信号量 IPC(进程间通信的简称) 消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同…

Ray_Tracing_The_Next_Week下

5image Texture Mapping 图像纹理映射 我们之前虽然在交点信息新增了uv属性,但其实并没有使用,而是通过p交点笛卡尔坐标确定瓷砖纹理或者大理石噪声纹理的值 现在通过uv坐标读取图片,通过std_image库stbi_load(path)…

Kubernetes云原生存储解决方案之 Rook Ceph实践探究

Kubernetes云原生存储解决方案之 Rook Ceph实践探究 除了手动部署独立的 Ceph 集群并配置与Kubernetes进行对接外,Rook Ceph 支持直接在 Kubernetes 集群上部署 Ceph 集群。 通过Rook Ceph云原生存储编排平台,使得 Kubernetes 集群中启用高可用的 Ceph…

【记录】Excel|Excel 打印成 PDF 页数太多怎么办

【记录】Excel|解决 Excel 打印成 PDF 页数过多的问题 文章目录 【记录】Excel|解决 Excel 打印成 PDF 页数过多的问题方法一:调整页边距WPS OfficeMicrosoft Excel 方法二:优化页面布局调整列宽和行高使用“页面布局”视图合并单…

蓝牙定位的MATLAB仿真程序(基于信号强度,平面内的定位,四个蓝牙基站)

这段代码通过RSSI信号强度实现了蓝牙定位,展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。它涵盖了信号衰减模型、距离计算和最小二乘法估计等基本概念。通过图形化输出,用户可以直观地看到真实位置与估计位置的关系。 文章目录 蓝牙定位原理蓝牙定位的原理优缺…

实验5 累加器实验

实验5 累加器实验 6.1实验目的 1、理解累加器的概念和作用。 2、连接运算器、存储器和累加器,熟悉计算机的数据通路。 3、掌握使用微命令执行各种操作的方法。 6.2实验要求 1、做好实验预习,读懂实验电路图,熟悉实验元器件的功能特性和使用…

网络基础 【HTTP】

💓博主CSDN主页:麻辣韭菜💓   ⏩专栏分类:Linux初窥门径⏪   🚚代码仓库:Linux代码练习🚚 💻操作环境: CentOS 7.6 华为云远程服务器 🌹关注我🫵带你学习更多Linux知识…

保险丝基础知识

一、简介 保险丝(fuse)也被称为电流保险丝,它能够在电流异常升高到一定的高度和热度时,自动熔断切断电流,从而保护电路安全运行。 IEC127标准将它定义为“熔断体(fuse-link)”。熔断体是由电阻率比较大而熔…

【Linux】进程间关系与守护进程

超出能力之外的事, 如果永远不去做, 那你就永远无法进步。 --- 乌龟大师 《功夫熊猫》--- 进程间关系与守护进程 1 进程组2 会话3 控制终端4 作业控制5 守护进程 1 进程组 之前我们提到了进程的概念, 其实每一个进程除了有一个进程 ID(P…

计算机网络的整体认识---网络协议,网络传输过程

计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 广域网WAN: 将远隔千里的计算机都连在一起;所谓 "局域网" 和 "广域网" 只是一个相…

MetaJUI v0.4 遇到的一些问题及解决办法记录

1、Unity3d 版本 2022.3.29f1。 2、MetaJUI v0.4 的下载,https://download.csdn.net/download/xingchengaiwei/89334848 3、将MetaJUI v0.4解压,用Unity3d 打开项目,会出现如下问题,按照图中提示操作即可。 4、打开工程后会出现…

【2024年最新】基于Spring Boot+vue的旅游管理系统lw+ppt

作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…

【Linux进程间通信】Linux匿名管道详解:构建进程间通信的隐形桥梁

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 ❀Linux进程间通信 📒1. 进程间通信介绍📚2. 什么是管道📜3…