微服务学习-SpringCloud -Nacos (集群及CP架构相关学习)

news2025/4/8 4:00:06

文章目录

  • Nacos集群下心跳机制相对于单机会有怎样的改变?
  • CAP原则和BASE原则
  • 常见的注册中心实现对比
  • Nacos集群实现协议
  • Nacos CP架构实现源码
  • Nacos CP架构leader是如何选举的呢?

Nacos集群下心跳机制相对于单机会有怎样的改变?

在上一遍单机模式下心跳机制的文字中有提到过这段代码:
在这里插入图片描述
我们发现第一个判断,如果这个服务的心跳不是由当前server负责,直接退出。这句话是什么意思呢?我们现在就来阅读以下其中源码。
在这里插入图片描述
通过这样一个逻辑,取到对应的Nacos机器。

  • 这样的做的原因是什么呢?

当Nacos在集群模式下,需要对客户端的机器检查心跳,维护心跳,那么需要集群中的每台机器都去检查心跳吗?肯定是只有一台去做心跳检查,然后进行同步,这样设计才是合理的。所以再看上面的代码,当有服务进行健康检查时,执行到这个方法,取模以后发现负责心跳检查的服务并不是当前服务,那么直接退出。只有当负责这个服务心跳检查的服务执行时才能正常执行。
后续逻辑就和单机模式一样了。

  • 如果其中一台集群挂了,取模不就发生错误了,需要使用一致性hash算法吗?
    不需要。Nacos集群相互之间也维护了心跳,它会定时的去调用其它集群机器的心跳接口, 如果一段時間未请求在,则认为服务已经挂了,则会更新服务size,解决取模发生错误。这就是集群服务之间节点状态的同步。
    Nacos对于每个节点独立处理的数据,会及时同步给其它节点,来保持一个数据的一致性,可能会有一点点时间延迟,但是基本可以忽略。

CAP原则和BASE原则

  • CAP原则
    C:一致性(Consistency)
    A:可用性(Availability)
    P:分区容错性(Partition tolerance)
  • BASE原则
    BA:基本可用(Basically Available)
    S:软状态(Soft State)
    E:最终一致性(Eventual Consistency)

常见的注册中心实现对比

  • mysql单机(CA)
  • eureka集群(AP)
  • zookeeper集群(CP)
  • nacos集群(AP或CP)
  • redis集群(AP)

Nacos集群实现协议

  • AP架构
    阿里自研的distro协议。
    特点:
    Nacos每个节点都平等的处理写请求,同时会把新数据同步到其它节点。
    每个节点只负责部分数据,比如上面提到的心跳检查,每个节点负责一部分心跳检查,然后将结果同步给其它节点来保持数据一致性。
    每个节点独立处理读请求,及时从本地发出响应。
  • CP架构
    raft协议。
    特点:
    实现简单,使用方便。
    能够保证强一致性。

Nacos CP架构实现源码

在这里插入图片描述
先看看英文注释:使用简化的raft协议管理nacos集群。
后面这个类会在1.4.x版本废弃,后面会使用JRaft协议。先来看看raft协议的使用吧。
在这里插入图片描述
我们从这个方法开始看起,
在这里插入图片描述

  • 当前这个节点是否是leader

如果不是leader节点,那么会调用API。
在这里插入图片描述
调用API,发送http请求,请求这个地址:/v1/ns/raft/datum。
这块就相当于,一个写请求进来,发现这个节点不是leader节点,那么它就会把这个请求进行转发,转发给leader节点。

  • 当前节点是leader节点 在这里插入图片描述
    如果是leader节点,那么写数据时,肯定要先加锁,防止并发冲突,然后重点看一下onPublish方法。
    在这里插入图片描述
    通过raft算法进行写数据。
    在这里插入图片描述
    写文件,刷盘。
    那么文件会写到哪里呢,我们看下cacheFileName:
    在这里插入图片描述
    最后数据文件会放在这个这个目录下。
    然后,数据文件写完之后,后面会进行同步操作。在这里插入图片描述
    发布一个数据变动事件。
    在这里插入图片描述
    在这里插入图片描述
    里面调用了listener.onChange方法,刷新内存。
    然后再回到最外面的方法:
    在这里插入图片描述
    onPublish执行完成后,也就是leader执行执行完成后,创建了一个CountDownLatch,这个就是用来保证同步半数以上从节点。经典的半数以上写实现方式。
    在这里插入图片描述
    需要半数以上。
    在这里插入图片描述
    请求地址:
    在这里插入图片描述
    一步就直接提交,没有两阶段,所以这是简化版的raft算法。
    在这里插入图片描述
    执行完成后latch减一。
    最后等待执行完成就结束了。

Nacos CP架构leader是如何选举的呢?

