Nacos 服务注册与发现原理分析

Nacos 另一个非常重要的特性就是服务注册与发现,说到服务的注册与发现相信大家应该都不陌生,在微服务盛行的今天,服务是非常重要的,而在 Nacos 中服务更被称为他的一等公民。

Nacos 支持几乎所有主流类型的 “服务” 的发现、配置和管理。

了解过 Dubbo 的同学,应该对 Dubbo 的架构非常熟悉,最经典的一张架构图如下所示:

图中的6个步骤的含义解释如下:

0、服务容器负责启动,加载,运行服务提供者。

1、服务提供者在启动时,向注册中心注册自己提供的服务。

2、服务消费者在启动时,向注册中心订阅自己所需的服务。

3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

5、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

其中图中最上方的 Registry 就是注册中心,负责服务的注册与发现。Dubbo 有自己的 Registry 实现,而 Nacos 则是另一种 Registry 的实现。

现在我们来了解下 Nacos 的服务注册与发现,首先在本地将 Nacos 服务端启动起来,具体怎么操作这里不再赘述,不清楚的同学可以参考我的其他文章。

模拟服务注册

我们模拟将同一个服务的两个实例注册到 Nacos 中,代码如下图所示:

通过 NamingService 接口的 registerInstance 方法就可以将服务进行注册了,该方法有很多重载的方法,这里我们选择一个简单的来调用就好了。

注册完成后,通过调用 getAllInstances 方法,立即获取所有可用的实例,然后让主线程等待,打印如下:

从打印结果中可以发现 naming 客户端成功获取到了两个实例。

模拟服务发现

服务注册之后,服务的消费者就可以向注册中心订阅自己所需要的服务了,注册中心会将所有服务的实例“推送”给消费者,这里我在推送上打了引号,原因是实际上获取服务是客户端主动轮询的,跟客户端获取配置中心的配置项的原理一样。这里不进行具体的描述,有兴趣的可以跟一下代码就知道了。

现在我创建一个服务消费者,然后向注册中心订阅一个服务,当接收到注册中心返回的服务列表之后,执行5次 select 服务实例的操作,相当于进行一个模拟的服务请求,具体的代码如下图所示:

其中的 printInstances 方法主要是打印出所有服务的实例,为了节省篇幅就不写出来了,将 ServiceConsumer 类启动之后,打印出如下的日志:

消费者每次获取一个健康的实例进行调用,接下来我就来分析下整个服务注册与发现的过程和大致的设计原理和思路。

服务如何注册

服务注册最重要的就是将服务注册到哪里,在注册中心服务端,肯定有一个用来管理服务的容器,他保存着所有服务的实例。

我们暂时不需要知道该容器具体的实现细节,只需要知道有这样一个概念。

服务如何发现

服务注册到注册中心后,服务的消费者就可以进行服务发现的流程了,消费者可以直接向注册中心发送获取某个服务实例的请求,这种情况下注册中心将返回所有可用的服务实例给消费者,但是一般不推荐这种情况。另一种方法就是服务的消费者向注册中心订阅某个服务,并提交一个监听器,当注册中心中服务发生变更时,监听器会收到通知,这时消费者更新本地的服务实例列表,以保证所有的服务均是可用的。

负载均衡

负载均衡有很多种实现方式,包括轮询法,随机方法法,对请求ip做hash后取模等等,从负载的维度考虑又分为:服务端负载均衡和客户端负载均衡。

Nacos 的客户端在获取到服务的完整实例列表后,会在客户端进行负载均衡算法来获取一个可用的实例,模式使用的是随机获取的方式。

Nacos 服务注册与订阅的完整流程

Nacos 客户端进行服务注册有两个部分组成,一个是将服务信息注册到服务端,另一个是像服务端发送心跳包,这两个操作都是通过 NamingProxy 和服务端进行数据交互的。

Nacos 客户端进行服务订阅时也有两部分组成,一个是不断从服务端查询可用服务实例的定时任务,另一个是不断从已变服务队列中取出服务并通知 EventListener 持有者的定时任务。

官方提供的demo具有一定的迷惑性,不过这能迫使你去了解事物的本质。

