1. 程式人生 > >[從原始碼學設計]螞蟻金服SOFARegistry 之 如何與Meta Server互動

[從原始碼學設計]螞蟻金服SOFARegistry 之 如何與Meta Server互動

# [從原始碼學設計]螞蟻金服SOFARegistry 之 如何與Meta Server互動 [toc] ## 0x00 摘要 SOFARegistry 是螞蟻金服開源的一個生產級、高時效、高可用的服務註冊中心。 本系列文章重點在於分析設計和架構,即利用多篇文章,從多個角度反推總結 DataServer 或者 SOFARegistry 的實現機制和架構思路,讓大家藉以學習阿里如何設計。 本文為第十篇,主要是從業務角度進行梳理。看看DataServer如何與MetaServer互動。 ## 0x01 業務範疇 ### 1.1 MetaServer的重要性 首先我們要複習下MetaServer的重要性。 MetaServer元資料伺服器叢集。這個叢集管轄的範圍是 Session 伺服器叢集和 Data 伺服器叢集的伺服器資訊,其角色就相當於 SOFARegistry 架構內部的服務註冊中心,只不過 SOFARegistry 作為服務註冊中心是服務於廣大應用服務層,而 Meta 叢集是服務於 SOFARegistry 內部的 Session 叢集和 Data 叢集,Meta 層能夠感知到 Session 節點和 Data 節點的變化,並通知叢集的其它節點。 所以,如果想獲取節點的變化,DataServer就必須重點研究如何與MetaServer互動
。 ### 1.2 推拉模型 居於Bolt協議,DataServer在與Meta Server的互動中,使用了推拉模型。 ### 1.3 分析策略 我們在這裡重點分析其設計策略如下: - 用什麼來確保互動的有效性。 - 用什麼來解耦。 - 用什麼來確保網路互動的效率。 ## 0x02 目錄結構 此模組目錄結構如下,大致可以推論, - DefaultMetaServiceImpl 是 Meta Server 相關模組主體; - MetaServerConnectionFactory是連線管理; - ConnectionRefreshMetaTask 是定期迴圈task; - handler目錄下是三個響應函式; - provideData 目錄下是配置相關功能; 具體目錄結構如下: ```java │   ├── metaserver │   │   ├── DefaultMetaServiceImpl.java │   │   ├── IMetaServerService.java │   │   ├── MetaServerConnectionFactory.java │   │   ├── handler │   │   │   ├── NotifyProvideDataChangeHandler.java │   │   │   ├── ServerChangeHandler.java │   │   │   └── StatusConfirmHandler.java │   │   ├── provideData │   │   │   ├── ProvideDataProcessor.java │   │   │   ├── ProvideDataProcessorManager.java │   │   │   └── processor │   │   │   └── DatumExpireProvideDataProcessor.java │   │   └── task │   │   └── ConnectionRefreshMetaTask.java ``` ## 0x03 Bean MetaServer相關元件如下: - metaServerService,用來與MetaServer進行互動,基於raft
和Bolt; - datumLeaseManager,用來維護具體資料; ## 0x04 Raft協議 這裡有一個問題 :為什麼 DataServerBootstrap 之中還有 startRaftClient,按說DataServer只用Http和Bolt就可以了。 原來是用 raft 協議來獲取MetaServer叢集中leader的地址等資訊: `raftClient.getLeader();` 比如 renewNodeTask 時候會用到。 Raft相關啟動是在startRaftClient,此函式的作用是: - 啟動Raft客戶端,保證分散式一致性; - 向 EventCenter 投放MetaServerChangeEvent; 具體程式碼是: ```java private void startRaftClient() { metaServerService.startRaftClient(); eventCenter.post(new MetaServerChangeEvent(metaServerService.getMetaServerMap())); } ``` ## 0x05 訊息處理 前面提到了,當系統啟動之後,會主動傳送一個MetaServerChangeEvent,我們就看看其內容。 ### 5.1 MetaServerChangeEvent ```java public class MetaServerChangeEvent implements Event { pri