本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。

前言

在之前的文章中分析了Nacos配置中心,配置中心的核心是配置的创建、读取、推送。

注册中心的核心比配置中心多一个服务探活模块,他俩的相似度非常高,甚至阿里内部的注册中心就叫ConfigServer。

Nacos注册中心打算分成几个模块来分析,本文重点在于概要设计,基于2.0.0版本。

环境搭建

用Nacos的源码来搭建源码阅读和调试环境,可参考《Nacos配置中心模块详解》 Nacos调试环境搭建部分。

其中 JVM参数可以指定只启动Naming模块,也可以不指定,默认全都启动。

example模块下将NamingExample复制一份进行测试。

设计概要

服务发现模型

客户端视角的服务发现模型(注意:服务端视角的模型定义与客户端视角有区别)包含以下几点内容:

  • Service:服务
  • Cluster:集群
  • Instance:实例

代码注释:We introduce a 'service --> cluster --> instance' model, in which service stores a list of clusters, which contains a list of instances

他们的关系如下

Service

  • name:服务名
  • protectThreshold:保护阈值,限制了实例被探活摘除的最大比例
  • appName:服务的应用名,暂无实际用处
  • groupName:分组名
  • metadata:元数据

Cluster

  • serviceName:所属服务名
  • name:集群名
  • healthChecker:服务探活配置,此处仅对服务端主动探活生效,有TCP、HTTP、MySQL、None几种方式,默认TCP
  • defaultPort:默认端口
  • defaultCheckPort:默认探活端口
  • useIPPort4Check:是否使用port进行探活
  • metadata:元数据

Instance

  • instanceId:实例id,唯一标志,Nacos提供了simple和snowflake两种算法来生成,默认是simple,其生成方式为ip#port#clusterName#serviceName
  • ip:实例ip
  • port:实例port
  • weight:实例权重
  • healthy:实例健康状态
  • clusterName:所属集群名
  • serviceName:所属服务名
  • metadata:元数据
  • enabled:是否接收请求,可用于临时禁用或摘流等场景
  • ephemeral:是否为临时实例,后文会介绍该参数

  • getInstanceHeartBeatInterval:获取实例心跳上报间隔时间,默认5秒,可配置
  • getInstanceHeartBeatTimeOut:获取心跳超时时间,15秒,配置
  • getIpDeleteTimeout:获取ip被删除的超时时间,默认30秒,可配置
  • getInstanceIdGenerator:获取id生成器

除了上述的三层模型外,Nacos注册中心和配置中心有着一样的namespace设计,与client绑定,可隔离环境,租户。

接口设计

  • registerInstance:注册实例
  • deregisterInstance:注销实例
  • getAllInstances:获取一个服务的所有实例(包括不健康)
  • selectInstances:根据条件获取一个服务的实例
  • selectOneHealthyInstance:根据负载均衡策略获取服务的一个健康的实例
  • subscribe:订阅服务
  • unsubscribe:取消订阅服务
  • getServicesOfServer:根据条件分页获取所有服务

交互流程

Nacos 2.0 为ephemeral不同的实例提供了两套流程:

  • ephemeral=false,永久实例,与server端的交互采用http请求,server节点间数据同步采用了raft协议,健康检查采用了server端主动探活的机制
  • ephemeral=true,临时实例,与server端的交互采用grpc请求,server节点间数据同步采用了distro协议,健康检查采用了TCP连接的KeepAlive模式

临时实例的交互流程

  • client初始化,与server建立连接

    • 只与其中一台server节点建立长连接
  • client 注册服务,将serviceName+ip+port+clusterName等数据打包发送grpc请求

    • 同时客户端缓存已注册过的服务,当client与server连接断开重连时,client重新将这些数据注册到server端
  • server端接收到client的注册请求,将注册信息存入client对象(用于保存client的所有数据)中,并触发ClientChangedEvent、ClientRegisterServiceEvent、InstanceMetadataEvent

    • ClientChangedEvent触发server节点之间的数据同步(distro协议)
    • ClientRegisterServiceEvent触发更新publisherIndexes(保存service => clientId的Map<Service, Set>,即哪些客户端注册了这个服务的索引),同时也触发一个ServiceChangedEvent,该事件负责向监听该服务的客户端进行推送
    • InstanceMetadataEvent,处理元数据,Nacos在2.0中将元数据与基础数据拆分开,分为不同的处理流程
  • client订阅服务

    • 根据serviceName、groupName、clusters信息生成key,创建eventListener,同时向server端发送订阅请求,并缓存订阅信息,用于连接断开重连后再次向server端发送信息
  • server端接收到client的订阅请求

    • 将订阅信息打包为subscribers,并存入client对象中,触发ClientSubscribeServiceEvent事件
    • ClientSubscribeServiceEvent事件更新subscriberIndexes(保存service => clientId的Map<Service, Set>,即哪些客户端订阅了这个服务的索引),同时触发ServiceSubscribedEvent事件
    • ServiceSubscribedEvent事件会延时500ms向该client推送该服务的最新数据
  • 反向的操作如注销、取消订阅与正向操作类似,不再赘述

