当前位置: 首页 > news >正文

nacos源码入门

nacos官方文档地址:nacos官方文档

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
简单来说,nacos就是一个注册中心、配置中心,这篇博客,我们主要来学习nacos作为注册中心,在业务应用启动的时候,是如何将当前业务应用的信息注册到nacos中的

注册中心源码

首先在 我们的业务应用中,在使用nacos的时候,需要引入nacos相关的jar包

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>${latest.version}</version>
</dependency>

在这个jar包中,我们看spring.factories这个文件中,自动注入的bean有哪些,主要看第一个,因为下面几个看起来都和注册中心没有关系
在这里插入图片描述
在这个bean中,会通过@Bean的形式,注入了三个bean,这三个bean是极其重要的(☆☆☆)这个打个星
在这里插入图片描述

在介绍这三个bean之前,需要先介绍一个bean

org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration#onApplicationEvent

AbstractAutoServiceRegistration

这个bean是监听了WebServerInitializedEvent事件,在监听到这个事件之后,会进行一些列的逻辑,我们来看下
在这里插入图片描述
主要关注这里的register()方法
在这里插入图片描述

protected void register() {this.serviceRegistry.register(getRegistration());
}

getRegistration()

可以看到,在register()方法中,只有一行代码,但是这里是核心的逻辑

我们先看getRegistration()的逻辑

com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration#getRegistration

可以看到,这里在getRegistration()注册信息的时候,实际上,是通过构造函数传进来的,这里的构造函数,可以看下前面打星的地方(☆☆☆)
在这里插入图片描述

this.serviceRegistry.register

在这里,我们可以看到,是根据入参的registration,从这个对象中获取到对应的instance信息,然后调用nameService的registerInstance()方法,这里的serviceRegistry的实现类是:

com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register

在这里插入图片描述
从registration中获取到当前的ip和端口
在这里插入图片描述
这里我们知道最后会通过namingService进行服务注册,如果我们点进去,我们会发现,namingService实际上已经是nacos-api的类了

com.alibaba.nacos.client.naming.NacosNamingService#registerInstance(java.lang.String,
com.alibaba.nacos.api.naming.pojo.Instance)

可以看到,这里会开启一个心跳,然后继续调用serviceProxy的注册方法
在这里插入图片描述

注册心跳:
会发现,这里注册心跳,使用的是ScheduledExecutorService.schedule()方法,我们知道,schedule方法只会执行一次,按道理来讲,既然是心跳服务,那一定是需要定时去发送心跳的,我们接着来看下这里的task

在这里插入图片描述
会发现,在task方法中,执行了之后,会继续调用schedule方法,触发下次调用
在这里插入图片描述

在namingProxy的registerService()方法中,会构建一个http请求,去调用nacos服务端的代码,这里服务端是如何处理的,暂时先不关心,后面单独起博客去记录
在这里插入图片描述

回归到NacosDiscoveryAutoConfiguration

我们再把思路拉会到这个bean中,这个bean中,注入的三个bean分别是:
NacosAutoServiceRegistration(别名A类)
NacosRegistration(别名B类)
NacosServiceRegistry(别名C类)
为了便于描述这三个bean之间的关系,我们分别命名别名为A、B、C类

根据前面的代码,我们会发现,在注册的过程中,实际上就是通过这个类中注入的三个bean来完成注册的

先说结论,实际上是A类会监听WebServerInitializedEvent,在监听到这个事件之后,会通过B类获取到当前业务系统的ip和端口信息,最后去调度,通过C类的注册方法,完成服务的注册

NacosAutoServiceRegistration

会发现,这个类继承了AbstractAutoServiceRegistration,这个类的作用,可以看博客的开头
在这里插入图片描述

NacosRegistration

我们发现,在使用NacosRegistration.getPort()的时候,是通过nacosDiscoveryProperties对象获取的
在这里插入图片描述
nacosDiscoveryProperties是通过构造函数注入的,所以我们接着往上看
在这里插入图片描述

在这里插入图片描述

最终我们会发现,是通过解析配置文件中,以spring.cloud.nacos.discovery开头的配置信息
在这里插入图片描述
这也是nacos官网,告诉我们在配置文件中,要这样配置的原因
在这里插入图片描述

NacosServiceRegistry

这个类,可以看 this.serviceRegistry.register 这一小节,不再阐述

总结

