002-Nacos 简单集群模式源码解析

news2024/11/16 19:57:51

目录

  • 介绍
    • 架构分析
    • 添加实例-同步信息给其他集群服务
    • 添加实例-提交同步任务
    • 添加实例-执行同步任务
    • 实例健康状态监控

介绍

在这里插入图片描述

Nacos 启动默认会使用集群模式,也就是没有带有-m standalone 的时候就是用的简单集群模式
另外我们再分析单机模式注册实例的时候最后一部分是把本次注册同步给集群其他服务

distroProtocol.sync(new DistroKey(key, KeyBuilder.INSTANCE_LIST_KEY_PREFIX), 
					DataOperation.CHANGE,globalConfig.getTaskDispatchPeriod() / 2);

本文章就来分析下简单集群模式的各种设计和源码

架构分析

简单集群模式下,首先还是实例注册
在集群模式下实例可以注册到任意一台Nacos服务上
Nacos服务自己把本次更新同步给同集群的其他服务

添加实例-同步信息给其他集群服务

sync(DistroKey distroKey, DataOperation action, long delay)//获取除自身外其他的服务Member
for (Member each : memberManager.allMembersWithoutSelf()) {
	//每个 Member在启动的时候都会启动一些列的接口 作为集群 Member 之间通信用
    DistroKey distroKeyWithTarget = new DistroKey(distroKey.getResourceKey(), distroKey.getResourceType(), each.getAddress());
    //组装一个任务 任务内容是 送到哪里 啥作用 延时时间
    DistroDelayTask distroDelayTask = new DistroDelayTask(distroKeyWithTarget, action, delay);
    //添加任务 等待执行
    //其实就是把任务加到一个 ConcurrentHashMap<Object, AbstractDelayTask> tasks 中
    distroTaskEngineHolder.getDelayTaskExecuteEngine().addTask(distroKeyWithTarget, distroDelayTask);
}

添加实例-提交同步任务

有 addTask 肯定就有获取任务并执行的地方

distroTaskEngineHolder.getDelayTaskExecuteEngine()//创建一个定时任务 默认延时 100 ms
processingExecutor.scheduleWithFixedDelay(new ProcessRunnable(), processInterval, processInterval, TimeUnit.MILLISECONDS);
ProcessRunnable#run
processTasks():

//keys = keys.addAll(tasks.keySet());
Collection<Object> keys = getAllTaskKeys();
for (Object taskKey : keys) {
	//获取一个任务  DistroDelayTask 
	AbstractDelayTask task = removeTask(taskKey);
	//获取处理方式
	//这个处理方式 在 DistroHttpRegistry Bean 注册的时候会在@PostConstruct 方法中设置
	//taskEngineHolder.registerNacosTaskProcessor(KeyBuilder.INSTANCE_LIST_KEY_PREFIX,
	//  new DistroHttpDelayTaskProcessor(globalConfig, taskEngineHolder));
	//但是这里设置的key是String类型的 之前设置任务的时候添加的是DistroKey 所以没有匹配的
	//就用的默认的NacosTaskProcessor : new DistroDelayTaskProcessor(this, distroComponentHolder);
	NacosTaskProcessor processor = getProcessor(taskKey);
	//这里会根据返回值判断是否不需要重试 重试就是把任务重新添加回去
	processor.process(task);
}
DistroDelayTaskProcessor#process(NacosTask task):

if (DataOperation.CHANGE.equals(distroDelayTask.getAction())) {
	//这里就是把 key 和 DistroSyncChangeTask 建立关系了
	DistroSyncChangeTask syncChangeTask = new DistroSyncChangeTask(distroKey, distroComponentHolder);
	//DistroExecuteTaskExecuteEngine.addTask(distroKey, executeTask);
	//distroKey : DistroKey
	distroTaskEngineHolder.getExecuteWorkersManager().addTask(distroKey, executeTask);
}


DistroExecuteTaskExecuteEngine#addTask(Object tag, AbstractExecuteTask task):
//这里为空的理由和上面的一样
NacosTaskProcessor processor = getProcessor(tag);
if (null != processor) {
     processor.process(task);
     return;
}
TaskExecuteWorker worker = getWorker(tag);
//这里做的也就是把 task 在放在一个 Queue中 TaskExecuteWorker@BlockingQueue<Runnable> queue
worker.process(task);

