当前位置: 首页 > news >正文

Nacos详解

Nacos详解

  • Nacos详解
    • 一、引言
    • 二、Nacos概述
      • 2.1 定义与基本信息
      • 2.2 诞生背景与发展历程
      • 2.3 主要功能
    • 三、Nacos基本概念
      • 3.1 Namespace(命名空间)
      • 3.2 Group(分组)
      • 3.3 Configuration(配置)
      • 3.4 Service(服务)
      • 3.5 Instance(实例)
      • 3.6 Metadata(元数据)
    • 四、Nacos架构
      • 4.1 整体架构
      • 4.2 组件架构
      • 4.3 运行模式
    • 五、Nacos核心功能详解
      • 5.1 服务注册
      • 5.2 服务心跳
      • 5.3 服务同步
      • 5.4 服务发现
      • 5.5 服务健康检查
      • 5.6 动态配置管理
    • 六、Nacos与其他组件对比(以Eureka为例)
      • 6.1 功能特性对比
      • 6.2 性能与可用性对比
      • 6.3 生态与社区支持对比
    • 七、Nacos使用场景
      • 7.1 微服务架构中的服务注册与发现
      • 7.2 多环境配置管理
      • 7.3 流量管理与负载均衡
      • 7.4 服务治理与元数据管理

Nacos详解

在这里插入图片描述

一、引言

在微服务架构日益盛行的当下,服务的发现、配置与管理成为了关键问题。Nacos作为一款开源的动态服务发现、配置管理和服务管理平台,正逐渐成为构建云原生应用的重要基础设施。它致力于帮助开发者更便捷地处理服务相关的各种任务,极大地提升了微服务架构下应用开发与运维的效率。

二、Nacos概述

2.1 定义与基本信息

Nacos是Dynamic Naming and Configuration Service的首字母简称,即动态命名与配置服务 。它是一个为构建云原生应用而生的平台,提供了一组简单易用的特性集,助力开发者快速实现动态服务发现、服务配置、服务元数据及流量管理等功能。

2.2 诞生背景与发展历程

随着微服务架构的兴起,传统的服务管理和配置方式逐渐暴露出不足。开发者们急需一种能够集中管理服务配置、实现动态服务发现以及有效管理服务元数据的工具。Nacos应运而生,它是由阿里巴巴开源的项目,旨在解决微服务架构下的一系列痛点问题。自开源以来,Nacos凭借其强大的功能和易用性,吸引了众多开发者的关注,社区也在不断发展壮大,持续进行功能迭代和优化。

2.3 主要功能

  • 服务发现和服务健康监测:支持基于DNS和基于RPC的服务发现方式。基于DNS的服务发现使得服务消费者可以通过标准的DNS协议来查找服务实例;基于RPC的服务发现则更侧重于在RPC框架下快速定位服务。同时,Nacos能够对服务进行实时的健康检查,一旦发现不健康的主机或服务实例,会阻止向其发送请求,保障了系统的稳定性和可靠性。例如,在一个电商系统中,当某个商品服务实例出现故障时,Nacos可以及时检测到并将其从可用服务列表中剔除,避免用户请求被发送到该故障实例上。
  • 动态配置服务:以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。开发者可以在Nacos的控制台中方便地进行配置的编辑、存储、分发、变更管理、历史版本管理以及变更审计等操作。比如,在一个多环境(开发、测试、生产)的应用中,通过Nacos可以轻松实现不同环境下配置的快速切换和动态更新,无需修改代码并重新部署应用。
  • 动态DNS服务:支持权重路由,通过为不同的服务实例设置权重,能够更灵活地实现中间层负载均衡。同时,它还提供了更灵活的路由策略、流量控制功能,以及数据中心内网的简单DNS解析服务。例如,在流量高峰时期,可以通过调整服务实例的权重,将更多流量分配到性能较好的实例上,实现流量的合理分配。
  • 服务及其元数据管理:从微服务平台建设的视角出发,Nacos可以管理数据中心的所有服务及元数据。服务元数据包括服务端点、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。通过对这些元数据的管理,开发者可以更好地对服务进行分类、筛选、监控和治理。

三、Nacos基本概念

3.1 Namespace(命名空间)

Namespace是同一地域内,用于进行租户粒度配置隔离的逻辑空间。其常用场景之一是区分不同环境的配置,例如将开发测试环境和生产环境的资源(如配置、服务)进行隔离。通过Namespace,不同租户或不同环境可以拥有相互独立的配置和服务空间,避免相互干扰。例如,一个大型企业可能有多个业务线,每个业务线可以看作一个租户,通过Namespace可以为每个业务线分配独立的配置和服务资源,确保各业务线之间的配置和服务相互隔离。

3.2 Group(分组)

