1、nacos功能简介 | 您所在的位置:网站首页 › nacos是什么 › 1、nacos功能简介 |
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。 以上这段介绍引用自nacos官方文档,说的比较官方,术语比较专业,通俗一点说,其实nacos有两大最为核心的功能:注册中心与配置中心,下面就先从nacos主要功能点出发对nacos进行展开介绍。本篇文章主要是介绍nacos的一些核心功能,然后接下来我将分成多篇文章来对这些功能和原理进行详细介绍。 关于nacos环境搭建、安装和配置我就不再详述,官方文档提供了很详细的说明,可以参考nacos官网 我使用的版本是1.4.1,不同版本之间会有细节上的差别,但是主体流程是差不多的。 1、nacos总体架构 (1) 服务注册与发现 服务注册与发现显然是注册中心的核心了,这里首先明确几个概念: nacos-server: 用于接收nacos-client端的服务注册请求并保存到注册表; nacos-client: 用于将服务注册到nacos-server,如用户下单操作,用户服务调用订单服务,此时订单服务就是服务提供者,服务提供者需要注册到注册中心,那么它就是nacos-client; 服务调用者: 用户服务就是服务调用者。 (1.1)服务注册工作流程 nacos-client(如订单服务)启动时,就会去注册中心进行服务注册,其实就是通过HTTP请求调用nacos-server,当nacos-server端接收到客户端的注册请求时,会将客户端的实例数据(包括ip、端口、微服务名等)保存到server端的注册表中(内存),如果订单服务是集群部署,那么同一个微服务名就会有多个实例数据形成一个实例列表。 (1.2)服务发现工作流程 当用户服务调用订单服务时,首先会去nacos-server端获取注册表中的实例列表并存放在用户服务的本地内存中,再根据负载策略从实例列表中选出一个实例进行调用。 (2)客户端心跳机制 nacos-client进行服务注册时(具体时机是调用nacos-server注册接口之前),会开启心跳任务,默认每5秒(可通过元数据参数preserved.heart.beat.interval进行设置)向nacos-server发送心跳,告诉服务端我还活着,不要将我剔除。 (3)服务端健康检查 nacos-server接收到client端的服务注册请求后,将注册的实例数据写到注册表之前,会首先开启一个健康检查的定时任务(首次启动会延迟5秒执行,之后每5秒执行一次),其实主要就是处理nacos-client的心跳信息的,如果客户端实例超过15秒还没有发送心跳过来,则将实例健康状态改成false;如果客户端实例超过30秒还没有发送心跳过来,则剔除该实例。 (4)集群数据一致性管理 如果nacos-server是集群部署,那么还需要考虑集群节点之间的数据一致性的问题,如何保证集群数据一致?集群挂了部分节点如何应对?节点恢复了如何保证数据跟其它节点一致?等等。nacos也有一系列的处理策略: (4.1)客户端实例注册信息同步到nacos-server集群其它节点 nacos-server完成服务注册后,会开启一个定时任务,定时将自己注册表数据广播给集群其它节点,完成同步,相关代码:DistroProtocol.sync(…)。 (4.2)集群节点状态同步任务 集群节点之间相互同步节点状态,如果有节点宕机了,集群其它节点会感知到并更新集群节点的状态,这个会影响权威节点的计算,相关代码:ServerStatusReporter。 (4.3)注册服务实例信息在机器节点间的同步任务 nacos-server服务启动时,会开启该任务,这里需要说一个概念:权威节点,对于集群部署,服务注册时只会注册到其中一个集群节点,然后该节点数据会同步到其它节点,同步数据时,会根据注册实例的服务名进行hash计算并对集群节点数量取模,计算方式如:istroHash(serviceName) % servers.size(),根据得到的下标获取对应的集群节点,实际上是由该节点进行数据广播给其它节点,该节点就叫做权威节点,因此每个实例只会由固定一个权威节点负责同步给其它集群节点。每个实例数据不用所有server节点都去同步一遍,没有那个必要,这样做的好处是节省资源,提高了性能,同时也避免了多个节点数据如果某时刻不一致的话,都去同步这个实例可能会造成最新的数据被老的覆盖,相关代码:ServiceReporter类。 (4.4)集群数据拉取 nacos-server服务启动时,会开启该任务,该任务是一个线程,递归执行,会以轮询的方式去其它集群节点的本地快照中(就是注册表的一个缓存,数据同注册表)拉取实例数据(拉到了就返回,所以实际上只会到其中个集群节点去拉取,没有必须去所有节点都拉取一遍,这样也是为了节约资源、提升性能),更新到自己的注册表和本地快照中。这个线程主要保障了一个场景:如果某个server节点挂了,那么它的数据跟其它节点肯定不一致了,下次重新启动的时候该线程就会从其它节点拉取保证数据的同步,相关代码:DistroProtocol.startLoadTask()。 (4.5)集群数据对账 nacos-server服务启动时,会开启该定时任务,5秒一次,数据对账是4.4的补偿措施,作为兜底,定时将本节点数据广播给其它节点,处理流程跟4.4类似,相关代码:DistroProtocol.startVerifyTask()。 (5)客户端与服务端交互 (5.1)客户端定时拉取服务端注册实例数据 客户端会有一个定时任务,定时去拉取服务端的实例列表数据并更新到客户端本地内存中,相关实现代码:HostReactor类; (5.2)服务端推送 服务端注册数据发生了变更,会通过udp推送到客户端,如果客户端需要实时监听到服务端注册数据的变化,就需要客户端开通udp端口,相关实现代码:PushService类; 2.2 配置中心 配置中心相对更好理解一些,即可以将项目中的配置放到nacos配置中心中,这样配置与项目即可实现解耦。 2.3 OpenAPI nacos也对外也提供了关于服务注册与发现、配置管理、命名空间相关操作的OpenAPI,参考官网:https://nacos.io/zh-cn/docs/open-api.html,主要用于支持异构项目,虽然目前nacos客户端主要是以Java语言开发的项目为主,而且官方当前也仅提供了Java版本的客户端(不过nacos开源社区已经有了多种语言的SDK),但是nacos立意深远,目标远不止于此,将来官方很可能还会提供其它语言版本的客户端,但是目前异构版本需要用户自己与nacos进行整合,因此nacos对外提供了这些OpenAPI供用户使用。 本文对nacos的核心功能做了一些大致的介绍,后面会以这些功能点为维度配以源码+画图的方式分别讲解它们的实现原理,详情请见下文。 |
CopyRight 2018-2019 实验室设备网 版权所有 |