对于nacos注册中心,业务应用是如何注册的,再总结下

  1. 在应用启动之前,我们需要引入springcloud-nacos相关的jar包
  2. 在jar包中,会通过springboot自动注入的功能,注入了NacosRegistration、NacosServiceRegistry、NacosAutoServiceRegistration这三个bean
  3. 其中NacosAutoServiceRegistration是继承了spring-cloud-common中的一个abstract类,在这个抽象类中,spring-cloud会定义好,服务注册的流程(简单来说,就是监听到WebServerInitializedEvent事件之后,会调用serviceRegistry.register()方法,方法的入参是通过registration类来获取的)
  4. spring-cloud-common中定义了注册的规则,至于底层的实现是nacos,还是zookeeper,还是其他注册中心,springcloud不关心,业务引入的是哪个类型的注册中心,这里就会调用对应的实现类去注册
  5. 所谓的注册,实际上在和nacos交互的时候,会通过http请求的方式去交互

相关文章:

nacos源码入门

nacos官方文档地址&#xff1a;nacos官方文档 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 简单来说&#xff0c;nacos就是一个注册中心、配置中心&#xff0…...

【记录】Samba|Windows 11的Samba连接切换用户

Samba是一个用于共享文件和打印机的网络协议&#xff0c;可以使不同的操作系统之间共享文件和资源变得容易。在Windows 11上&#xff0c;可以使用Samba来连接到网络共享。 如果您想在Windows 11上切换用户并连接到另一个Samba共享&#xff0c;可以按照以下步骤操作。 文章目录…...

vue hiprint vue使用hiprint打印控件VUE HiPrint HiPrint简单使用

vue hiprint vue使用hiprint打印控件VUE HiPrint HiPrint简单使用安装相关依赖安装Hi PrintJQuery引入依赖简单使用官方所有 打印示例安装相关依赖 安装Hi Print npm install vue-plugin-hiprintJQuery 因为 hi print 使用到了 JQuery 所以需要安装对应依赖 npm i jquery -…...

HBase常用Shell命令

HBase提供了一个非常方便的命令行交互工具HBase Shell。通过HBase Shell&#xff0c;HBase可以与MySQL命令行一样创建表、索引&#xff0c;也可以增加、删除和修改数据&#xff0c;同时集群的管理、状态查看等也可以通过HBase Shell实现。 一、数据定义语言 数据定义语言&…...

【阿里云】Apsara Clouder云计算专项技能认证-云服务器ECS入门,考试真题分享

以下是阿里云Apsara Clouder云计算专项技能认证-云服务器ECS入门真题汇总篇分享&#xff1a; 1.下列哪一个不是重置ECS密码的步骤? A. 查看实例详情 B.进入控制台 C.远程连接ECS D.点击控制台“概览” 2.针对云服务器ECS安全组说法正确的是 A.是一种物理防火墙 B.仅用于控制…...

怎样编写java程序

搭建好了Java开发环境之后&#xff0c;下面就来学习一下如何开发Java程序。为了让初学者更好地完成第一个Java程序&#xff0c;接下来通过几个步骤进行逐一讲解。 1&#xff0e;编写Java源文件 在D盘根目录下新建一个test文件夹&#xff0c;并在该文件夹中新建文本文档&#…...

面向对象设计模式:结构型模式之适配器模式

一、引入 Object Oriented Adapters 二、XX 模式 aka&#xff1a;Wrapper (包装器) 2.1 Intent 意图 Convert the interface of a class into another interface clients expect. 将一个类的接口转换成客户希望的另外一个接口. 作为两个不兼容的接口之间的桥梁 适配器模式使…...

Unity3D Shader系列之模板测试

一、 模板测试原理模板测试位于GPU渲染流水线的逐片元操作阶段&#xff0c;片元着色器完成之后就会进入模板测试&#xff0c;模板测试通过后再进入深度测试。我们的GPU中有一个模板缓冲区(Stencil Buffer)(Stencil即是模板的意思)&#xff0c;其大小为整个屏幕大小*8位&#xf…...

机器学习中的数学——精确率与召回率

在Yolov5训练完之后会有很多图片&#xff0c;它们的具体含义是什么呢&#xff1f; 通过这篇博客&#xff0c;你将清晰的明白什么是精确率、召回率。这个专栏名为白话机器学习中数学学习笔记&#xff0c;主要是用来分享一下我在 机器学习中的学习笔记及一些感悟&#xff0c;也希…...

