本文转载自微信公众号《捉虫大师》,作者为捉虫大师。转载本文请联系捕虫大师公众号。前言中,在上一篇文章中分析了Nacos配置中心。配置中心的核心是配置的创建、读取和推送。注册中心的核心是比配置中心多一个服务检测模块。两者的相似度非常高。连阿里内部的注册中心都叫ConfigServer。Nacos注册中心将分为几个模块进行分析。本文着重于概要设计,基于2.0.0版本。环境搭建使用Nacos源码搭建源码阅读调试环境,请参考?Nacos调试环境搭建部分。其中JVM参数可以指定只启动Naming模块,也可以不指定,默认全部启动。在example模块下复制一份NamingExample进行测试。设计总结服务发现模型客户端视角的服务发现模型(注意:服务端视角的模型定义与客户端的定义不同)包括以下几点:Service:ServiceCluster:ClusterInstance:InstanceCode点评:我们引入了一个'服务-->集群-->实例'的模型,其中服务存储了一个集群列表,其中又包含了一个实例列表,它们之间的关系如下服务名:服务名protectThreshold:保护阈值,其中限制可以检测和删除的最大实例数ScaleappName:服务的应用名称,暂无实际用途groupName:组名metadata:元数据ClusterserviceName:所属服务名称name:集群名称服务检测配置,这里只对服务端主动检测生效,有TCP、HTTP、MySQL、None,默认TCPdefaultPort:默认端口defaultCheckPort:默认检测端口useIPPort4Check:是否使用端口进行检测metadata:metadataInstanceinstanceId:实例id,唯一标志,Nacos提供了两种simple和snowflake,默认是simple,生成方式为ip#port#clusterName#serviceNameip:instanceipport:实例端口weight:实例权重healthy:实例健康状态clusterName:所属集群名称serviceName:所属服务名称metadata:elementDataenabled:是否接收请求,可以用于临时禁用或提取流等场景。ephemeral:是否为临时实例,后面会介绍。getInstanceHeartBeatInterval:获取实例心跳上报间隔,默认5秒,可配置getInstanceHeartBeatTimeOut:获取心跳超时时间,15秒,配置getIpDeleteTimeout:获取删除ip的超时时间,默认30秒,可配置getInstanceIdGenerator:获取id生成器Nacos注册中心和配置中心除了上述三层模型外,还有相同的命名空间设计与客户端绑定,可以隔离环境,租户接口设计registerInstance:注册一个实例deregisterInstance:取消一个实例getAllInstances:获取一个服务的所有实例(包括不健康的)selectInstances:根据条件获取一个服务实例selectOneHealthyInstance:根据负载均衡策略获取一个健康的服务实例subscribe:订阅服务unsubscribe:取消订阅服务getServicesOfServer:根据条件分页获取所有服务交互流程Nacos2.0针对不同的ephemeralinstance提供了两套流程:ephemeral=false,permanentinstance,与server端的交互使用http请求,和服务器节点间数据同步使用raft协议,健康检查使用服务器端主动检测机制ephemeral=true,临时实例,与服务器端交互使用grpc请求,服务器节点间数据同步使用分发协议和健康检查使用TCP连接的KeepAlive方式与临时实例交互Process客户端初始化,与服务器建立连接,只与其中一个服务器节点建立长连接。客户端注册服务,打包serviceName+ip+port+clusterName等数据并发送grpc请求。同时,客户端缓存注册的服务。当客户端与服务器的连接断开再重新连接时,客户端重新向服务器注册数据。服务器接收到客户端的注册请求,将注册信息存储在客户端对象中(用于保存客户端的所有数据),并触发ClientChangedEvent、ClientRegisterServiceEvent、InstanceMetadataEventClientChangedEvent触发服务器节点间的数据同步(distro协议)ClientRegisterServiceEvent触发更新publisherIndexes(saveservice=>clientIdMapInstanceMetadataEvent,processmetadata,Nacosin2.在0中,元数据和基础数据被分离到不同的处理过程中。客户端订阅服务根据serviceName、groupName、clusters信息生成key,创建eventListener,同时向服务端发送订阅请求,缓存订阅信息,用于连接断开重连后,服务端发送信息再次发送给服务器。服务端收到客户端的订阅请求,将订阅信息打包成订阅者,保存在客户端对象中。ClientSubscribeServiceEvent事件被触发。ClientSubscribeServiceEvent事件更新subscriberIndexes(saveservice=>clientId'sMapServiceSubscribedEvent事件)服务的最新数据会延迟500ms推送给客户端。注销、退订等反向操作与正向操作类似,不再重复最后,本文从总体上分析了Nacos2.0的模型设计、界面设计和交互过程,看完之后对Nacos服务发现有了一个整体的认识,后续章节会从细节入手,比如dubboNacosextension、一致性协议、probing、CMDB扩展等一一分析。