nacos服务注册流程

nacos的客户端已经搭建好了,那么客户端是怎么将服务注册到注册中心去的呢。
1、 如果对springboot自动配置原理有一定了解的话,那么第三方框架一般都会通过spi的方式来初始化自己包中的bean。比如mybatis与spring结合都会在/META-INFO/spring.factories下进行自动装配

2、 那么nacos是不是一样的也是基于这种方式来处理的呢,打开nacos客户端的依赖包,看到/META-INFO下面存在spring.factories

3、 打开spring.factories可以看到里面的确存在一些nacos的自动配置信息。

4、 那这些自动配置的类都是些什么意思呢,都起到了些什么作用呢,一个一个点击进去查看一下,点击第一个 com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration发现当中对三个对象进行了装载NacosServiceRegistry、NacosRegistration、NacosAutoServiceRegistration

5、 NacosServiceRegistry是不是就是封装的nacos注册流程呢,点击进去查看,发现好像还真的是nacos客户端的注册流程:
NacosServiceRegistry.register()–>namingService.registerInstance()–>serverProxy(NamingProxy).registerService()–>NamingProxy.reqAPI()–>NamingProxy.callServer()–>HttpClient.request();
这样最终发现nacos客户端的最终是通过http去请求一个服务端的注册接口。

6、 从上面的nacos注册流程当中可以知道,其入口是NacosServiceRegistry中的register方法,那么register又是怎么调用的呢,这里里面需要涉及到spring的事件发布与订阅、springcloud当中对服务注册流程所制定的标准,只有对这方面的知识有了一定程度的了解才能知道使用nacos作为注册中心时客户端进行注册的整个流程,才能进一步的去学习并了解nacos的源码。
7、 那么对于作为小白的我对这些东西都不熟悉,都不知道,那我怎么才能搞懂nacos客户端的整个注册流程呢,idea的调试模式下为我们提供了强大的调用链路,我们只需要在NacosServiceRegistry的register()方法上打个断点。

8、 调试启动项目,这样idea的调试工具当中会出现整个注册流程的调用链路

9、 根据调用链路可以整理出整个nacos作为注册中心时客户端的调用流程

第一步:springboot在启动main方法时调用到spring的核心方法refresh
第二步: spring的refresh方法会在最后的流程中finishRefresh(),
而由于是Springboot的方式启动时初始化的applictionContext是AnnotationConfigServletWebServerApplicationContext,并且该类是继承于ServletWebServerApplicationContext,ServletWebServerApplicationContext重写了finishRefresh方法,Spring在调用finishRefresh最终会调到子类的ServletWebServerApplicationContext当中的finishRefresh方法。

第三步:ServletWebServerApplicationContext在处理完父类的finishRefresh的时候会去发布一个ServletWebServerInitializedEvent事件,该事件继承于WebServerInitializedEvent,而最终nacos就是去监听该事件来进行注册的
第四步:spring在发送事件之后最终由AbstractApplicationContext将该事件交给ApplicationEventMulticaster将事件广播到适定的监听器。

第五步:AbstractApplicationContext的实现类SimpleApplicationEventMulticaster当中的multicastEvent中会去获取当前处理该事件的所有的监听器,并执行最终的事件处理


第六步:最后根据注册的事件,该事件的对应的监听器会实现onApplicationEvent方法,调到对应的实现上,AbstractAutoServiceRegistration会去监听前面所提到的WebServerInitializedEvent事件,最终会调到 AbstractAutoServiceRegistration中的onApplicationEvent方法


第七步:AbstractAutoServiceRegistration经过一系列的跳转调用最终调用到ServiceRegistry中的register方法。而ServiceRegistry.register实际上就是spring cloud为各个注册中心所制定的标准,要想使服务注册,那么须各个注册中心的客户端去实现该方法

第八步:在这里nacos的注册流程就完全的清楚了,由于使用了唯一的注册中心nacos,而恰巧nacos的注册流程是通过NacosServiceRegistry实现的,这里最终就调用到了nacos的注册流程。
第九步:nacos的注册流程已经走完了,其实还有个疑问,那么spring cloud中AbstractAutoServiceRegistration又是怎么初始话的呢,翻开spring cloud common的/META-INFO/spring.factories中配置AutoServiceRegistrationAutoConfiguration,
而通过该类对AbstractAutoServiceRegistration进行了初始化。

最后说一下:对现有常用的注册中心 erueka、zookeeper、consul 最终都是通过ServiceRegistry的实现类来处理register来完成整个客户端的注册。稍微翻看了以上几个注册中心客户端注册流程的代码,发现zookeeper、consul,nacos都是通过事件的发布与监听来处理最终流程,但是erueka是LifecycleProcessor来实现服务注册的。

