Nacos服务健康检查与服务变动事件发布源码解析

news2024/10/7 18:28:38

目录

  • 1 快速入门使用
  • 2 源码解析
    • 2.1 环境准备
    • 2.2 查看实例列表源码分析
    • 2.3 nacos与zk的不同 :
    • 2.4 nacos服务发现
    • 2.5 nacos的心跳机制和服务健康检查的逻辑


1 快速入门使用

在这里插入图片描述

SpringCloud Nacos配置中心:https://blog.csdn.net/ZGL_cyy/article/details/113621565
SpringCloud Nacos实战应用: https://blog.csdn.net/ZGL_cyy/article/details/130873488

2 源码解析

2.1 环境准备

下载源码或者安装包

你可以通过源码和发行包两种方式来获取 Nacos。

从 Github 上下载源码方式

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

nacos提供了一些api, 其中有一个api就是用来发现服务的

https://nacos.io/zh-cn/docs/open-api.html

在这里插入图片描述

2.2 查看实例列表源码分析

在这里插入图片描述
nacos通过springboot的自动装配, 在项目启动时候通过nacos提供的api去nacos服务端拉取服务

查看源码 :

在这里插入图片描述

进入NacosDiscoveryAutoConfiguration类查看, 看一下自动装配的源码

在这里插入图片描述

进入this.namingService().selectInstances方法

在这里插入图片描述

在这里插入图片描述

为什么springboot刚启动, 第一次调用注册的服务速度会慢? 就是因为nacos的服务是懒加载的, 我们只有请求了一次服务, nacos才会去服务端将所有注册的服务获取到(上面if中的逻辑), 当我们第二次调用时, 已经获取到服务了, 只需要调用就可以了, 所有第一次请求的速度比较慢

2.3 nacos与zk的不同 :

总所周知, zk底层采用netty长连接的方式发送心跳, 来判断服务端的服务是否挂掉, 而nacos则是采用短连接 + 周期性线程池(请求服务列表api)的方式来判断服务是否挂掉

上面已经说了nacos服务发现的原理, 让我们来看看第一次服务发现 与周期性服务发现的代码实现

2.4 nacos服务发现

服务第一次发现 :

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

周期性服务发现 :

在这里插入图片描述

进入this.scheduleUpdateIfAbsent方法

在这里插入图片描述

在这里插入图片描述

进入this.updateService(this.serviceName, this.clusters);

在这里插入图片描述

在这里插入图片描述

服务发现就此结束

2.5 nacos的心跳机制和服务健康检查的逻辑

接下来一起看一下nacos的心跳机制和服务健康检查的逻辑

从nacos的服务注册开始查看(注册的源码分析上一篇有所讲解), nacos的客户端服务注册过程中有这样一行代码

在这里插入图片描述

分别进入两个方法

在这里插入图片描述

在这里插入图片描述

此次是一个延时线程池, 过了5秒之后,去执行run方法, 接下来进入run方法

在这里插入图片描述

进入serverProxy.sendBeat方法

在这里插入图片描述

在这里插入图片描述

发送实例心跳, nacos在服务注册的时候, 就会通过线程池延时五秒发送心跳, 此处只发送了一次心跳, 按照我们的理解, 应该是持续发送心跳的, 那么接下来继续看run方法中的另一个方法

在这里插入图片描述

通过反复的执行run方法, 来达到每隔5s中发送一次心跳的功能

到此nacos的客服端服务注册完成, 接下来查看一下nacos服务端是如何持续的进行心跳检测的 :

由于方法层次太多就不贴图了, 方法调用路径

InstanceController.register -> 
getInstanceOperator().registerInstance(namespaceId, serviceName, instance); -> InstanceOperatorServiceImpl.registerInstance -> serviceManager.registerInstance(namespaceId, serviceName, coreInstance); -> createEmptyService(namespaceId, serviceName, instance.isEphemeral()); -> createServiceIfAbsent(namespaceId, serviceName, local, null); -> putServiceAndInit(service); ->
service.init(); ->

最终进入init()方法

在这里插入图片描述

此处又可以看见一个线程池, 进入scheduleCheck方法

在这里插入图片描述

接下来进入run方法查看 (他的子类ClientBeatCheckTask类中)

在这里插入图片描述

在这里插入图片描述

到此为止, 发送心跳和服务的健康状态检查源代码查看完毕

现在大家可能有这样一个疑问, 如果一个服务新注册到nacos服务端, 那么服务发现者们只有在5s之后拉取服务的时候才会发现有新的服务, 那么就会有一个5s的延时发现服务, 其实这样是可以接受的, 但是nacos对此也进行了优化, 如果一个新的服务注册到nacos服务端, 注册完成之后,nacos会利用事件发布, 给所有的服务发现者发送事件, 让服务发现者可以更快的发现服务

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

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

相关文章

前端瀑布流效果

先看效果 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &l…

MT8788安卓核心板详细参数_MTK安卓主板开发板智能通讯模块

MT8788安卓核心板集成了一个高效的12nm SoC&#xff0c;内置4G LTE调制解调器&#xff0c;将强大的硬件与到处可连接的全面功能设计相结合。 MTK8788智能终端具备许多功能&#xff0c;包括4G、2.4G/5G双频WiFi、蓝牙4.2BLE、2.5W功放、USB、mipi屏接口、三路摄像头接口、GPS和…

Day 39 动态规划part02 : 62.不同路径 63. 不同路径 II

62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xf…

Pandas小白入门散记(3)---Series.str--源代码定位问题

文章目录 问题点原因解释 碰到了&#xff0c;一个错误&#xff0c;debug才定位到问题&#xff0c;记录一下。 本次最大收获是&#xff0c;pandas果然代码逻辑复杂&#xff0c;一个小小的异常捕捉&#xff0c;处处是门道。。。。。。 希望本次浅显的代码阅读过程&#xff0c;给…

