【源码分析】Nacos自动注册源码分析

文章目录

  • 服务注册(AP协议)
  • 服务发现(CP协议)
  • Nacos是如何整合到SpringCloudAlibaba的?

服务注册(AP协议)

Nacos提供了NamingService的registerInstance方法来提供服务注册的功能。
因此只要我们能获取到这个NamingService即可完成服务的注册。
在这里插入图片描述

我们可以通过NacosFactory的方式来获取到NamingService以及配置中心ConfigService。
在这里插入图片描述

而这个注册中心的底层获取方式其实就是通过反射的方式来重建一个注册中心类。
在这里插入图片描述

所以我们可以按照如下方式注册并且获得注册中心的所有实例,并且监听注册中心对应实例的变化,代码如下:

public class RegisterMain {public static void main(String[] args) throws NacosException {NamingService namingService = NacosFactory.createNamingService("123.249.97.220:8848");namingService.registerInstance("config-center","localhost",8808);namingService.registerInstance("config-center","localhost",8809);List<Instance> allInstances = namingService.getAllInstances("config-center");System.out.println(allInstances);System.out.println("---------------");namingService.subscribe("config-center", new EventListener() {@Overridepublic void onEvent(Event event) {NamingEvent namingEvent = (NamingEvent) event;System.out.println("监听器监听到服务变更,服务名称为:"+namingEvent.getServiceName());System.out.println("监听器监听到服务变更,当前实例列表为:"+namingEvent.getInstances());}});while(true){}}
}

具体注册实例的方法如下,此时Nacos会根据创建的是否是短实例来选择使用grpcproxy或者httpproxy代理来注册实例。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其实大概可以看出服务注册就是向服务端发送了一个POST请求并且进行服务的注册。

服务发现(CP协议)

我们从注册中心获取服务的时候,肯定是要保证服务的一致性的,不然有些服务挂机了,你还能获取到他的实例,结果发个请求都是报错,所以服务发现选择的是CP协议,也就是Raft。
服务发现的getAllInstances其实底层也可以想到一定是和上面一套一样的流程。
在这里插入图片描述

我们选择httpclientproxy来查看,可以发现底层就是一个get请求
在这里插入图片描述

Nacos是如何整合到SpringCloudAlibaba的?

我们知道,SpringBoot基于Spring提供了一个扩展点,直接使用Spring来整合第三方是非常复杂的。
而有了SpringBoot之后,基于SpringBoot的约定优于配置的思想,我们只需要将我们需要自动加载的类编写在spring.factories文件中即可。在SpringBoot2.7之后更是改变了自动注入的方式,变得更为简单。
在这里插入图片描述

此时就可以看到Nacos的注册服务已经被加载了
在这里插入图片描述
在这里插入图片描述

所以上面的一套流程可以理解为:我们引入了Nacos作为注册中心之后。
SpringBoot会自动加载我们的配置类,然后这个配置类包含我们的注册中心的配置,也就是已经为我们提供好了注册方法。那么此时我们的问题就变为了,如何在当前服务启动后,自动的调用NacosServiceRegistry的register方法来将当前服务注册到注册中心去。
在上面那个bean中用于完成配置属性的封装,而在下面那个bean中则完成我们的服务的自动注册,从名称中也可以看出,Nacos自动注册服务。
在这里插入图片描述

我们现在重点看NacosAutoServiceRegistration这个类。
我们点开这个类中发现其继承关系如下:
在这里插入图片描述