你如果直接官方的demo,你会发现如下有趣的情况:

1、第一次注册了两个实例,获取实例时返回的是2个

2、然后解除注册其中的一个实例,再次获取实例时返回的还是2个

3、订阅服务的监听器将会收到两次 onEvent 回调,第一次是2个实例,第二次是1个实例

按照正常的情况,注册了两个实例,然后解除注册了一个只会,再次获取实例应该返回1个实例才对,但是返回了2个。

深入了解下源码就能知道原因:

客户端将获取到的服务实例保存在一个 map 中,而该 map 中的内容是由调度任务定时去更新的,存在一定的延时。

Image placeholder
IT头条
未设置
  15人点赞

没有讨论,发表一下自己的看法吧

推荐文章
微服务架构之「 服务注册 」

微服务架构是一个庞大复杂的工程,为什么说它庞大复杂呢?因为想要做好微服务,就必须先要建设好微服务所需的一系列基础设施和组件。我在前面的文章《架构设计之「微服务入门」》中已经初步介绍过了这些组件,包括:

OpenStack容器服务Zun初探与原理分析

01Zun服务简介Zun是OpenStack的容器服务(ContainersasService),类似于AWS的ECS服务,但实现原理不太一样,ECS是把容器启动在EC2虚拟机实例上,而Zun会把容器

Android兼容Java 8语法特性的原理分析

本文主要阐述了Lambda表达式及其底层实现(invokedynamic指令)的原理、Android第三方插件RetroLambda对其的支持过程、Android官方最新的dex编译器D8对其的编译支

Elasticsearch 数据写入原理分析

前言最近TL分享了下《Elasticsearch基础整理》https://www.jianshu.com/p/e82…,蹭着这个机会。写个小文巩固下,本文主要讲ES->Lucene的底层结构,然后详细

Golang语言的主要特性与发展的环境和影响因素

1.2.1影响Go语言发展的早期编程语言 正如“21世纪的C语言”这句话所说,Go语言并不是凭空而造的,而是和C++、Java和C#一样属于C系。不仅如此,设计者们还汲取了其它编程语言的精粹部分融入

Docker容器实现原理及容器隔离性踩坑介绍

本文讲述了 关于容器隔离性的一个“坑”正如Docker官方的口号:“Buildonce,Runanywhere,Configureonce,Runanything”,Docker被贴上了如下标签:轻巧

万字长文:聊聊几种主流Docker网络的实现原理

一、容器网络简介容器网络主要解决两大核心问题:一是容器的IP地址分配,二是容器之间的相互通信。本文重在研究第二个问题并且主要研究容器的跨主机通信问题。实现容器跨主机通信的最简单方式就是直接使用host

聊一聊 MySQL 中的事务及其实现原理

说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景:面试官:"事务的四大特性是什么?" 我:"ACID,即原子性(Atomicity)、隔离性(Isolation)、持久性

事务注解(@Transactional)引起的数据覆盖故障

最近组织团队内技术培训,刘聪为分享的一个跟事务和写数据库相关的case(bug)很有代表性。用事务,要小心!一、故障现象车辆交付履约流程上两个节点(工程项目)A和B,A修改一条数据记录item(工单)

Nacos配置中心原理

动态配置管理是Nacos的三大功能之一,通过动态配置服务,我们可以在所有环境中以集中和动态的方式管理所有应用程序或服务的配置信息。动态配置中心可以实现配置更新时无需重新部署应用程序和服务即可使相应的配

徒手教你使用zookeeper编写服务发现

zookeeper是一个强一致【不严格】的分布式数据库,由多个节点共同组成一个分布式集群,挂掉任意一个节点,数据库仍然可以正常工作,客户端无感知故障切换。客户端向任意一个节点写入数据,其它节点可以立即

数据结构与算法分析——开篇以及复杂度分析

开篇 你也许已经发现了,工作了几年,原以为已经是一只老鸟。但看到刚参加工作的同事,你发现,原来自己一直在原地踏步。跟新人相比,你的唯一优势就是对业务更熟悉而已,别的就没有什么优势了。 怎样才能够让自己

