1. 程式人生 > >[原始碼閱讀] 阿里SOFA服務註冊中心MetaServer(2)

[原始碼閱讀] 阿里SOFA服務註冊中心MetaServer(2)

# [原始碼閱讀] 阿里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