[從原始碼學設計]螞蟻金服SOFARegistry 之 如何與Meta Server互動
阿新 • • 發佈:2020-12-21
# [從原始碼學設計]螞蟻金服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