Nacos源码之服务注册

news2025/1/6 19:16:44

1. 准备工作

​ 我们在使用Nacos作为SpringCloud中的注册中心组件时,最常用到的是它的三个功能:服务注册、服务发现和配置中心。

​ 现在我们单机启动多个user-client,当我们成功运行UserClientApplication后可以在IDEA的service一栏中找到SpringBoot项目:

在这里插入图片描述

​ 可以看到user-client的启动端口号是8082,和配置文件保持一致。

​ 这时我们再去nacos上看看,可以看到user-client成功注册到Nacos上:

在这里插入图片描述

​ 接着在Services一栏右键UserClientApplicationCopy Configuration

在这里插入图片描述

自定义实例名称 → 点击 modify options → Program arguments

在这里插入图片描述

​ 配置端口号,不能与已启动服务的端口号重复:

在这里插入图片描述

​ 启动新配置好的服务:

在这里插入图片描述

​ 此时Nacos上服务如下,可以看到有两个user-client的服务:

在这里插入图片描述

2. Nacos服务注册入口程序分析

​ 与Spring相比,SpringCloud源码的入口程序可能比较”隐蔽“,并不是很直观。这时我们可以从两个方面入手:注解和自动配置类(也就是spring.factories文件)。

在这里插入图片描述

​ 我们去查看这个依赖对应的spring.factories文件:

在这里插入图片描述

​ 可以从类名推断,与服务注册相关的自动配置类是NacosServiceRegistryAutoConfiguration,所以我们直接去这个类里面看看:

在这里插入图片描述

​ 可以看到,NacosServiceRegistryAutoConfiguration内部会注册三个Bean:NacosServiceRegistryNacosRegistrationNacosAutoServiceRegistration

​ 其中NacosAutoServiceRegistration依赖于NacosServiceRegistryNacosRegistration,服务注册的主要逻辑在NacosAutoServiceRegistration中。

3. NacosAutoServiceRegistration源码分析

3.1 Nacos服务注册时机

​ 我们先来看看服务注册是在SpringCloud启动过程中哪一步完成的。

​ 我们来看看NacosAutoServiceRegistration的类图:

在这里插入图片描述

​ 可以看到NacosAutoServiceRegistration的直接父类是AbstractAutoServiceRegistration,而AbstractAutoServiceRegistration实现了监听器接口ApplicationListener,会重写onApplicationEvent方法:

在这里插入图片描述

​ 所以我们可以推测,上下文容器在启动某一时刻会发布WebServerInitializedEvent类型的事件,该事件会被器NacosAutoServiceRegistration监听(其实是其父类器AbstractAutoServiceRegistration),然后调用onApplicationEvent方法,该方法会调用start方法,start方法里面会调用register方法完成服务注册。


​ 那么,SpringCloud会在什么时候发布WebServerInitializedEvent类型的事件呢?

​ 之前讲解Spring源码时有提到过,启动的核心方法refresh里面会在实例化所有Bean后调用finishRefresh方法,该方法里面会发布一些事件。

​ 因此我们回过头再来看看AbstractApplicationContextfinishRefresh方法:

在这里插入图片描述

​ 进入到onRefresh方法会涉及到bean的生命周期的处理,最后会调用WebServerStartStopLifecyclestart方法:

在这里插入图片描述

​ 可以看到这里会发布ServletWebServerInitializedEvent类型的事件,ServletWebServerInitializedEvent的父类是WebServerInitializedEvent,最终会被NacosAutoServiceRegistration监听,启动Nacos服务注册:

在这里插入图片描述

​ 总结一下,Nacos服务注册发生的时机是SpringCloud启动时的finishRefresh阶段,该阶段已经完成了beanFactory中bean的实例化。

3.2 服务注册源码实现

​ 我们前面有说过AbstractAutoServiceRegistrationregister方法是服务注册的入口:

在这里插入图片描述

​ 我们看看NacosRegistryregister方法:

在这里插入图片描述

​ 首先是关于NamingServiceNacosServiceRegistry有一个NacosServiceManager类型的属性,它来负责生产管理NamingService