最后

本文从总体上分析了Nacos 2.0的模型设计、接口设计以及交互流程,读完后对Nacos的服务发现有一个整体上的认识。

后续篇幅会从细节入手,如dubbo Nacos扩展、一致性协议、探活、CMDB扩展等逐一进行分析。


搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

Nacos注册中心之概要设计的更多相关文章

  1. Spring Cloud Alibaba 使用nacos 注册中心

    ### 背景 上一文我们讲到了如何去搭建注册中心,这一次我们讲述如何使用nacos作为注册中心 ### spring-cloud-alibaba-basis 创建基础依赖 首先我们创建一个spring ...

  2. Spring Cloud 系列之 Alibaba Nacos 注册中心(一)

    前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...

  3. Spring Cloud 系列之 Alibaba Nacos 注册中心(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Alibaba Nacos 注册中心(一) 本篇文章讲解 Nacos 注册中心集群环境搭建. Nacos 集群环境搭建 ...

  4. 手动造轮子——为Ocelot集成Nacos注册中心

    前言     近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题.我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证.授权.熔断. ...

  5. Spring Cloud Alibaba(4)---Nacos(注册中心)

    Nacos(注册中心) 有关Spring Cloud Alibaba之前写过三篇文章. Spring Cloud Alibaba(1)---入门篇 Spring Cloud Alibaba(2)--- ...

  6. SpringCloud Alibaba实战(7:nacos注册中心管理微服务)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经完成了Nacos Server的本地部署,这一节我们学习如何将Nac ...

  7. Nacos注册中心和配置中心流程原理

    一.Nacos注册中心 1.服务启动后---->服务注册原理 springCloud集成Nacos实现原理: 服务启动时,在spring-cloud-commons包下 spring.facto ...

  8. 5-2 Nacos注册中心

    Nacos注册中心 什么Nacos Nacos是Spring Cloud Alibaba提供的一个软件 这个软件主要具有注册中心和配置中心的功能 我们先学习它注册中心的功能 微服务中所有项目都必须注册 ...

  9. Dubbo2.6.5+Nacos注册中心(代替Zookeeper)

    在上一节的小栗子的基础上,只需要更改两个地方 第一个:父工程的pom依赖增加 <!-- Dubbo Nacos registry dependency --> <dependency ...

随机推荐

  1. 干了8年Android开发熬到年薪40万,突然接到被辞退消息,应该怎么办?

    01 36岁Android开发,为公司工作8年,昨天HR说公司不准备续约 前天晚上,有个读者给我留言,讲述了他自己比较气愤的一件事,感觉自己委屈又不值. 这位朋友不愿意透露姓名,就叫他H先生吧. H先 ...

  2. TestNG注释@BeforeGroups与@AfterGroups不执行的处理

    在学习TestNG框架注解时发现在执行以下的代码 package com.groups; import org.testng.annotations.AfterGroups; import org.t ...

  3. CentOS文件目录类语法

    目录 一.目录查看切换类 1. pwd 显示当前工作目录的绝对路径 2. ls 列出目录的内容 二.文件与目录创建删除类 1. mkdir 创建一个新目录 2. touch 创建空文件 3. rmdi ...

  4. 网络图片下载,commons IO包

    网络图片下载,commons IO包 导入commons-io包 commons-io包下载路径: http://www.apache.org/ 项目下新建lib包,将lib包添加为库 实现多线程下载 ...

  5. springboot的单元测试(总结两种)

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  6. Maven 手动安装JAR包到本地maven仓库后,但在项目中依旧报错找不到JAR包解决方法

    本博客包含的内容: ①手动安装jar包到本地仓库: ②解决Missing artifact org.source.fastdfs:fastdfs:jar问题 .personSunflowerP { b ...

  7. Semi-automation Script Based on Sleep

    The following script auto login to server 49, send 2 commands and exit from the server. Create a aut ...

  8. SpringBoot开发一

    项目介绍 牛客高级项目课,主要是完成牛客网的讨论社区的搭建.项目在github上. 涉及到的技术架构: Spring,SpringBoot,SpringMVC,MyBatis,Redis,Kafka( ...

  9. 生成二维码项目pom.xml中QRCode依赖报错

    pom.xml报错如下: 解决方法: 1.将QRCode.jar包下载到E盘下 网盘下载地址: 链接:https://pan.baidu.com/s/1sY1NK5ekCkNH0uqraZMnKw 提 ...

  10. ReentrantLock中的Condition(等待和唤醒)

    Condition 类的 awiat 方法和 Object 类的 wait 方法等效 Condition 类的 signal 方法和 Object 类的 notify 方法等效 Condition 类 ...