Group是Nacos中组织配置的一个维度,它可以将相关的配置集归为一组。默认情况下,分组为DEFAULT_GROUP。通过分组,可以更好地对配置进行分类管理。比如,在一个电商系统中,可以将商品相关的配置归为一个分组,订单相关的配置归为另一个分组,方便查找和管理。

3.3 Configuration(配置)

这里的配置涵盖了系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。配置是Nacos实现动态配置管理的核心对象,开发者可以通过Nacos的API或控制台对配置进行各种操作。例如,修改应用的数据库连接配置、调整服务的超时时间配置等,都可以在Nacos中轻松完成。

3.4 Service(服务)

在Nacos中,Service代表一个可被发现和调用的微服务。一个Service下可能包含多个服务实例,每个实例具有自己的IP地址、端口号等信息。例如,在一个订单服务中,可能存在多个部署在不同服务器上的订单服务实例,这些实例共同构成了订单Service。

3.5 Instance(实例)

Instance是服务的具体实例,它包含了服务的具体运行信息,如IP、端口号、服务名、集群名等。客户端启动时会将当前服务的这些信息封装为一个Instance对象,然后向Nacos服务器进行注册。Nacos服务器通过管理这些Instance对象,实现对服务实例的健康检查、负载均衡等功能。

3.6 Metadata(元数据)

Nacos中的元数据是对Nacos数据(如配置和服务)的描述信息。从作用范围来看,分为服务级别的元信息(如服务版本、权重、容灾策略、负载均衡策略、鉴权配置等 )、集群的元信息以及实例的元信息。元数据为服务的管理和治理提供了丰富的信息,有助于实现更精细化的服务管理。例如,通过设置服务级别的元数据中的权重,可以实现基于权重的负载均衡;通过设置鉴权配置元数据,可以对服务的访问进行权限控制。

四、Nacos架构

4.1 整体架构

Nacos的架构融合了服务注册发现中心、配置中心、服务管理等功能,类似于Eureka/Consule + Config + Admin的合体。它主要由Nacos Server和Nacos Client两部分组成。Nacos Server是服务端,负责存储服务实例信息、配置信息等,并提供相关的管理接口;Nacos Client是客户端,集成在应用程序中,负责向Nacos Server注册服务实例、获取配置信息以及与Nacos Server进行通信等操作。

4.2 组件架构

  • configservice:主要用于处理配置信息的增删改查操作。它提供了一系列API,使得开发者可以方便地对配置进行管理。例如,通过调用configservice的API,可以新增一个配置项、修改已有的配置值、删除不再需要的配置,以及查询当前的配置信息等。
  • namingservice:负责服务注册与发现。客户端通过调用namingservice的相关接口,将自身服务实例信息注册到Nacos Server上,同时服务消费者也通过该组件从Nacos Server获取服务提供者的列表信息,实现服务的发现功能。

4.3 运行模式

  • standalone模式(单机模式):适用于测试环境或开发环境。在该模式下,Nacos Server以单节点的形式运行,使用自带的嵌入式数据库Derby来存储数据。这种模式部署简单,启动迅速,能够快速满足开发者在开发和测试阶段对Nacos功能进行验证的需求。例如,开发者在本地进行项目开发时,可以使用standalone模式启动Nacos Server,方便进行服务注册和配置管理的测试。
  • cluster模式(集群模式):适用于生产环境。在cluster模式下,Nacos Server由多个节点组成集群,节点之间通过特定的协议进行数据同步和协调。由于生产环境对数据的一致性、高可用性要求较高,所以通常需要使用外部数据库(如MySQL )来存储数据,以保证多个节点之间数据的统一和可靠。例如,在一个大型电商平台的生产环境中,大量的微服务需要注册和管理,使用cluster模式可以确保Nacos Server的高可用性和数据一致性,保障系统的稳定运行。

五、Nacos核心功能详解

5.1 服务注册

Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,并提供自身的元数据,如ip地址、端口等信息。Nacos Server接收到注册请求后,会把这些元数据信息存储在一个双层的内存Map中,其格式为Map(namespace, Map(group::serviceName, Service)) 。例如,一个用户服务实例在启动时,会将自身的IP地址为192.168.1.100、端口为8080等信息封装成Instance对象,然后通过REST请求发送给Nacos Server进行注册。Nacos Server会根据该服务所属的Namespace、Group和ServiceName,将其存储在对应的内存Map位置中。

5.2 服务心跳

在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,表明服务一直处于可用状态,防止被剔除。默认情况下,每5秒发送一次心跳。当Nacos Server接收到心跳请求后,会去检查当前服务列表中是否存在该实例。如果不存在,会将当前服务实例重新注册;如果存在,则会立即开启一个异步任务,更新客户端实例的最后心跳时间。若当前实例之前处于非健康状态,则会将其改为健康状态。比如,在一个订单服务中,订单服务实例会定时向Nacos Server发送心跳请求,以维持自身在Nacos Server中的存活状态。