我们从init()来看看源码:
在这里插入图片描述
再往下是两个任务,第一个是主节点的选举,第二个是心跳任务。
在这里插入图片描述
先看第一个主节点选举任务。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再看一下peers.decideLeader(peer);方法:
在这里插入图片描述
然后再回头看一下刚刚的HTTP请求:

 final String url = buildUrl(server, API_VOTE);
 String API_VOTE = UtilsAndCommons.NACOS_NAMING_CONTEXT + "/raft/vote";

在这里插入图片描述

 public synchronized RaftPeer receivedVote(RaftPeer remote) {
        if (stopWork) {
            throw new IllegalStateException("old raft protocol already stop work");
        }
        if (!peers.contains(remote)) {
            throw new IllegalStateException("can not find peer: " + remote.ip);
        }
        
        RaftPeer local = peers.get(NetUtils.localServer());
        // 如果收到的候选节点的term小于本节点的term
        if (remote.term.get() <= local.term.get()) {
            String msg = "received illegitimate vote" + ", voter-term:" + remote.term + ", votee-term:" + local.term;
            
            Loggers.RAFT.info(msg);
            // 则更新votefor为本节点,也就是说本节点更适合做leader
            if (StringUtils.isEmpty(local.voteFor)) {
                local.voteFor = local.ip;
            }
            
            return local;
        }
        // 否则,更新重置选举时间
        local.resetLeaderDue();
        // 设置状态为follow
        local.state = RaftPeer.State.FOLLOWER;
        // 投票给该候选节点
        local.voteFor = remote.ip;
        local.term.set(remote.term.get());
        
        Loggers.RAFT.info("vote {} as leader, term: {}", remote.ip, remote.term);
        // 然后将本地节点作为http结果返回
        return local;
    }

之后就是刚刚的后续操作,拿到后遍历查看票数,如果大于半数,设置自己为leader。

这块代码在高版本就被启用了,引入了jraft,所以简单了解这块思想就好。

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

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

相关文章

百万赞同:网络安全为什么缺人? 缺什么样的人?

1.网络安全为什么缺人? 缺人的原因是有了新的需求 以前的时候&#xff0c;所有企业是以产品为核心的&#xff0c;管你有啥漏洞&#xff0c;管你用户信息泄露不泄露&#xff0c;我只要做出来的产品火爆就行。 这一切随着《网络安全法》、《数据安全法》、《网络安全审查办法》…

No.041<软考>《(高项)备考大全》【第25章】量化项目管理

第25章】量化项目管理 1 考试相关2 量化项目管理3 准备量化管理项目4 量化的管理项目5 练习题参考答案: 1 考试相关 选择可能考0-1分&#xff0c;案例论文不考。 2 量化项目管理 量化项目管理&#xff08;QPM&#xff09;的目的在于量化地管理项目&#xff0c;以达成项目已建…

Auto-GPT 5分钟详细部署指南

安装 conda 1. 下载安装 miniconda3 &#xff1a; Miniconda — conda documentation conda是一个包和环境管理工具&#xff0c;它不仅能管理包&#xff0c;还能隔离和管理不同python版本的环境。类似管理nodejs环境的nvm工具。 2. conda环境变量&#xff1a; 新建 CONDA_H…

混合网络监控工具

多年来&#xff0c;网络不可避免地变得更加复杂。混合网络架构包括跨多个供应商的 LAN、WAN、公共或私有云存储以及混合云。简而言之&#xff0c;它是虚拟和物理网络组件的混合体&#xff0c;自远程工作出现以来&#xff0c;这种类型的网络架构已经起飞。 什么是混合网络 混合…

【《C和指针》笔记】第一章<快速上手>

注释以/*开始到*/结束或者使用// .预处理指令&#xff1a;因为它们是由预处理器解释的&#xff0c;预处理器读入代码&#xff0c;根据预处理指令对其进行修改&#xff0c;然后把修改过的源代码递交给编译器。预处理指令&#xff08;#include、#define&#xff09;所定义的变量…

【论文阅读笔记|CASE 2022】EventGraph: Event Extraction as Semantic Graph Parsing

论文题目&#xff1a;EventGraph: Event Extraction as Semantic Graph Parsing 论文来源&#xff1a;CASE2022 论文链接&#xff1a;https://aclanthology.org/2022.case-1.2.pdf 代码链接&#xff1a;GitHub - huiling-y/EventGraph 0 摘要 事件抽取涉及到事件类型检测、…

【Scala】集合

目录 类型 不可变集合 可变集合 数组 不可变 可变数组 不可变数组与可变数组的转换 多维数组 List list运算符 可变 ListBuffer Set 集合 不可变 Set 可变 mutable.Set Map 集合 可变 Map 元组 操作 通用操作 衍生集合操作 计算函数 排序 sorted sortB…

java springboot VUE 健康食谱管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE 健康食谱管理系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架和VUE完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开 发&#xff09;&#xff0c;系统具有完整的源代码…

