除非你觉得你的时间不是很宝贵,否则不要看这篇流水账式的博文,这只是篇个人的工作的学习一个总结而已,没有包含任何的技术细节
阅读全文 »

除非你觉得你的时间不是很宝贵,否则不要看这篇流水账式的博文,这只是篇个人的工作的学习一个总结而已,没有包含任何的技术细节
阅读全文 »

0. 背景

近日由于订单量+机器数量增加,导致原来使用时间戳生成唯一订单号的方法行不通了,出现很多主键冲突
并且由于主键冲突导致的事务死锁的几率也随之加大,进而需要补的数据越来越多!因此急需一个全局唯一ID生成方式。
但由于现在单体框架还在拆解过程中,新的生成方式需要兼容单体应用(多台集群)
最好能用最简单的方式先解决,待以后服务拆解出来后考虑可用性扩展性。

阅读全文 »

除非你觉得你的时间不是很宝贵,否则不要看这篇流水账式的博文,这只是篇个人的工作的学习一个总结而已,没有包含任何的技术细节
阅读全文 »

除非你觉得你的时间不是很宝贵,否则不要看这篇流水账式的博文,这只是篇个人的工作的学习一个总结而已,没有包含任何的技术细节
阅读全文 »

0. 基础

加密三要素:

  • 明文/密文
  • 秘钥
  • 算法

CBC模式:分组模式的一种

  1. 明文经过填充,分块后和秘钥长度相同,接着第一块明文和初始向量进行数学运算后产生第一个密文块 A1
  2. A1 与秘钥 XOR 得到第二个密文块 A2
  3. 上一个密文块和秘钥 XOR 得到当前密文块
  4. 重复第三步,直到将全部明文加密完成
阅读全文 »

除非你觉得你的时间不是很宝贵,否则不要看这篇流水账式的博文,这只是篇个人的工作的学习一个总结而已,没有包含任何的技术细节
阅读全文 »

除非你觉得你的时间不是很宝贵,否则不要看这篇流水账式的博文,这只是篇个人的工作的学习一个总结而已,没有包含任何的技术细节
阅读全文 »

0. 启动调试 console

  1. 加入 VM option:-Dnacos.standalone=true -Dnacos.functionMode=naming
  2. 启动 console 项目,查看 banner

1. service 与 instance 的逻辑关系

每个服务可以有多个实例,每个实例又区分为两种实例,一种为临时实例,一种是非临时实例,它们的关系在 ServiceManager 中保存,具体的 service、instance、cluster 类都在 com.alibaba.nacos.api.naming.pojo 包下,对外的接口主要是 service、instance 的 CRUD 操作。其中有个 cluster 的逻辑结构,属于 service 和 instanc 之间,对应的是某个 service 有多少个 instance,就有多少个 cluster

阅读全文 »

心跳和选举主要依靠容器启动时的两个定时任务,分别为 HeartBeat 和 MasterElection 两个。这两个定时任务,每 0.5s 执行一次。
当一段时间内(15~20s)没有接受到心跳,就会执行 MasterElection 里面的选举请求逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// 注释:master 选举
GlobalExecutor.registerMasterElection(new MasterElection());
// 注释:节点间心跳
GlobalExecutor.registerHeartbeat(new HeartBeat());

public class MasterElection implements Runnable {
@Override
public void run() {
try {

if (!peers.isReady()) {
return;
}

RaftPeer local = peers.local();
// 注释:每次递减0.5s,直到小于0.5s,初始是15~20s的范围,这个任务0.5s执行一次,说明选举在没心跳最坏的情况
// 是15~20s进行一次选举,即发投票。但是心跳任务每次都会重置这个 leaderDueMs 为 15s
local.leaderDueMs -= GlobalExecutor.TICK_PERIOD_MS;

if (local.leaderDueMs > 0) {
return;
}

// reset timeout
// 注释:重置选举时间间隔
local.resetLeaderDue();
// 注释:重置心跳时间间隔为5s
local.resetHeartbeatDue();

sendVote();
} catch (Exception e) {
Loggers.RAFT.warn("[RAFT] error while master election {}", e);
}

}
}

public class HeartBeat implements Runnable {
@Override
public void run() {
try {

if (!peers.isReady()) {
return;
}

RaftPeer local = peers.local();
// 注释:5s以上发一次心跳(初始随机0~5s)
local.heartbeatDueMs -= GlobalExecutor.TICK_PERIOD_MS;
if (local.heartbeatDueMs > 0) {
return;
}
// 注释:重置心跳间隔
local.resetHeartbeatDue();
// 注释:发送心跳,里面重置了 leaderDueMs 时间,即当心跳一直正常时,不会发起master选举
sendBeat();
} catch (Exception e) {
Loggers.RAFT.warn("[RAFT] error while sending beat {}", e);
}

}
}

阅读全文 »