5.3 服务同步

Nacos Server集群之间会互相同步服务实例,以保证服务信息的一致性。当一个Nacos Server节点接收到新的服务注册请求或服务实例信息变更请求时,会将相关信息同步到集群中的其他节点。在同步过程中,对于持久化数据,会使用基于CP模式的简单Raft协议,通过leader节点将实例数据更新到内存和磁盘文件中,并且必须保证集群半数以上节点写入成功才会给客户端返回成功;对于非持久化实例数据,会使用基于AP模式的Distro协议,向任务阻塞队列添加一个本地服务实例改变任务,去更新本地服务列表,然后遍历集群中所有节点,分别创建数据同步任务放进阻塞队列异步进行集群数据同步,不保证集群节点数据同步完成即可返回。这样,无论从哪个Nacos Server节点获取服务信息,都能得到相对一致的结果。

5.4 服务发现

服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并缓存在Nacos Client本地。同时,Nacos Client会在本地开启一个定时任务,定时拉取服务端最新的注册表信息更新到本地缓存。服务端在发生心跳检测、服务列表变更或者健康状态改变时会触发推送事件,在推送事件中会基于UDP通信将服务列表推送到客户端,同时开启定时任务,每隔10秒定时推送数据到客户端。例如,在一个电商系统中,商品展示服务(服务消费者)需要调用商品详情服务(服务提供者),它会先从Nacos Server获取商品详情服务的实例列表,然后根据一定的负载均衡策略选择一个实例进行调用。并且,商品展示服务会定时更新本地缓存的商品详情服务实例列表,以保证获取到最新的服务信息。

5.5 服务健康检查

Nacos Server会开启一个定时任务来检查注册服务实例的健康情况。对于超过15秒没有收到客户端心跳的实例,会将它的healthy属性置为false(此时客户端服务发现时不会发现该实例 );如果某个实例超过30秒没有收到心跳,Nacos Server会直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册 )。通过这种健康检查机制,Nacos可以确保服务列表中的实例都是健康可用的,提高了系统的稳定性和可靠性。比如,在一个分布式的物流服务系统中,当某个物流节点服务实例出现故障,无法按时发送心跳时,Nacos Server会及时将其标记为不健康或剔除,避免其他服务向该故障节点发送请求。

5.6 动态配置管理

  • 配置编辑与存储:Nacos提供了一个简单易用的UI界面,开发者可以在该界面上对配置进行编辑。配置信息会被存储在Nacos Server中,支持多种数据格式,如常见的JSON、YAML等。例如,开发者可以在UI界面上修改应用的数据库连接配置,将原来的数据库地址从旧地址修改为新地址,并保存配置。
  • 配置分发与变更管理:当配置发生变更时,Nacos会通过长连接的方式实时推送变更后的配置信息给相关的Nacos Client。Nacos Client接收到配置变更通知后,会自动更新本地的配置。同时,Nacos还支持配置的历史版本管理和变更审计功能。开发者可以查看配置的历史版本,了解配置的变更记录,并且可以对配置的变更进行审计,追踪是谁在什么时间进行了配置的修改。例如,在一个金融应用中,对配置的变更需要严格审计,Nacos的变更审计功能可以满足这一需求,确保配置变更的可追溯性和安全性。
  • 配置拉取:除了服务端主动推送配置变更外,Nacos Client也可以主动向Nacos Server拉取配置信息。在应用启动时,Nacos Client会从Nacos Server拉取最新的配置信息,用于初始化应用。在应用运行过程中,也可以根据需要手动触发拉取操作,获取最新的配置。

六、Nacos与其他组件对比(以Eureka为例)

6.1 功能特性对比

  • 服务发现:Nacos和Eureka都支持服务发现功能,但Nacos支持基于DNS和基于RPC的服务发现,相比Eureka,在服务发现方式上更加多样化。例如,在一些对DNS依赖较大的场景中,Nacos可以更好地满足需求。
  • 配置管理:Eureka主要侧重于服务注册与发现,对于配置管理功能相对较弱。而Nacos提供了强大的动态配置管理功能,能够以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置,在配置管理方面具有明显优势。比如,在一个多环境、配置频繁变更的应用中,Nacos的配置管理功能可以大大提高配置管理的效率和灵活性。
  • 数据一致性协议:Nacos支持AP(可用性和分区容错性)和CP(一致性和分区容错性)两种模式。在AP模式下,基于Distro协议,能够保证系统的高可用性,在集群部分节点出现故障时仍能提供服务;在CP模式下,基于Raft协议,能够保证数据的强一致性。而Eureka主要采用AP模式,在数据一致性方面相对较弱。例如,在对数据一致性要求较高的金融领域,Nacos的CP模式可以更好地满足需求。