添加实例-执行同步任务

正如前边说的:有存放就有获取
在 TaskExecuteWorker 构造函数中就有 new InnerWorker(name).start();

Runnable task = queue.take();
task.run();
DistroSyncChangeTask#run

//type = KeyBuilder.INSTANCE_LIST_KEY_PREFIX
String type = getDistroKey().getResourceType();
//new DistroHttpAgent(memberManager) 中获取了 Datum (也就是 Instances)
DistroData distroData = distroComponentHolder.findDataStorage(type).getDistroData(getDistroKey());
distroData.setType(DataOperation.CHANGE);
//syncData 就是调用 http 发送信息了 /ns/distro/datum 这个不是一个openApi
boolean result = distroComponentHolder.findTransportAgent(type).syncData(distroData, getDistroKey().getTargetServer());

实例健康状态监控

我们知道实例注册后是需要监控健康状态的
但是现在是集群了,集群中只需要有一个服务监控就可以了

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

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

相关文章

【王道-绪论】

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 操作系统的概念功能和定义一、操作系统的概念和定义二、操作系统的功能和目标1、资源的管理者2、向用户提供服务2.1图形化用户接口2.2联机命令接口2.3脱机命令接口2.4程序接口 3、对硬件机器的拓展 三、总结 No.2 操作系…

Spring Cloud 系列之OpenFeign:(7)链路追踪zipkin

传送门 Spring Cloud Alibaba系列之nacos&#xff1a;(1)安装 Spring Cloud Alibaba系列之nacos&#xff1a;(2)单机模式支持mysql Spring Cloud Alibaba系列之nacos&#xff1a;(3)服务注册发现 Spring Cloud 系列之OpenFeign&#xff1a;(4)集成OpenFeign Spring Cloud …

第三章内存管理

1.内存的基础知识 内存可存放数据。程序执行前需要先放到内存中才能被CPU处理――缓和CPU与硬盘之间的速度矛盾 指令中的地址参数直接给出了变量x的实际存放地址(物理地址) 1&#xff0e;绝对装入 绝对装入:在编译时&#xff0c;如果知道程序将放到内存中的哪个位置,编译程序将…

springboot+Vue--打基础升级--(二)写个主菜单导航界面

1. 华为OD机考题 答案 2023华为OD统一考试&#xff08;AB卷&#xff09;题库清单-带答案&#xff08;持续更新&#xff09; 2023年华为OD真题机考题库大全-带答案&#xff08;持续更新&#xff09; 2. 面试题 一手真实java面试题&#xff1a;2023年各大公司java面试真题汇总--…

ansible(2)-- ansible常用模块

部署ansible&#xff1a;ansible&#xff08;1&#xff09;-- 部署ansible连接被控端_luo_guibin的博客-CSDN博客 目录 一、ansible常用模块 1.1 ping 1.2 command 1.3 raw 1.4 shell 1.5 script 1.6 copy 1.7 template 1.8 yum 11.0.1.13 主控端(ansible)11.0.1.12 被控端(k8s…

K8S deployment挂载

挂载到emptyDir 挂载在如下目录&#xff0c;此目录是pod所在的node节点主机的目录&#xff0c;此目录下的data即对应容器里的/usr/share/nginx/html&#xff0c;实现目录挂载 apiVersion: apps/v1 kind: Deployment metadata:annotations:deployment.kubernetes.io/revision: …

Qt实现简单的漫游器

文章目录 Qt的OpenGL窗口GLSL的实现摄像机类的实现简单的漫游器 Qt的OpenGL窗口 Qt主要是使用QOpenGLWidget来实现opengl的功能。  QOpenGLWidget 提供了三个便捷的虚函数&#xff0c;可以重载&#xff0c;用来重新实现典型的OpenGL任务&#xff1a; paintGL&#xff1a;渲染…

零基础入门网络安全,收藏这篇不迷茫【2023最新】

前言 最近收到不少关注朋友的私信和留言&#xff0c;大多数都是零基础小友入门网络安全&#xff0c;需要相关资源学习。其实看过的铁粉都知道&#xff0c;之前的文里是有过推荐过的。新来的小友可能不太清楚&#xff0c;这里就系统地叙述一遍。 01.简单了解一下网络安全 说白…

【ARM Linux 系统稳定性分析入门及渐进12 -- GDB内存查看命令 “x“(examine)】