Oracle启动数据库报ORA-01102解决办法

1.机器启动之后登录服务器使用sqlplus / as sysdba 登录数据库发现数据库并没有启动之前把数据库服务添加过开机自启动 2.使用startup命令启动数据库报错了 SYSorcl>startup; ORACLE 例程已经启动。 Total System Global Area 2471931904 bytes Fixed Size 2255752 byt…...

Go 语言面向对象编程及实践

面向对象编程是计算机科学中的一种重要的编程方法,它将数据和处理它的代码组合成对象,并将这些对象组合成更大的程序。在 Go 语言中,我们同样可以使用面向对象编程的方式进行开发。本篇文章将介绍 Go 语言面向对象编程的概念、特性、使用方法以及实践技巧。 面向对象编程概…...

0102 MySQL05

1.约束 1.约束&#xff08;constraint&#xff09;&#xff1a;在创建表时&#xff0c;可以给表中的字段加上一些约束&#xff0c;保证表中数据的完整性&#xff0c;有效性 常见的约束&#xff1f; 非空约束&#xff1a;not null 唯一性约束&#xff1a;unique 主键约束&am…...

[深入理解SSD系列 闪存2.1.3] 固态硬盘闪存的物理学原理_NAND Flash 的读、写、擦工作原理

2.1.3.1 Flash 的物理学原理与发明历程 经典物理学认为 物体越过势垒,有一阈值能量;粒子能量小于此能量则不能越过,大于此能 量则可以越过。例如骑自行车过小坡,先用力骑,如果坡很低,不蹬自行车也能 靠惯性过去。如果坡很高,不蹬自行车,车到一半就停住,然后退回去。 …...

洗地机哪家强?洗地机排行榜

随着清洁行业电器的开展&#xff0c;越来越多的新颖工具和电器开端进入消费者的生活之中。众所周知&#xff0c;面对美不胜收的清洁电器产品&#xff0c;选购也是一大头疼事&#xff0c;应该怎样选购洗地机等清洁电器呢&#xff0c;实在的用户体验和清洁效率莫过于消费者最看重…...

【Java基础 下】 029 -- 多线程

目录 一、为什么要有多线程&#xff1f; 1、线程与进程 2、多线程的应用场景 3、小结 二、多线程中的两个概念&#xff08;并发和并行&#xff09; 1、并发 2、并行 3、小结 三、多线程的三种实现方式 1、继承Thread类的方式进行实现 2、实现Runnable接口的方式进行实现 3、利用…...

R语言生物群落(生态)数据统计分析与绘图

查看原文>>>R语言生物群落&#xff08;生态&#xff09;数据统计分析与绘图 R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。本课程以生物群落数据分析中的最常用的统计方法回归和混…...

浙江首场千人大会现场爆满!实在智能九哥专题演讲:企业数字化转型,从实在RPA开始!

为帮助众多电商商家探索数字时代下新赛道、新趋势、新方向&#xff0c;制定有目标、有节奏的全年生意规划&#xff0c;“未来电商高峰论坛暨电商生态赋能大会”于3月4日在杭州正式拉开序幕。本次大会旨在向品牌电商企业主、运营操盘手分享数字电商时代的黄金趋势及运营策略&…...

Windows 上 执行docker pull命令 提示:The system cannot find the file specified.

错误提示error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/version": open //./pipe/docker_engine: The system cannot find the file specified.解决办法在cmd 窗口中执…...

查看 WiFi 密码的两种方法

查看 WiFi 密码的两种方法1. 概述2. 在控制面板中查看 WiFi 密码3. 使用 CMD 查看 WiFi 密码结束语1. 概述 突然忘记 WiFi 密码怎么办&#xff1f; 想连上某个使用过的 WiFi&#xff0c;但有不知道 WiFi 密码怎么办&#xff1f; 使用电脑如何查询 WiFi 密码&#xff1f; 以下是…...

逻辑优化基础-bi-decomposition

简介 bi-decomposition是逻辑综合中用于简化布尔函数的一种技术。其思想是将函数分成两个较小的函数&#xff0c;每个函数仅取决于所选变量的一个值。这些较小的函数可以使用简单的逻辑门&#xff08;如AND、OR和NOT门&#xff09;来实现&#xff0c;然后组合以获得原始函数的…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...