6.2 性能与可用性对比

  • 性能:在高并发场景下,Nacos通过多种优化机制,如缓存机制、高效的网络通信等,能够保持较好的性能表现。同时,Nacos的服务同步机制在集群模式下也能有效地保证数据的一致性和实时性,减少性能开销。而Eureka在高并发场景下,可能会出现服务注册和发现的延迟问题,性能相对受限。
  • 可用性:Nacos的集群模式通过节点间的数据同步和故障转移机制,能够提供较高的可用性。即使部分节点出现故障,整个集群仍然可以继续提供服务。Eureka虽然也支持集群部署来提高可用性,但在某些极端情况下,可能会出现服务不可用的情况。

6.3 生态与社区支持对比

  • 生态:Nacos作为Spring Cloud Alibaba套件的重要组件之一,与其他组件(如Sentinel、AliCloud OSS等 )紧密集成,形成了完整的微服务解决方案生态。它可以与Spring Cloud、Spring Boot等框架无缝结合,方便开发者在已有的项目中引入和使用。Eureka则主要与Spring Cloud Netflix套件集成,生态相对较为单一。
  • 社区支持:Nacos拥有活跃的社区,不断有新的功能被开发和优化,同时社区也提供了丰富的文档、教程和示例代码,方便开发者学习和使用。Eureka的社区活跃度相对较低,在功能更新和问题解决方面的速度相对较慢。

七、Nacos使用场景

7.1 微服务架构中的服务注册与发现

在微服务架构中,存在大量的服务实例,这些服务实例需要能够动态地注册到注册中心,并被其他服务发现和调用。Nacos提供的服务注册与发现功能可以很好地满足这一需求。例如,在一个电商微服务系统中,商品服务、订单服务、支付服务等多个微服务可以将自己的实例注册到Nacos中,当订单服务需要调用商品服务时,通过Nacos可以快速发现可用的商品服务实例,实现服务之间的通信。

7.2 多环境配置管理

在软件开发过程中,通常会有开发、测试、生产等多个环境,不同环境下的配置可能存在差异。Nacos的动态配置服务可以实现对不同环境配置的集中管理和动态更新。比如,在开发环境中,数据库连接配置可能指向开发数据库;在生产环境中,则指向生产数据库。通过Nacos,开发者可以在控制台中轻松切换和修改不同环境下的配置,无需修改代码并重新部署应用,提高了配置管理的效率和准确性。

7.3 流量管理与负载均衡

Nacos的动态DNS服务支持权重路由和灵活的路由策略,可以实现中间层负载均衡和流量控制。在一个高并发的Web应用中,通过Nacos可以为不同的服务实例设置不同的权重,将流量合理地分配到各个实例上,避免某个实例负载过高。同时,还可以根据不同的条件(如请求来源、请求时间等 )制定路由策略,实现更精细化的流量管理。

7.4 服务治理与元数据管理

Nacos可以对服务及其元数据进行管理,通过设置服务的元数据(如服务版本、权重、容灾策略、负载均衡策略、鉴权配置等 ),可以实现对服务的治理和优化。例如,通过设置服务的容灾策略,可以在服务出现故障时进行快速的故障转移;通过设置鉴权配置

相关文章:

  • Python 第 12、13 节课 - 元组和列表
  • Linux基本指令(保姆级教学)
  • 【新技术】Testfy.js v3.0 深度解析与使用指南
  • 关于循环缓冲区
  • MUC基本知识
  • 基于javaweb的SpringBoot小说阅读系统设计与实现(源码+文档+部署讲解)
  • Threejs中顶视图截图
  • Python dotenv 使用指南:轻松管理项目环境变量
  • Bento4的安装和简单转码
  • Linux基础指令【上】
  • 写时拷贝讲解
  • dubbo 隐式传递
  • Python项目实践:控制台银行系统与词频统计工具开发指南
  • 【project】--模拟搭建一个中小型校园网的网络平台
  • SpringBoot 常用注解通俗解释
  • 何恺明团队又发新作!!-用于物理推理的去噪哈密顿网络
  • Linux基础命令总结
  • Set的学习
  • 论文如何降低AIGC?(完整指南版)
  • 【Linux系统篇】:信号的生命周期---从触发到保存与捕捉的底层逻辑
  • 从“网点适老化”到“社区嵌入式”,“金融为老上海模式”如何探索?
  • 上海市市管干部任职前公示:赵亮拟为地区区长人选
  • 葛兰西的三位一体:重提并复兴欧洲共产主义的平民圣人
  • 来论|如何看待韩企在美申请“饺子”专利
  • 手机号旧机主信用卡欠款、新机主被催收骚扰四年,光大银行济南分行回应
  • 财政部部长蓝佛安:中国将采取更加积极有为的宏观政策