服务器的心跳协议,Nacos服务端心跳续约

2024-01-05 18:40

本文主要是介绍服务器的心跳协议,Nacos服务端心跳续约,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先看下服务端处理的InstanceController概览图:

4da87304db75

InstanceController概览图

当客户端调用reqApi向服务器发送Http PUT心跳请求,URI是/nacos/v1/ns/instance/beat,对应的controller就是InstanceController的beat方法。beat方法首先检查Instance是否存在,Instance不存在的情况:比如客户端超过30秒没有向服务器发送心跳,这时服务端会删除这个实例,30秒后再发送心跳时就会出现Instance不存在的情况。

说回来,如果实例不存在,并且客户端也没有发送BeatInfo包,这时会返回给客户端一个实例不存在的错误;如果Instance实例不存在,但客户端发送了BeatInfo包,这时能拿到BeatInfo里的信息,beat方法就会创建Instance对象,并调用ServiceManager类的registerInstance方法注册服务实例。

这个BeatInfo包就是客户端发送心跳时判断的参数:Light_Beat_Enabled,如果这个参数是false就发送,默认值就是false,这个逻辑在讲客户端时讲过一遍了。

我们具体看下InstanceController类beat方法代码:

4da87304db75

InstanceController类beat方法-1

4da87304db75

InstanceController类beat方法-2

4da87304db75

InstanceController类beat方法-3

ServiceManager类getInstance方法涉及到Service、Cluster、Instance的内存数据结构,服务注册就是把数据写到这几个类的关键变量中,服务发现也是从这几个类的变量中查找,所以这几个类的数据结构非常重要。

首先,Service服务是存储在ServiceManager类的serviceMap变量里,类型是:

Map> serviceMap = new ConcurrentHashMap<>();

Map里key含义如下:Map(namespace, Map(group::serviceName, Service))

serviceMap是个双层Map结构,先用namespace拿到该名字空间的所有Service,再用serviceName拿到Service对象。

Cluster集群存在Service类的clusterMap变量里,类型是:Map clusterMap = new HashMap<>();Map里key含义:Map;clusterMap中存储该service所有的集群,使用clustername可以直接拿到Cluster对象实例。

Instance分为临时服务和永久服务,是分开存的,在Cluster类中的2个变量里:

Set persistentInstances = new HashSet<>()   //永久服务实例

Set ephemeralInstances = new HashSet<>()  //临时服务实例

persistentInstances中是该集群中所有永久服务的Instance的集合;ephemeralInstances 是该集合中所有临时服务的Instance的集合,Instance对象是对应Ip、port、healthy等属性。

ServiceManager类getInstance就是从上面几个变量结构中查找到具体的Instance实例,如果数据结构中没有就创建一个Instance对象,然后调用ServiceManager类的registerInstance方法注册实例,registerInstance注册实例就是向那几个数据结构Map中塞数据,然后把注册数据再同步到nacos服务器集群其他节点。这个registerInstance注册服务逻辑后面会介绍。

接着看InstanceController类beat方法最后一段代码:

4da87304db75

InstanceController类beat方法-4

首先组装心跳基本属性到clientBeat对象,传给Service的processClientBeat方法,processClientBeat拿到ip和port就可以找到Instance,然后做该Instance的心跳续期。下面是给客户端设置心跳间隔时间和是否发送心跳BeatInfo对象,这2个属性设置后会覆盖默认属性(心跳间隔默认是5秒,默认发送BeatInfo),设置后返回给客户端后,客户端就按这个最新的属性设置发送心跳。之前在客户端上报心跳逻辑时,也详细讲过这2个属性。上面代码可以看出设置这2个属性的值是从nacos控制台拿到的,用户在控制台上可以设置这2个属性的metadata元数据,这个之后可以看下怎么在控制台设置这些元数据。

好了,InstanceController类beat方法我们说完了。

我们接着看下Service类的处理心跳方法processClientBeat,这个是服务端心跳的核心逻辑,见下图,只剩下最后这一个了:

4da87304db75

InstanceController类beat流程

看下processClientBeat代码:

4da87304db75

processClientBeat方法

这段代码很简单,创建一个处理心跳的处理器任务ClientBeatProcessor,然后扔到线程池中立即执行,见scheduleNow方法。我们看下ClientBeatProcessor这个线程怎么处理心跳的?

先看第一段,取出该服务的必要属性,主要是取出该服务的所有Instance,后面做遍历找要上报心跳的Instance。

4da87304db75

ClientBeatProcessor线程-1

再看最后一段:

4da87304db75

ClientBeatProcessor线程-2

这段是心跳服务续约的核心逻辑,先在所有Instance里找到匹配上报心跳的Instance,然后设置该实例的最后上报时间,nacos就是根据这个属性判断15秒心跳超时、30秒删除实例。然后刷新下实例的健康属性,比如上次心跳15超时,这个health属性会被设置成false,这次上报后会重置成健康true。最后调用PushService组件,该组件是通过udp协议向客户端推送服务变更信息,这个后面有详细说明。

这篇关于服务器的心跳协议,Nacos服务端心跳续约的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/573798

相关文章

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

Nacos日志与Raft的数据清理指南

《Nacos日志与Raft的数据清理指南》随着运行时间的增长,Nacos的日志文件(logs/)和Raft持久化数据(data/protocol/raft/)可能会占用大量磁盘空间,影响系统稳定性,本... 目录引言1. Nacos 日志文件(logs/ 目录)清理1.1 日志文件的作用1.2 是否可以删除

SpringCloud使用Nacos 配置中心实现配置自动刷新功能使用

《SpringCloud使用Nacos配置中心实现配置自动刷新功能使用》SpringCloud项目中使用Nacos作为配置中心可以方便开发及运维人员随时查看配置信息,及配置共享,并且Nacos支持配... 目录前言一、Nacos中集中配置方式?二、使用步骤1.使用$Value 注解2.使用@Configur

Windows Server 2025 搭建NPS-Radius服务器的步骤

《WindowsServer2025搭建NPS-Radius服务器的步骤》本文主要介绍了通过微软的NPS角色实现一个Radius服务器,身份验证和证书使用微软ADCS、ADDS,具有一定的参考价... 目录简介示意图什么是 802.1X?核心作用802.1X的组成角色工作流程简述802.1X常见应用802.

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N