重点就在于这个ApplicationListener了,我们知道,Spring在完成容器创建之后,会调用AbstractApplicationContext的refresh方法,而这个方法会注册监听器并且发布一个事件。
在这里插入图片描述
而这个事件就是容器刷新事件。
在这里插入图片描述
而这个事件最后就会触发Web容器初始化事件,从而触发对应的监听器
在这里插入图片描述
而这个事件发布之后,就会被我们的监听器所监听到并且执行对应的逻辑,如下:
在这里插入图片描述
在这里插入图片描述
可以发现这里的事件处理包含了一个由Nacos提供的自动注册类来完成。原因就是由于上面的Nacos的自动注册类实现了ApplicationListener
在这里插入图片描述
在这里插入图片描述
之后start方法将会进行注册
在这里插入图片描述
而这个register方法,就会调用其实现的具体的注册方法
在这里插入图片描述
此方法即NacosServiceRegistry提供的register方法,而他已经在我们引入Nacos-discovery这个依赖的时候就已经完成了自动注入。
在这里插入图片描述
我们知道SpringCloud其实是一种SPI思想,他只是负责提供一群接口,而其他的厂家基于这个接口来实现具体的方法,Alibaba就是其中的一种,所以可以看到NacosServiceRegistry其实就是实现了SpringCloud提供的接口而已。
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/78254.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue v-slot指令

目录 定义语法使用场景场景一场景二场景三tips只有一个默认插槽时 定义 在Vue中&#xff0c; v-slot 指令用于定义插槽的模板内容。它用于在父组件中传递内容到子组件中的插槽。 v-slot 指令可以用于 标签或组件标签上&#xff0c;以便在子组件中使用插槽。 语法 使用 v-slo…

16-1_Qt 5.9 C++开发指南_多语言界面

文章目录 1. 多语言界面设计概述2. tr()函数的使用3. 生成语言翻译文件4. 使用Qt Linguist 翻译 ts 文件5. 调用翻译文件改变界面语言5.1 生成qm文件5.2 项目启动时设置界面语言5.3 动态切换语言 1. 多语言界面设计概述 有些软件需要开发多语言界面版本&#xff0c;如中文版和…

自动化测试框架?数据驱动vs关键字驱动,该怎么做?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 对于自动化测试框…

BI报表工具有哪些作用?奥威BI全面剖析数据

BI报表工具有哪些作用&#xff1f;主要的作用是通过整合多业务来源数据&#xff0c;全面分析挖掘数据&#xff0c;来帮助企业实现数据化运营、支持智能决策、实现数据资产沉淀和增值、进行数据挖掘和预测分析、提高数据可读性和数据可视化程度等&#xff0c;从而提高企业的竞争…

【C++学习】STL容器——list

目录 一、list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list 迭代器失效 二、list的模拟实现 2.1 模拟实现list 三、list和vector的对比…

Java版知识付费平台免费搭建 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台qt

&#xfeff;Java版知识付费源码 Spring CloudSpring BootMybatisuniapp前后端分离实现知识付费平台 提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售…

CNN成长路:从AlexNet到EfficientNet(01)

一、说明 在 10年的深度学习中&#xff0c;进步是多么迅速&#xff01;早在 2012 年&#xff0c;Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在&#xff0c;我们超过90%的EfficientNet架构和师生训练&#xff08;teacher-student&#xff09;。 如果我们在 Ima…

【Kubernetes部署篇】基于Ubuntu20.04操作系统搭建K8S1.23版本集群

文章目录 一、集群架构规划信息二、系统初始化准备(所有节点同步操作)三、安装kubeadm(所有节点同步操作)四、初始化K8S集群(master节点操作)五、添加Node节点到K8S集群中六、安装Calico网络插件七、测试CoreDNS可用性 一、集群架构规划信息 pod网段&#xff1a;10.244.0.0/16…

HTTP——九、基于HTTP的功能追加协议

HTTP 一、基于HTTP的协议二、消除HTTP瓶颈的SPDY1、HTTP的瓶颈Ajax 的解决方法Comet 的解决方法SPDY的目标 2、SPDY的设计与功能3、SPDY消除 Web 瓶颈了吗 三、使用浏览器进行全双工通信的WebSocket1、WebSocket 的设计与功能2、WebSocket协议 四、期盼已久的 HTTP/2.01、HTTP/…

卡尔曼滤波 | Matlab实现无迹kalman滤波仿真