使用element-ui导航,进入对应的三级页面菜单保持点击状态

1.注意事项 01.路由中使用了keepAlive属性&#xff0c;要用keepAlive&#xff1a;true&#xff0c;不能等于false&#xff0c;使用false页面会刷新 2.使用的方法 NavMenu 导航菜单 3.项目实例 <template><div class"policy-home"><div class"…

QHttpServer

QLineEdit-----输入提示 改动CmakeLists.txt 在帮助–索引查找QHttpServer 改动CmakeLists.txt&#xff0c;有三处改动 在谷歌浏览器测试&#xff0c;输入127.0.0.1/api/login 测试代码 #include<QCoreApplication> #include <QHttpServer> //http服务器 int m…

查看显卡显存

1、cmd或者终端输入&#xff1a; nvidia-smi4096为显存总大小&#xff0c;1228为目前使用的显存大小 2、或者在编辑器中直接安装gpustat包进行查看 pip install gpustat gpustat -cpuigpustat -cpui用于查看当前GPU使用情况 更直观&#xff1f; CtrlC 退出

小白学go基础06-了解切片实现原理并高效使用

slice&#xff0c;中文多译为切片&#xff0c;是Go语言在数组之上提供的一个重要的抽象数据类型。在Go语言中&#xff0c;对于绝大多数需要使用数组的场合&#xff0c;切片实现了完美替代。并且和数组相比&#xff0c;切片提供了更灵活、更高效的数据序列访问接口。 切片究竟是…

JavaScript-----函数

目录 前言&#xff1a; JavaScript函数 1. 定义函数 构造函数 2. 调用函数 函数的自执行 3. 函数的参数 4. 函数返回值 5. 作用域 6. 匿名函数 7. this指向性问题&#xff08;重点&#xff09; 7.1 this的性质 7.2 call的用法 7.3 apply的用法 7.4 bind的用法&a…

KMP超高效匹配算法

简介&#xff1a; KMP算法是一种改进的字符串匹配算法&#xff0c;其中&#xff0c;KMP算法的运用核心是利用匹配失败后的信息&#xff0c;最大进度的减少模式串与目标串的匹配次数以达到快速匹配的效果。算法与暴力求解的改进在于每当一趟匹配过程中出现的字符比较不相等时&am…

无涯教程-JavaScript - NOW函数

描述 NOW函数返回当前日期和时间的序列号。 语法 NOW ()争论 NOW函数语法没有参数。 Notes 如果在输入功能之前单元格格式为"常规",则Excel会更改单元格格式,使其与您的区域设置的日期和时间格式匹配。您可以使用功能区"主页"options卡"数字&quo…

Java学习笔记——34多线程01

多线程 实现多线程进程和线程的区别多线程的实现方式方式一&#xff1a;继承Thread类设置线程名称线程调度线程控制线程生命周期 方式二&#xff1a;实现Runnable接口 实现多线程 进程和线程的区别 进程&#xff1a;是正在运行的程序 是系统进行资源分配和调用的独立单位每一…

文章预览 安防监控/视频存储/视频汇聚平台EasyCVR播放优化小tips

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&#xff0c;…

IG 自动回复:提供无间断客户互动体验

图片来源于&#xff1a;SaleSmartly官网 2023&#xff0c;Instagram拥有将近13亿的月活跃用户&#xff0c;在香港拥有超过400万活跃用户。 Instagram 以图片、长短影片、直播等高互动性的互动方式&#xff0c;吸引了广大的年轻族群&#xff0c;34岁以下的用户即占比了将近全球整…

Day55|动态规划part16:583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

583. 两个字符串的删除操作 leetcode链接&#xff1a;力扣题目链接 视频链接&#xff1a;&#xff1a;LeetCode&#xff1a;583.两个字符串的删除操 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。每步 可以删除任意一个字符串中的…

两个路由器如何连接设置的方法攻略

一、前言 随着智能家居时代来临&#xff0c;家里的网络部署需求开始复杂起来。往往一个路由器已经不能满足需求或者不利于拓展。两个路由器连接最常见的情况是家中已有一个路由器&#xff0c;并且已经通过这个路由器来正常上网。现在是因某些原因想在不改变已经在用的路由器的设…

mysql 字段用了关键字, 无法插入更新数据

1. 表字段用了关键字 explain 2. sql语句中用包裹住关键字 (注意不是单引号) <if test"explain ! null">explain,</if>

CRMEB多端多语言系统文件上传0Day代审历程

Git仓库&#xff1a; https://github.com/crmeb/CRMEB简介&#xff1a; 两天攻防中&#xff0c;某政局子公司官网后台采用的CRMEB开源商城CMS&#xff0c;挺奇葩&#xff0c;别问怎么总让我碰到这种东西&#xff0c;我也不知道&#xff0c;主打的就是一个魔幻、抽象。最后通过…

基于环形队列的生产消费模型

目录 一、信号量 1.提出问题 2.信号量的概念 3.信号量的基本操作 &#xff08;1&#xff09;PV操作 &#xff08;2&#xff09;信号量的使用 二、基于环形队列的生产消费模型 1.环形队列 &#xff08;1&#xff09;复习 &#xff08;2&#xff09;现象 &#xff08;…

酷雷曼第二期无人机技能培训圆满举办

第2期无人机技能培训 2023年8月24日-8月25日&#xff0c;第二期酷雷曼无人机技能培训及执照考试在北京圆满举办&#xff0c;来自五湖四海、全国各地的合作商千里相聚&#xff0c;培训现场热闹融洽&#xff0c;再续精彩盛况。 随着《无人驾驶航空器飞行管理暂行条例》正式发布…