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

文章目录

服务(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 进行一段时间内的记忆 ,因此元数据的生命周期的终止相比对应的数据要滞后 ;若这滞后期间内,对应的数据又重新开始生命周期,则该元数据的生命周期将被立刻重置,不再终止。

相关推荐
beata1 分钟前
Java基础-9:深入 Java 虚拟机(JVM):从底层源码到核心原理的全面解析
java·后端
roman_日积跬步-终至千里6 分钟前
【MLOps(1)】MLOps 架构总览与全方位基础:从实验室到生产环境的实战指南
架构
SimonKing11 分钟前
分享一款可以管理本地端口的IDEA插件:Port Manager
java·后端·程序员
索荣荣17 分钟前
Maven配置文件(pom.xml)终极指南
java·开发语言
代码栈上的思考31 分钟前
SpringBoot 拦截器
java·spring boot·spring
送秋三十五34 分钟前
一次大文件处理性能优化实录————Java 优化过程
java·开发语言·性能优化
龙山云仓36 分钟前
MES系统超融合架构
大数据·数据库·人工智能·sql·机器学习·架构·全文检索
雨中飘荡的记忆37 分钟前
千万级数据秒级对账!银行日终批处理对账系统从理论到实战
java
jbtianci42 分钟前
Spring Boot管理用户数据
java·spring boot·后端
Sylvia-girl1 小时前
线程池~~
java·开发语言