在这里插入图片描述

​ 我们继续看看NamingServiceregisterInstance方法:

在这里插入图片描述

getExecuteClientProxy方法主要通过当前实例是否是临时的来选择不同的请求模式:

在这里插入图片描述

​ 我们先看NamingGrpcClientProxy

在这里插入图片描述

​ 再看看NamingHttpClientProxy

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2025和数集团新年献词|和合与共,生生不息

2024年12月30日,“和数新春会”在上海环球港凯悦酒店举行,和数集团董事长兼总经理唐毅、集团高管和市场骨干欢聚一堂,共迎新春。 告别收获的2024,迎来腾飞的2025。 回望来时路,我们在挑战中砥砺前行,在困…

web 开发全局覆盖文件上传身份验证漏洞利用

全局覆盖 首先认识全局变量和局部变量 再一个就是知道全局变量是全局使用的并且有个特点就是可以覆盖 这个就是全局变量我们输出一下发现 z居然等于函数内的计算值 把我们原来定义的全局变量 $z给覆盖了 看一下局部变量 这个时候 z就不会被覆盖 <?php $x1; $y2; …

Day3 微服务 微服务保护(请求限流、线程隔离、服务熔断)、Sentinel微服务保护框架、分布式事务(XA模式、AT模式)、Seata分布式事务框架

目录 1.微服务保护 1.1.服务保护方案 1.1.1 请求限流 1.1.2 线程隔离 1.1.3 服务熔断 1.2 Sentinel 1.2.1.介绍和安装 1.2.2 微服务整合 1.2.2.1 引入sentinel依赖 1.2.2.2 配置控制台 1.2.2.3 访问cart-service的任意端点 1.3 请求限流 1.4 线程隔离 1.4.1 OpenFeign整合Senti…

使用 TensorFlow 打造企业智能数据分析平台

文章目录 摘要引言平台架构设计核心架构技术栈选型 数据采集与预处理代码详解 数据分析与预测代码详解 数据可视化ECharts 配置 总结未来展望参考资料 摘要 在大数据时代&#xff0c;企业决策正越来越依赖数据分析。然而&#xff0c;面对海量数据&#xff0c;传统分析工具常因…

计算机毕业设计Python动漫推荐系统 漫画推荐系统 动漫视频推荐系统 机器学习 bilibili动漫爬虫 数据可视化 数据分析 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

单北斗露天矿山人员车辆定位方案

你好&#xff0c;我是北京华星智控小智&#xff0c;我来给您介绍我公司的矿山人员定位系统。我们的露天矿山人员定位系统基于北斗技术&#xff0c;主要用于矿山人员和车辆的定位。 我们的矿山人员车辆定位设备主要有图上的3种&#xff0c;1是车辆定位的车载终端&#xff0c;他…

Gitlab17.7+Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用)

一、gitlab设置&#xff1a; 1、进入gitlab选择主页在左侧菜单的下面点击管理员按钮。 2、选择左侧菜单的设置&#xff0c;选择网络&#xff0c;在右侧选择出站请求后选择允许来自webhooks和集成对本地网络的请求 3、webhook设置 进入你自己的项目选择左侧菜单的设置&#xff…