文章目录 效果一览文章概述研究内容程序设计参考资料效果一览 文章概述 卡尔曼滤波 | Matlab实现无迹kalman滤波仿真 研究内容 无迹kalman滤波(UKF)不是采用的将非线性函数线性化的做法。无迹kalman仍然采用的是线性kalman滤波的架构,对于一步预测方程,使用无迹变换(UT)来…

visio,word添加缺少字体,仿宋_GB2312、楷体_GB2312、方正小标宋简体等字体下载

一. 内容简介 visio,word添加缺少字体,仿宋_GB2312、楷体_GB2312、方正小标宋简体等字体下载 二. 软件环境 2.1 visio 三.主要流程 3.1 下载字体 http://www.downza.cn/ 微软官方给的链接好多字体没有&#xff0c;其他好多字体网站&#xff0c;就是给你看个样式&#xff…

vue3中CompositionApi理解与使用

CompositionApi&#xff0c;组合式API&#xff0c;相当于react中hooks&#xff0c;函数式。 优势&#xff1a;1&#xff0c;增加了代码的复用性&#xff08;类似mixin&#xff0c;slot&#xff0c;高阶组件功能&#xff09; 2&#xff0c;代码可读性更好。可以将处理逻辑和视图…

Elasticsearch:语义搜索 - Semantic Search in python

当 OpenAI 于 2022 年 11 月发布 ChatGPT 时&#xff0c;引发了人们对人工智能和机器学习的新一波兴趣。 尽管必要的技术创新已经出现了近十年&#xff0c;而且基本原理的历史甚至更早&#xff0c;但这种巨大的转变引发了各种发展的“寒武纪大爆炸”&#xff0c;特别是在大型语…

数字孪生的「三张皮」问题:数据隐私、安全与伦理挑战

引言 随着数字化时代的来临&#xff0c;数据成为了当今社会的宝贵资源。然而&#xff0c;数据的广泛使用也带来了一系列隐私、安全与伦理挑战。数字孪生作为一种虚拟的数字化实体&#xff0c;通过收集和分析大量数据&#xff0c;模拟和预测现实世界中的各种情境&#xff0c;为…

【云原生|Docker系列第3篇】Docker镜像的入门实践

欢迎来到Docker入门系列的第三篇博客&#xff01;在前两篇博客中&#xff0c;我们已经了解了什么是Docker以及如何安装和配置它。本篇博客将重点介绍Docker镜像的概念&#xff0c;以及它们之间的关系。我们还将学习如何拉取、创建、管理和分享Docker镜像&#xff0c;这是使用Do…

循环结构进阶

二重循环 import java.util.Scanner;public class Demo01 {public static void main(String[] args) {Scanner scanner new Scanner(System.in);// 二重循环 外循环班级 内循环学生for (int i1; i<3; i) { // 外循环班级System.out.println("请输入第" i "…

Leetcode-每日一题【剑指 Offer 17. 打印从1到最大的n位数】

题目 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为&#xff1a;1000000008&#xff0c;请返回 1。 示例 1&#xff1a; 输…

机器学习、人工智能、深度学习三者的区别

目录 1、三者的关系 2、能做些什么 3、阶段性目标 1、三者的关系 机器学习、人工智能&#xff08;AI&#xff09;和深度学习之间有密切的关系&#xff0c;它们可以被看作是一种从不同层面理解和实现智能的方法。 人工智能&#xff08;AI&#xff09;&#xff1a;人工智能是一…

什么是serialVersionUID?

serialVersionUID是干啥的&#xff1f; Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。 在进行反序列化时&#xff0c;JVM会把传来的字节流中的serialVersionUID与本地相应实体&#xff08;类&#xff09;的serialVersionUID进行比较&#xff0…

结构体和 Json 相互转换(序列化反序列化)

关于 JSON 数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也 易于机器解析和生成。RESTfull Api 接口中返回的数据都是 json 数据。 Json 的基本格式如下&#xff1a; { "a": "Hello", "b": "…