Skip to content

Commit 0ac41ad

Browse files
committed
nacos ap
1 parent 4faa274 commit 0ac41ad

File tree

2 files changed

+81
-21
lines changed

2 files changed

+81
-21
lines changed

docs/13.SpringCloud架构剖析/07.Nacos配置注册中心/03.Nacos 架构原理②:揭秘 AP 架构——Distro 一致性协议.md

Lines changed: 81 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,38 @@
1010

1111
[Nacos 架构原理①:一条注册请求会经历什么?](http://mp.weixin.qq.com/s?__biz=MzAwMjI0ODk0NA==&mid=2451962520&idx=1&sn=864d6aa4a796be28b77379c66e317b44&chksm=8d1c0307ba6b8a11a62cd5b915857dc8013ad83b35c90c3050fc2e77cf836ea24517717e1e92#rd)
1212

13-
留了两个知识点:
13+
这次我们要进入 Nacos 的一致性底层原理了,还是先来一张架构图,让大家对 Nacos 的架构有个整体的映像,本篇会主要讲解**一致性模块**中的 `Distro` 协议。
14+
15+
![](http://cdn.jayh.club/uPic/image-202204282315093348yTBIF.png)
16+
17+
上篇留了两个知识点:
1418

1519
- ① 服务实例注册到 Nacos 节点后,通过 UDP 方式推送到所有服务实例。让其他服务实例感知到服务列表的变化。
1620
- ② 如何复制数据到其他节点:当前 Nacos 节点开启 1s 的延迟任务,将数据同步给其他 Nacos 节点。(分区一致性)
1721

18-
第二个知识点就是 Nacos 自研的 Distro 一致性协议的核心功能。
22+
第 ② 个知识点就是 Nacos 自研的 `Distro` 一致性协议的核心功能。
23+
24+
首先这个 Distro 协议是针对集群环境的,比如下面这三个集群节点组成了一个集群。服务 A 和服务 B 会往这个集群进行注册。
25+
26+
![Nacos 集群节点](http://cdn.jayh.club/uPic/image-20220427211513114ErcXkf.png)
1927

20-
我们知道 Nacos 它是支持两种分布式共识算法的:CP(分区一致性)和 AP(分区可用性) 的,而 AP 是通过 Nacos 自研的 Distro 协议来保证的,CP 是通过 Nacos 的 JRaft 协议来保证的。
28+
![Nacos 集群环境](http://cdn.jayh.club/uPic/image-20220427220632378nCoaA5.png)
2129

22-
因为注册中心是很重要的的一个服务,需要尽最大可能对外提供可用的服务,所以选择 AP 来保证服务的可用,另外 Nacos 还采取了心跳机制来自动完成服务数据补偿的机制。
30+
我们知道 Nacos 它是支持两种分布式定理的:CP(分区一致性)和 AP(分区可用性) 的,而 AP 是通过 Nacos 自研的 Distro 协议来保证的,CP 是通过 Nacos 的 JRaft 协议来保证的。
31+
32+
因为注册中心是很重要的的一个服务,需要尽最大可能对外提供可用的服务,所以选择 AP 来保证服务的可用,另外 Nacos 还采取了心跳机制来自动完成服务数据补偿的机制,所以说 Distro 协议是弱一致性的。
2333

2434
如果采用 CP 协议,则需要当前集群可用的节点数过半才能工作。
2535

2636
关于 CP 和 AP 的理论知识,可以参考这篇:[用太极拳讲分布式理论 CAP 和 BASE,真舒服!](https://mp.weixin.qq.com/s?__biz=MzAwMjI0ODk0NA==&mid=2451950422&idx=1&sn=7f86457acedbd0853cbcb7dc4377dd54&chksm=8d1c32c9ba6bbbdfd3d8c698addfb13a02589409bdf6a03a777e9afc95249018293d9a9e0a3f&token=203503668&lang=zh_CN#rd)
2737

28-
> 问题:Nacos 中哪些地方用到了 AP 和 CP
38+
> 问题:Nacos 中哪些地方用到了 AP 和 CP
2939
30-
- 针对临时服务实例,采用 AP 来保证注册中心的可用性,Distro 协议。
40+
- 针对`临时服务`实例,采用 AP 来保证注册中心的可用性,Distro 协议。
3141

32-
- 针对持久化服务实例,采用 CP 来保证各个节点的强一致性,JRaft 协议。
42+
- 针对`持久化服务`实例,采用 CP 来保证各个节点的强一致性,JRaft 协议。
3343

34-
- 针对配置中心,采用 CP 来保证大部分的节点都保存了我们配置的数据。
44+
- 针对`配置中心`,采用 CP 来保证大部分的节点都保存了我们配置的数据。
3545

3646
弦外音:
3747

@@ -44,7 +54,7 @@
4454
**知识点预告:**
4555

4656
- ① Distro 的设计思想和六大原则。
47-
- ② Nacos 如何同步写入的数据。(异步复制原则)
57+
- ② Nacos 如何同步数据到其他节点。(异步复制原则)
4858
- ③ Nacos 如何保证所有节点的数据一致性。(定时校验原则)
4959
- ④ 新加入的 Nacos 节点,如何拉取数据。(新节点同步原则)
5060

@@ -68,23 +78,22 @@ AP 中的 P 代表网络分区,所以 Distro 在分布式集群环境下才能
6878

6979
**Distro 的设计原则**
7080

71-
- **平等原则**:Nacos 的每个节点是平等的,都可以处理写请求。(上一讲已经重点讲解了)
72-
- **异步复制原则**:Nacos 把变更的数据异步复制到其他节点。
81+
- **平等原则**:Nacos 的每个节点是平等的,都可以处理写请求。(上一讲已经重点讲解了
82+
- **异步复制原则**:Nacos 把变更的数据异步复制到其他节点。(⭐️**重点讲解**)
7383
- **定时校验原则**:每个节点只存了部分数据,定时发送自己负责的数据的校验值到其他节点来保持数据一致性。
74-
- **本地读原则**: 每个节点独立处理读请求,及时从本地发出响应。
75-
84+
- **本地读原则**: 每个节点独立处理读请求,及时从本地发出响应。
7685
- **新节点同步原则**: Nacos 启动时,从其他节点同步数据。
77-
- **路由转发原则**:客户端发送的写请求,如果属于自己则处理,否则路由转发给其他节点。(上一讲已经重点讲解了)
86+
- **路由转发原则**:客户端发送的写请求,如果属于自己则处理,否则路由转发给其他节点。(上一讲已经重点讲解了
7887

79-
![Distro 协议的设计原则](http://cdn.jayh.club/uPic/image-20220426224437638hbpjc5.png)
88+
![Distro 协议的设计原则](http://cdn.jayh.club/uPic/image-20220428232305168C8fNTe.png)
8089

8190
## 二、异步复制原则:写入数据后如何同步给其他节点
8291

8392
### 2.1 核心入口
8493

8594
核心源码路径:
8695

87-
```
96+
```php
8897
/naming/consistency/ephemeral/distro/DistroConsistencyServiceImpl.java
8998
```
9099

@@ -96,17 +105,19 @@ AP 中的 P 代表网络分区,所以 Distro 在分布式集群环境下才能
96105

97106
上一讲我们已经说过,这里面会做几件事:
98107

108+
![添加实例信息的流程](http://cdn.jayh.club/uPic/image-20220413164932907KHTvVMRZvHBS.png)
109+
99110
- ① 将实例信息存放到内存缓存 concurrentHashMap 里面。
100111
- ② 添加一个任务到 BlockingQueue 里面,这个任务就是将最新的实例列表通过 UDP 的方式推送给所有客户端(服务实例),这样客户端就拿到了最新的服务实例列表,缓存到本地。
101112
- ③ 开启 1s 的延迟任务,将数据通过给其他 Nacos 节点。
102113

103-
说明:第二件事是 Nacos 和 客户端如何保持数据一致性的,第三件事是 Nacos 集群间如何保持数据一致性的,因本篇重点讲解 Nacos 的 AP 原理,所以会针对第三件事来进行阐述。而第二件事,会放到下一讲重点讲解。
114+
**说明**:第二件事是 Nacos 和 客户端如何保持数据一致性的,第三件事是 Nacos 集群间如何保持数据一致性的,因本篇重点讲解 Nacos 的 AP 原理,所以会针对第三件事来进行阐述。而第二件事,会放到下一讲重点讲解。
104115

105116
### 2.2 sync 方法的参数说明
106117

107118
首先我们来看下 distroProtocol.sync(),这个方法传了哪些参数:
108119

109-
第一个参数 new DistroKey(),它里面传了 key 和一个常量
120+
- 第一个参数 new DistroKey(),它里面传了 key 和一个常量
110121

111122
key:就是客户端的服务名,示例值如下:
112123

@@ -118,13 +129,62 @@ INSTANCE_LIST_KEY_PREFIX:就是 com.alibaba.nacos.naming.iplist.
118129

119130
然后这两个参数组装成一个 DistroKey。
120131

121-
第二个参数是同步数据的类型,这里为 change。
132+
- 第二个参数是同步数据的类型,这里为 change。
133+
134+
- 第三个参数是同步任务的延迟时间,1s。
135+
136+
### 2.3 sync 的核心逻辑:添加任务
137+
138+
先上一张原理图帮助大家理解,流程图如下所示。核心逻辑分为以下几步。
139+
140+
- 遍历其他节点,拿到节点信息。
141+
- 判断这个任务在 map 中是否存在,如果存在则合并这个 task。
142+
- 如果不存在,则加到 map 中。
143+
- 后台线程遍历这个 map,拿到任务。
144+
145+
![添加任务到 map 中](http://cdn.jayh.club/uPic/image-202204282252571448WDN2R.png)
146+
147+
代码时序图如下所示:
148+
149+
![sync 的核心代码时序图](http://cdn.jayh.club/uPic/image-20220428225403541nvJwU7.png)
150+
151+
- 第一个类 `DistroConsistencyServiceImpl` 把实例信息加入 map 中,后续通过 `UDP`方式推送给客户端。
152+
153+
- 第二个类 `DistroProtocol` 主要就是**循环遍历**其他节点。
154+
155+
- 第三个类 `NacosDelayTaskExecuteEngine` 是核心类,创建了一个同步的任务到 `ConcurrentHashMap` 中。
156+
157+
### 2.4 sync 的核心逻辑:后台线程异步复制数据
158+
159+
先说下哈,这个核心逻辑极其复杂,我们看的时候需要抓主线,知道其中几个关键点就可以了。
160+
161+
悟空在画代码逻辑图的时候,内心是崩溃的,Nacos 为什么写这么复杂啊!**大家不用细看,看了也会懵😳,理解核心步骤就可以了。**
162+
163+
**核心步骤**
164+
165+
- 遍历其他节点,创建一个同步的任务,加到 map 中。
166+
167+
- 后台线程不断从 map 中拿到 task,然后移除这个 task。
168+
169+
- 把这个 task 加到一个队列里面。
170+
171+
- 有个 worker 专门从队列里面拿到 task 来执行。
172+
173+
- 这个 task 就是发送 http 请求给其他节点,请求参数中包含注册的实例信息(序列化后的二进制数据)。拼接的请求 url 地址为:
174+
175+
```PHP
176+
http://192.168.0.101:8858/nacos/v1/ns/distro/datum
177+
```
178+
179+
180+
181+
![Nacos 异步复制数据到其他节点的流程图](http://cdn.jayh.club/uPic/image-20220428225545543RA3daf.png)
122182

123-
第三个参数是同步任务的延迟时间,1s。
183+
## 2.5 其他节点如何处理同步请求
124184

125185

126186

127-
## 三、定时校验原则:如何保持数据一致性
187+
## 三、定时校验原则:如何保持数据一致性
128188

129189

130190

docs/13.SpringCloud架构剖析/07.Nacos配置注册中心/Untitled.md

Whitespace-only changes.

0 commit comments

Comments
 (0)