Nacos注册中心之概要设计
本文已收录 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注册中心之概要设计的更多相关文章
- Spring Cloud Alibaba 使用nacos 注册中心
### 背景 上一文我们讲到了如何去搭建注册中心,这一次我们讲述如何使用nacos作为注册中心 ### spring-cloud-alibaba-basis 创建基础依赖 首先我们创建一个spring ...
- Spring Cloud 系列之 Alibaba Nacos 注册中心(一)
前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...
- Spring Cloud 系列之 Alibaba Nacos 注册中心(二)
本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Alibaba Nacos 注册中心(一) 本篇文章讲解 Nacos 注册中心集群环境搭建. Nacos 集群环境搭建 ...
- 手动造轮子——为Ocelot集成Nacos注册中心
前言 近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题.我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证.授权.熔断. ...
- Spring Cloud Alibaba(4)---Nacos(注册中心)
Nacos(注册中心) 有关Spring Cloud Alibaba之前写过三篇文章. Spring Cloud Alibaba(1)---入门篇 Spring Cloud Alibaba(2)--- ...
- SpringCloud Alibaba实战(7:nacos注册中心管理微服务)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经完成了Nacos Server的本地部署,这一节我们学习如何将Nac ...
- Nacos注册中心和配置中心流程原理
一.Nacos注册中心 1.服务启动后---->服务注册原理 springCloud集成Nacos实现原理: 服务启动时,在spring-cloud-commons包下 spring.facto ...
- 5-2 Nacos注册中心
Nacos注册中心 什么Nacos Nacos是Spring Cloud Alibaba提供的一个软件 这个软件主要具有注册中心和配置中心的功能 我们先学习它注册中心的功能 微服务中所有项目都必须注册 ...
- Dubbo2.6.5+Nacos注册中心(代替Zookeeper)
在上一节的小栗子的基础上,只需要更改两个地方 第一个:父工程的pom依赖增加 <!-- Dubbo Nacos registry dependency --> <dependency ...
随机推荐
- [CISCN2019 华北赛区 Day2 Web1]Hack World(二分法写布尔注入脚本)
记一道布尔注入的题,存在过滤字符. 从题目看应该是一道注入题.提示存在flag表flag列. 输入1和2的返回结果不一样,可能是布尔注入. 简单用万能密码尝试了一下.提示SQL Injection C ...
- Apache httpd的web服务
Apache httpd的web服务 适用于Unix/Linux下的web服务器软件 Apache httpd(开源且免费),虚拟主机,支持HTTPS协议,支持用户认证,支持单个目录的访问控制,支持U ...
- 并发编程——线程中sleep(),yield(),join(),wait(),notify(),notifyAll()区别
前言 今天简单的讲一讲线程中sleep(),join(),yield(),wait(),notify(),notifyAll()这些方法的使用以及区别. 不过在讲这些方法之前,需要简单的介绍一下锁池和 ...
- 学习Android Jetpack? 入门教程和进阶实战这里全都有!
前言 2018年谷歌I/O,Jetpack横空出世,官方介绍如下: Jetpack 是一套库.工具和指南,可帮助开发者更轻松地编写优质应用.这些组件可帮助您遵循最佳做法.让您摆脱编写样板代码的工作并简 ...
- Linux命令(五)之service服务查找、启动/停止等相关操作
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- 接口自动化测试之httprunner初探
❝ 今天来介绍一个python的一个开源项目:httprunner,接口自动化工具.第一次输入,难免有不周到的地方,轻喷~ ❞ 介绍: HttpRunner是一个简单优雅但功能强大的 HTTP(S) ...
- Eclipse带参数调试的方法
下面是体现带参数调试的一个代码demo,首先输出参数的数量,然后依次输出每个参数. public class ArgsEx { public static void main(String[] arg ...
- 了解cookie和storage的区别及优缺点
共同点:用于数据的存储. 区别: 1.是否需要添加到http请求头? HTTP Cookie(cookie):在客户端存储会话信息,要求服务器对任意HTTP请求发送set-cookie HTTP头作为 ...
- MyBatis学习06(动态SQL和缓存)
10.动态SQL 10.1 什么是动态SQL 动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 官网描述: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或 ...
- sqlplus登录用户被锁问题
oracle有三个默认的用户名和密码: 1.用户名:sys密码:change_on_install 2.用户名:system密码:manager 3.用户名:scott密码:tiger 当登录用户 ...