服務註冊中心原理
在分散式系統裡的註冊中心。原理是將部署服務的機器地址記錄到註冊中心,服務消費者在有需求的時候,只需要查詢註冊中心,輸入提供的服務名,就可以得到地址,從而發起呼叫。
在微服務架構下,主要有三種角色:服務提供者(RPC Server)、服務消費者(RPC Client) 和 服務註冊中心(Registry),三者的互動關係請看下面這張圖:
RPC Server 提供服務,在啟動時,根據配置檔案指定的服務註冊中心配置資訊,向 Registry 註冊自身的服務路由,並向Registry定期傳送心跳彙報存活狀態。
RPC Client 呼叫服務,在啟動時,根據配置檔案指定的服務註冊中心配置資訊,向 Registry 訂閱服務,把Registry返回的服務節點列表快取在本地記憶體中,並與 RPC Sever 建立連線。
當 RPC Server 節點發生變更時,Registry會同步變更,RPC Client 感知後會重新整理本地記憶體中快取的服務節點列表。
RPC Client 從本地快取的服務節點列表中,基於負載均衡演算法選擇一臺 RPC Sever 發起呼叫。
提示
- 對於一個微服務應用來說,在叢集中,它既可以作為RPC Sever,也可能作為RPC Client,主要是看在rpc通訊過程中,是提供服務的一方,還是呼叫服務的一方。
服務路由
在lms框架中,服務提供者將會以服務路由為單位向服務註冊中心註冊路由資訊。每一個被實現了的應用服務介面方法(服務條目)都會生成一條服務路由。
服務路由的格式如下:
{
"serviceDescriptor":{
"id":"IAnotherApplication_IAnotherAppService_DeleteTwo_name",
"serviceProtocol":0,
"metadatas":{
}
},
"addressDescriptors":[
{
"address":"172.19.16.1",
"port":2202,
"serviceProtocol":0
}
],
"timeStamp":1623254897
}
服務路由主要由三部分組成,分別為:服務描述符(serviceDescriptor)、地址描述符(addressDescriptors)、時間戳(timeStamp)。
服務描述符(serviceDescriptor)
每一個服務條目對應生成一條服務路由,服務路由通過服務描述符標識其唯一性。服務描述符由如下三部分組成:
欄位 | 說明 | 備註 |
---|---|---|
id | 服務路由(描述符)Id | 具有唯一性; 生成規則:通過服務條目對應的方法的完全限定名 + 引數名 |
serviceProtocol | 服務通訊協議 | rpc通訊框架中,採用的通訊協議 |
metadatas | 其他後設資料 | 可以為服務路由寫入(k,v)格式的後設資料 |
注意
- 在一個微服務叢集中,服務路由具有唯一性。也就是說,不允許在同一個微服務叢集中, 不同微服務應用中不允許出現兩個一模一樣的方法(應用服務介面的完全限定名和方法名、引數名一致);
地址描述符(addressDescriptors)
地址描述符是一個陣列,用於存放該服務路由(服務條目)存在的微服務應用例項的IP地址資訊。
欄位 | 說明 | 備註 |
---|---|---|
address | ip地址 | 微服務應用例項的IP地址 |
port | rpc通訊埠號 | 微服務應用通訊中指定的rpc埠號 |
serviceProtocol | 服務通訊協議 | rpc通訊框架中,採用的通訊協議 |
warning 注意
- 只有被實現的應用服務介面才會生成服務路由。
- 在微服務應用向服務註冊中心註冊路由時,首先會從服務註冊中心獲取最新的路由資訊,在記憶體中更新該服務路由的服務路由地址(將該微服務應用的地址更新到地址描述符中),並將更新後的服務路由地址註冊到服務註冊中心,其他微服務應用根據從服務註冊中心訂閱到更新後的服務路由資訊後,會將服務路由資訊更新到微服務的記憶體中快取起來。
- 為防止同一個微服務應用同時伸縮服務例項,在微服務應用獲取或是註冊服務路由的過程中會加分散式鎖。
時間戳
timeStamp
是指向服務註冊中心更新服務路由的最後時間。
使用zookeeper作為服務註冊中心
當前,lms支援使用zookeeper作為服務註冊中心。
lms支援為微服務叢集配置多個服務註冊中心,您只需要在配置服務註冊中心的連結字串registrycenter.connectionStrings
中,使用分號;
就可以指定微服務框架的多個服務註冊中心。
為方便以後擴充套件其他服務作為服務註冊中心,您需要在為微服務應用指定配置時,顯式的指定微服務註冊中心型別為(registrycenter.registryCenterType
):Zookeeper
為微服務配置服務註冊中心如下所示:
registrycenter: // 服務註冊中心配置節點
connectionStrings: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183;127.0.0.1:2184,127.0.0.1:2185,127.0.0.1:2186 // 服務配置中心連結
registryCenterType: Zookeeper // 註冊中心型別
connectionTimeout: 1000 // 連結超時時間(單位:ms)
sessionTimeout: 2000 // 會話超時時間(單位:ms)
operatingTimeout: 4000 // 操作超時時間(單位:ms)
routePath: /services/serviceroutes
除此之外,使用zookeeper作為服務註冊中心,還必須要依賴ZookeeperModule
模組。
注意
- 預設啟動服務模組(
NormHostModule
、WebHostModule
、WsHostModule
)均已經依賴ZookeeperModule
模組。
開源地址與文件
github: https://github.com/liuhll/lms
gitee: https://gitee.com/liuhll2/lms
開發者文件: http://docs.lms-fk.com/
加入我們
qq群: 934306776