java项目之高校心理教育辅导系统的设计与实现(springboot+mybatis+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 高校心理教育辅导系统的设…

Cesium 实战 27 - 三维视频融合(视频投影)

Cesium 实战 27 - 三维视频融合(视频投影) 核心代码完整代码在线示例在 Cesium 中有几种展示视频的方式,比如墙体使用视频材质,还有地面多边形使用视频材质,都可以实现视频功能。 但是随着摄像头和无人机的流行,需要视频和场景深度融合,简单的实现方式则不能满足需求。…

MAC系统QT图标踩坑记录

MAC系统QT图标踩坑记录 1. 准备图标1.1 方法一&#xff1a;下载准备好的图标1.2 方法二&#xff1a;自己生成图标1.2.1 准备一个png文件1.2.2 用sips生成不同大小的图片1.2.3 用iconutil生成图标文件 2. 配置图标2.1. 把图标改命成自己想要的名字&#xff0c;如icon.icns&#…

ARM64 Windows 10 IoT工控主板运行x86程序效率测试

ARM上的 Windows 10 IoT 企业版支持仿真 x86 应用程序&#xff0c;而 ARM上的 Windows 11 IoT 企业版则支持仿真 x86 和 x64 应用程序。英创推出的名片尺寸ARM64工控主板ESM8400&#xff0c;可预装正版Windows 10 IoT企业版操作系统&#xff0c;x86程序可无需修改而直接在ESM84…

汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型,识别率89.7%

汽车损坏识别检测数据集&#xff0c;使用yolo&#xff0c;pasical voc xml&#xff0c;coco json格式标注&#xff0c;6696张图片&#xff0c;可识别11种损坏类型损坏&#xff1a; 前挡风玻璃&#xff08;damage-front-windscreen &#xff09; 损坏的门 &#xff08;damaged-d…

西门子1200PLC和三菱FX3系列PLC接线方法

1、西门子1200PLC接线方法。* 2、从三菱官方手册查询得知&#xff0c;S/S公共端有两种接法&#xff0c;但是为了与西门子1200接法保持一致&#xff0c;所以也建议采用S/S公共点0V的接法。 **【总结】 三菱输入端采用公共点接0V接法建议提升至公司内部标准规范&#xff1a; …

一文理清JS中获取盒子宽高各方法的差异

前言 这段时间在研究一个反爬产品&#xff0c;环境检测用到了很多个盒子宽高取值方法&#xff0c;如window.outerWidth、window.screen.availWidth&#xff0c;各个方法取值结果不大相同&#xff0c;在此记录下遇到的方法。 各宽方法区别 这里就讲解下各宽度方法的区别&…

AWVS安装使用教程

一、AWVS工具介绍及下载 AWVS工具介绍 AWVS&#xff08;Acunetix Web Vulnerability Scanner&#xff09;是一款知名的网络漏洞扫描工具&#xff0c;它通过网络爬虫测试你的web站点&#xff0c;检测流行安全漏洞&#xff0c;可以检查SQL注入漏洞&#xff0c;也可以检查跨站脚…

用Python操作字节流中的Excel文档

Python能够轻松地从字节流中加载文件&#xff0c;在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作&#xff0c;并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性&#xff0c;还确保了数据的安全性和完整性&#xff0c;尤其是在网络…

【LeetCode】928、尽量减少恶意软件的传播 II

【LeetCode】928、尽量减少恶意软件的传播 II 文章目录 一、并查集1.1 并查集 二、多语言解法 一、并查集 1.1 并查集 先把普通点, build 并查集遍历每个源头点, 找源头点附近的点所在的集合, 传染该集合拯救节点 3.1 若该节点 所在集合, 从未被感染过, 则开始感染 3.2 若该节…

(NDSS2024)论文阅读——仅低质量的训练数据?用于检测加密恶意网络流量的稳健框架

文章基本信息 作者&#xff1a;Yuqi Qing et al. &#xff08;清华大学李琦团队&#xff09; 代码 文章 摘要 存在问题&#xff1a;收集包含足够数量的带有正确标签的加密恶意数据的训练数据集是具有挑战性的&#xff0c;当使用低质量的训练数据训练机器学习模型时&#xff…

如何将CSDN文章 导出为 PDF文件

一、首先&#xff0c;打开我们想要导出为 PDF格式的 CSDN文章&#xff0c;以下图为例。 二、按 F12 调出浏览器调式模式后&#xff0c;选择 控制台 三、在控制台处粘贴代码 代码&#xff1a; (function(){ use strict;var articleBox $("div.article_content"…

YApi接口管理平台本地搭建方法介绍

YApi是一个免费开源的API管理平台&#xff0c;开发人员可用它来管理、调试接口&#xff0c;并且提供了API文档管理和测试功能&#xff0c;具有友好的UI页面&#xff0c;本文介绍Linux环境如何安装部署YApi接口管理平台。 目录 1 环境准备2 安装部署2.1 安装nodejs2.2 安装 Mong…