[原始碼閱讀] 阿里SOFA服務註冊中心MetaServer(2)
阿新 • • 發佈:2020-10-11
# [原始碼閱讀] 阿里SOFA服務註冊中心MetaServer(2)
[toc]
## 0x00 摘要
SOFARegistry 是螞蟻金服開源的一個生產級、高時效、高可用的服務註冊中心。本系列將帶領大家一起分析其MetaServer的實現機制,本文為第二篇,介紹MetaServer基本功能,比如註冊,儲存,通知,續約等。
## 0x01 MetaServer 註冊
### 1.1 Leader入口
MetaServer 的業務啟動是從setLeaderProcessListener開始。
前面提到,MetaServer 叢集內部基於 Raft 協議選舉和複製,只要不超過 1⁄2 節點宕機,就可以對外服務。
Raft 協議由三個部分組成:
- 領導人選舉(Leader Election)
- 日誌複製(Log Replication)
- 安全性(Safety)
如果使用JRaft, 需要實現其狀態機,而在MetaServer之中, jraft FSM 的具體實現是 ServiceStateMachine類(後文中會有大量 Raft 相關內容)。
在 raft 選出了MetaServer leader之後,ServiceStateMachine會呼叫 setLeaderProcessListener,其中又呼叫到了registerCurrentNode,這樣就在MetaServer中註冊了當前Meta節點。
```java
raftServer.setLeaderProcessListener(new LeaderProcessListener() {
@Override
public void startProcess() {
executorManager.startScheduler();
PeerId leader = new PeerId(NetUtil.getLocalAddress().getHostAddress(),
metaServerConfig.getRaftServerPort());
registerCurrentNode(); //
raftServer.sendNotify(leader, "leader");
}
```
其執行堆疊如下 :
```java
register:51, MetaServerRegistry (com.alipay.sofa.registry.server.meta.registry)
registerCurrentNode:203, RaftExchanger (com.alipay.sofa.registry.server.meta.remoting)
access$200:56, RaftExchanger (com.alipay.sofa.registry.server.meta.remoting)
startProcess:105, RaftExchanger$1 (com.alipay.sofa.registry.server.meta.remoting)
lambda$onLeaderStart$2:234, ServiceStateMachine (com.alipay.sofa.registry.jraft.bootstrap)
run:-1, 318295790 (com.alipay.sofa.registry.jraft.bootstrap.ServiceStateMachine$$Lambda$191)
call:511, Executors$RunnableAdapter (java.util.concurrent)
run$$$capture:266, FutureTask (java.util.concurrent)
run:-1, FutureTask (java.util.concurrent)
```
### 1.2 註冊
註冊行為由 Registry 完成。註冊介面實現為:
```java
public interface