文章目录 gdb 内存查看命令 examine 上篇文章&#xff1a;ARM Linux 系统稳定性分析入门及渐进11 – GDB( print 和 p 的使用| 和 &#xff1a;&#xff1a;的使用|ptype|{&#xff1c;type&#xff1e;} &#xff1c;addr&#xff1e; ) gdb 内存查看命令 examine examine是…

【C# 基础精讲】LINQ 基础

LINQ&#xff08;Language Integrated Query&#xff09;是一项强大的C#语言特性&#xff0c;它使数据查询和操作变得更加简洁、灵活和可读性强。通过使用LINQ&#xff0c;您可以使用类似SQL的语法来查询各种数据源&#xff0c;如集合、数组、数据库等。本文将介绍LINQ的基础概…

Kvm配置ovs网桥

环境&#xff1a;部署在kvm虚拟环境上&#xff08;让虚拟机和宿主机都可以直接从路由器获取到独立ip&#xff09; 1、安装ovs软件安装包并启动服务&#xff08;一般采用源码安装&#xff0c;此处用yum安装&#xff09; yum install openvswitch-2.9.0-3.el7.x86_64.rpm syste…

UVC摄像头

1 版本历史 1.1 UVC uvc_version UVC 1.0: Sep-4-2003 UVC 1.1: Jun-1-2005 UVC 1.5: August-9-2012, H.264 video codec. Linux 4.5 introduces UVC 1.5, but does not support H264. 1.2 V4L版本历史 Video4Linux取名的灵感来自1992 Video for Windows&#xff08;V4W&#x…

第一节 Dubbo框架的介绍

1. 什么是Dubbo &#xff1f; 官⽹地址&#xff1a; http://dubbo.apache.org/zh/ ⽬前&#xff0c;官⽹上是这么介绍的&#xff1a;Apache Dubbo 是⼀款⾼性能、轻量级的开源 Java 服务 框架 在⼏个⽉前&#xff0c;官⽹的介绍是&#xff1a;Apache Dubbo 是⼀款⾼性能、轻…

mysql的两张表left join 进行关联后,索引进行优化案例

一 mysql的案例 1.1 不加索引情况 1.表1没加索引 2.表2没加索引 3.查看索引 1.2 添加索引 1.表1添加索引 2.表2添加索引 3.查看

python使用dir()函数获取对象中可用的属性和方法(看不到python源码又想知道怎么调用,DLL调用分析,SDK二次开发技巧)

有时候调用一些SDK&#xff0c;但是人家又是封装成dll文件形式调用的&#xff0c;这时没法看源码&#xff0c;也不想看其对应的开发文档&#xff08;尤其有些开发文档写得还很难懂&#xff0c;或者你从某个开源社区拿过来&#xff0c;就根本没找到开发文档&#xff09;&#xf…

回归预测 | MATLAB实现IPSO-SVM改进粒子群优化算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现IPSO-SVM改进粒子群优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IPSO-SVM改进粒子群优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xf…

回归预测 | MATLAB实现WOA-BP鲸鱼优化算法优化BP神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现WOA-BP鲸鱼优化算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现WOA-BP鲸鱼优化算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本…

运动恢复结构(SfM)_OpenMVG_代码的核心逻辑

参考: 深蓝学院,基于图像的三维重建 课程 1. 输入输出 数据集 fountain,选⾃Lund University开源的三维重建数据集 (http://www.maths.lth.se/matematiklth/personal/calle/dataset/dataset.html ) 2. 特征提取与特征匹配

优于立方复杂度的 Rust 中矩阵乘法

优于立方复杂度的 Rust 中矩阵乘法 迈克克维特 跟随 发表于 更好的编程 6 分钟阅读 7月 <> 143 中途&#xff1a;三次矩阵乘法 一、说明 几年前&#xff0c;我在 C 年编写了 Strassen 矩阵乘法算法的实现&#xff0c;最近在 Rust 中重新实现了它&#xff0c;因为我继续…

TCP报文段的首部格式

TCP传送的数据单元称为报文段&#xff0c;既可以用来运载数据&#xff0c;又可以用来建立连接、释放连接和应答 一个TCP报文段可以分为首部和数据部分&#xff0c;整个TCP报文段作为IP数据报的数据部分封装在IP数据报中。首部的固定长度为20B&#xff0c;因此最短为20B&#xf…