PHP快速入门08-JSON与XML处理

文章目录 前言一、使用介绍1.1 JSON处理1.2 XML处理 二、常见用法20例2.1 将数组转换为JSON格式&#xff1a;2.2 将JSON字符串转换回PHP数组&#xff1a;2.3 读取XML文件&#xff1a;2.4 将XML字符串转换成PHP对象&#xff1a;2.5 从URL获取JSON数据&#xff1a;2.6 写入JSON文…

SpringBoot集成Disruptor

Disruptor介绍 1.Disruptor 是英国外汇交易公司LMAX开发的一个高性能队列&#xff0c;研发的初衷是解决内存队列的延迟问题&#xff08;在性能测试中发现竟然与I/O操作处于同样的数量级&#xff09;。基于 Disruptor 开发的系统单线程能支撑每秒 600 万订单&#xff0c;2010 年…

为什么APP也需要SSL证书?

通常我们会想到对网站使用SSL证书&#xff0c;来加密数据传输过程&#xff0c;确保信息不被篡改、泄露。对APP这类应用程序则选择软件签名证书&#xff0c;来进行数字签名和防止代码被恶意篡改。然而APP很容易获取到个人敏感信息&#xff0c;为了防止这些信息在传输过程中被有心…

JUC并发编程之读写锁

1 ReentrantReadWriteLock 当读操作远远高于写操作&#xff0c;这时候使用 读写锁 让 读-读 可以并发&#xff0c;提高性能&#xff0c;类似于数据库中的 select … from … lock in share mode 测试阻塞 提供一个 数据容器类 内部分别使用读锁保护数据的 read() 方法&#…

NAT-HCIA阶段综合实验

拓扑结构&#xff1a; 要求 1、ISP路由器只能配置IP地址&#xff0c;之后不得进行其他配置 2、内部整个网络基于192.168.1.0/24进行地址规划 3、R1、R2之间启动OSPF协议&#xff0c;单区域 4、PC1~PC4自动获取IP地址 5、PC1不能telnetR1&#xff0c;PC1外的其他内网PC可以t…

设计模式-行为型模式之状态模式

4. 状态模式 4.1. 模式动机 在很多情况下&#xff0c;一个对象的行为取决于一个或多个动态变化的属性&#xff0c;这样的属性叫做状态&#xff0c;这样的对象叫做有状态的(stateful)对象&#xff0c;这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事…

GPT大模型之后,谷歌、微软、百度们AI争霸的下一战

又来了一个大模型&#xff01; 4 月 14 日&#xff0c;雷军宣布推出小米的大规模语言模型&#xff1b;4 月 11 日&#xff0c;在阿里云峰会上&#xff0c;阿里云智能首席技术官周靖人正式宣布推出大规模语言模型——通义千问&#xff0c;并宣布要在钉钉、天猫精灵等阿里所有产品…

Ghidra使用之Options页面功能介绍

Apply Processor Defined Lables 在Ghidra中,apply processor defined labels功能可以为汇编代码中的地址和数据自动添加注释,这可以大大提高反汇编代码的可读性。 使用步骤如下: 打开您要反汇编的文件,进入Code Browser窗口。点击Edit菜单,选择Apply Processor Defined Labels…

Mysql不同服务器跨库查询解决方案

项目场景&#xff1a; Mysql在不同服务器实现跨库查询&#xff0c;类似dblink。 解决方案&#xff1a; 在两台不同服务器&#xff0c;实现跨库查询&#xff0c;其实现原理类似一个虚拟映射,需要用到mysql的另一个存储引擎Federated&#xff0c;FEDERATED存储引擎访问在远程数据…

另一个世界的人

休假 赶在假期无效前&#xff0c;休了个长假回了趟老家。不仅是为了逃离工作的繁忙&#xff0c;也为了看望老家的婆婆爷爷。回趟老家对于我们这种社会人来说确实太难了&#xff0c;如果只是周末回去也就休息一天就得往回赶&#xff0c;太累。自己的假期本来就不多&#xff0c;如…

如何对HDFS进行节点内(磁盘间)数据平衡

当HDFS的DataNode节点挂载多个磁盘时&#xff0c;往往会出现两种数据不均衡的情况&#xff1a; 1.不同DataNode节点间数据不均衡&#xff1b; 2.挂载数据盘的磁盘间数据不均衡。 特别是这种情况&#xff1a;当DataNode原来是挂载了几个数据盘&#xff0c;当磁盘占用率很高之…

7.1 参数的点估计

小结&#xff1a; 点估计是一种统计推断方法&#xff0c;它用于通过样本数据估计总体参数的值。在统计学中&#xff0c;总体是指一个包含所有个体的集合&#xff0c;而样本是从总体中选出的一部分个体。总体参数是总体的某种特征&#xff0c;如平均值、标准差、比例等。 点估…