本文已收录 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提供了simplesnowflake两种算法来生成,默认是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. C++ //继承中构造和析构顺序

    1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 class Base 6 { 7 pu ...

  2. 三年Android开发,月薪一万二,不敢跳槽,每天都很焦虑

    在我们的身边,存在一个普遍现象:很多人从事Android开发工作多年,走过的弯和坎,不计其数,经历的心酸难与外人道也.可是技术确难以提升.止步不前,薪资也只能看着别人水涨船高,自己却没有什么起色. 虽 ...

  3. Microservices==>Service Mesh==>Serverless,走马观花

    [0] 始有道 话说图灵开天辟地,冯.诺伊曼造石补天! 始有道道生ML Machine LanguageML生汇编 assembler汇编生编译器 compiler编译器生PL Programming ...

  4. Linux下的USB总线驱动(一)

    版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 一.USB理论 1.      USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1 ...

  5. Linux线程同步之读写锁(rwlock)

    读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 和 ...

  6. linux 源码搭建Kafka集群,100%有效

    kafka源码编译安装 准备三台服务器 192.168.xxx.xxx 192.168.xxx.xxx 192.168.xxx.xxx 安装kafka前需先安装JDK和zookeeper如下步骤: J ...

  7. STP进阶版MSTP

    一.MSTP简介 1.1.MSTP工作原理 mstp是一个公有生成树协议,在实际生产环境中得到了广泛的应用.传统的生成树只运行一个实例,且收敛速度慢,RSTP在传统的STP基础上通过改进达到了加速网络 ...

  8. STM32—IIC通信(软件实现底层函数)

    使用GPIO引脚模拟SDA和SCL总线实现软件模拟IIC通信,IIC的具体通信协议层和物理层链接:IIC #ifndef __BSP_IIC_H #define __BSP_IIC_H #includ ...

  9. NGINX-1.6.3部署详情

    Nginx_沁贰百科 介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Ra ...

  10. ManagementEventWatcher throws ManagementException with call to Stop()

    参考网址:https://stackoverflow.com/questions/46100105/managementeventwatcher-throws-managementexception- ...