数据结构与算法分析——开篇以及复杂度分析

开篇你也许已经发现了,工作了几年,原以为已经是一只老鸟。但看到刚参加工作的同事,你发现,原来自己一直在原地踏步。跟新人相比,你的唯一优势就是对业务更熟悉而已,别的就没有什么优势了。怎样才能够让自己更上

Python数据分析实战 | 爬遍拉勾网,带你看看数据分析师还吃香吗?

微信公众号:「Python读财」如有问题或建议,请公众号留言伴随着移动互联网的飞速发展,越来越多用户被互联网连接在一起,用户所积累下来的数据越来越多,市场对数据方面人才的需求也越来越大,由此也带火了如

Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘

问题描述上周四晚刚回到家,就接到了软负载同学的电话,说是客户线上出了故障,我一听”故障“两个字,立马追问是什么情况,经过整理,还原出线上问题的原貌:客户使用了Dubbo,注册中心使用的是Nacos,在

视频流媒体服务器对接宇视摄像机OCX插件出现error code 14001错误分析

背景需求随着雪亮工程、明厨亮灶、手机看店、智慧幼儿园监控等行业开始将传统的安防摄像头进行互联网、微信直播,我们知道摄像头直播的春天了。将安防摄像头或NVR上的视频流转成互联网直播常用的RTMP、HTT

微服务治理与统计分析

转载本文需注明出处:微信公众号EAWorld,违者必究。引言:微服务架构下,服务拆得越细,服务的粒度越小,可组装性就越好;与之相对的服务之间的调用关系就会变复杂,为了保证服务更好的运行,需要对这些服务

php常用字符串查找函数strstr()与strpos()实例分析

这篇文章主要介绍了php常用字符串查找函数strstr()与strpos(),结合具体实例形式分析了php字符串查找函数strstr()与strpos()的具体功能、用法、区别及相关操作注意事项,需要

在头条和百度搜索了100个关键词之后,我们发现……

作者|闫丽娇苏琦编辑|苏琦• 常用名词搜索方面,百度站外内容占比更高,内容来源比头条更多元。头条搜索的信息流广告目前还没有接入;• 疑问解答类搜索,百度的内容发散性更杂,而头条在信息准确度上更能理解用

美漂数据科学家年薪多少?爬了6年H1B签证数据发现,招的人多了,但钱少了

大数据文摘出品来源:medium编译:张睿毅、曹培信自2012年起,一直被称为“最性感的工作”的数据科学家职位,吸引了大批远渡重洋到达硅谷,做着“数据梦”的留学生们。但他们也付出了不菲的前期投入,除了

从十万份开发者调查报告中,发现了这些信息

StackOverflow是一个面向程序员的技术问答网站,每年都会进行一次开发者问卷调查。本次收集了10万名开发者的调查问卷,分别对程序员的工作状况、开发语言、工具以及生活习惯等做了调查。参与调查的开

支付宝安全实验室发现3款恶意库,提醒开发者擦亮眼

近日,支付宝天宸实验室发现在Python官方的第三方库下载网站上有三款第三方恶意库。当开发者安装使用时,可能被安装恶意程序。这三个恶意库的链接如下:roels:https://pypi.org/pro

PHP 内核:讲下 PHP 7 底层虚拟机工作原理 —— Zend Virtual Machine 7.2 版本

本文旨在提供Zend虚拟机的概述,如php7所示。这不是一个全面的描述,但我试图涵盖大部分重要部分,以及一些更精细的细节。 此描述针对的是PHP7.2版(目前正在开发中),但几乎所有内容都适用于PHP

Spring WebFlux 的设计及工作原理剖析

前言 Spring5发布有两年了,随Spring5一起发布了一个和SpringWebMvc同级的SpringWebFlux。这是一个支持反应式编程模型的新框架体系。反应式模型区别于传统的MVC最大的不

详解 varint 编码原理

什么是Varint编码Varint是一种使用一个或多个字节序列化整数的方法,会把整数编码为变长字节。对于32位整型数据经过Varint编码后需要1~5个字节,小的数字使用1个byte,大的数字使用5个