nacos服务注册流程相关推荐

  1. Nacos服务注册流程(一)

    Nacos服务注册主流程 目录 一.准备事项 1.1 Nacos源码下载 1.2 启动Nacos服务端项目 1.3 启动Nacos客户端项目 二.Nacos客户端注册流程 2.1 注册方法的调用 2. ...

  2. 2.Nacos 服务注册的原理

    Nacos服务注册需要具备的能力 服务提供者把自己的协议地址注册到Nacos server 服务消费者需要从Nacos Server上去查询服务提供者的地址(根据服务名称) Nacos Server需 ...

  3. Nacos服务注册与发现---Nacos简介以及原理

    1. 什么是Nacos ​ ​  ​      ​  Nacos是SpringCloud Alibaba的一个服务治理的一个重要组件,英文全称Dynamic Naming and Configurat ...

  4. dubbo服务注册流程

    服务注册流程 RegistryProtocol 在dubbo服务发布流程已经分析了发布服务流程还有服务注册流程 export 在RegistryProtocol#export继续服务注册流程 // 根 ...

  5. nacos服务发现流程

    nacos服务发现流程 前面已经知道nacos服务是怎么注册的了,那么nacos对注册的服务又是怎么发现的呢. 1. 既然我们已经知道nacos服务是怎么注册的了,那么点击服务注册的流程里面,查找到最 ...

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

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

  7. SpringCloud Alibaba微服务实战(二) - Nacos服务注册与restTemplate消费

    说在前面 基础环境搭建,理论,请看上一篇,在这就不扯理论了,直接上代码. 项目结构 代码实现 第一步:在父pom的项目中引入dependencyManagement 在引入父pom之前咱们先来回顾下d ...

  8. Spring Cloud微服务之Nacos服务注册(九)

    Nacos服务注册 前言 具体步骤 1.在service模块配置pom.xml 2.添加服务配置信息 3.添加Nacos客户端注解 4.启动客户端微服务 最后 前言 上一篇中我们介绍完了Nacos的基 ...

  9. 微服务2——服务的注册,调用(Nacos服务注册中心+服务调用+调用负载均衡)sca-comsumersca-provider

    一.Nacos的安装和构建  以及启动 其官网地址如下: Nacos官网 1.安装前提: 第一:确保你电脑已配置JAVA_HOME环境变量(Nacos启动时需要),例如: 第二:确保你的MySQL版本 ...

最新文章

  1. 4g8核支持多少php进程,服务器8核16g内存,同时有1000多人在抢红包,有502怎么办?...
  2. android+关闭selinux权限问题,快速解决Android中的selinux权限问题【转】
  3. Csharp: 拼音转汉字字符搜索字符串
  4. 斯坦福-随机图模型-week1.0_
  5. catia 如何提取cgr面_CATIA教程之创成式外形设计金元宝
  6. Spark提交 指定 kerberos 认证信息
  7. 云原生数据库崛起,阿里云POLARDB当选世界互联网领先科技成果
  8. C#不同窗体间通信,数据传递
  9. Java字符串截取(substring)
  10. Lc695-岛屿的最大面积
  11. oracle 选择函数,Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
  12. CorelDraw x4无法打开的解决方法
  13. html 给文字加图片背景,如何给文字添加背景图?给文字填充图片背景色的操作方法...
  14. 零基础能学大数据吗 需要知道什么核心知识
  15. 使用nginx反向代理配置动态域名
  16. [轻松学会shell编程]-3、grep、正则表达式、awk的详细用法、分析系统自带的两个文件(functions和network)
  17. 思维题:一个岛上有100个人,95个蓝眼睛,5个红眼睛
  18. 【长篇博文】Docker学习笔记与深度学习环境的搭建和部署(二)
  19. 2022年高教杯国赛数学建模思路分享
  20. 新加坡设自动巡逻机器人,助力城市精细化治理

热门文章

  1. SQL语句中IN的用法
  2. DHCP 原理与配置
  3. 分布式电源接入配电网
  4. 2)- 性能测试的基本概念
  5. PyQt5可视化编程-图形界面开发工具QtDesigner和PyUIC
  6. vb.net 模拟鼠标 失去焦点_我用MATLAB进行了十万次模拟,终于发现了一种几乎可以百分百进洞的台球打法!...
  7. 51单片机控制蜂鸣器发SOS国际求救信号声音实验
  8. 数据结构学习记录(二)——折半查找二叉判定树的画法
  9. Cocos2D实现Fruit Ninja里面刀光效果教程
  10. Android中运行的错误:java.lang.UnsatisfiedLinkError