服務註冊中心簡介
在分散式系統中,服務註冊中心的作用是將部署服務例項的機器地址以及其它後設資料記錄到註冊中心,服務消費者在有需求的時候,通過查詢註冊中心,輸入提供的服務名,獲取到地址,從而發起呼叫。
在微服務架構下,主要有三種角色:服務提供者(RPC Server)、服務消費者(RPC Client) 和 服務註冊中心(Registry),三者的互動關係請看下面這張圖:
RPC Server 提供服務,在啟動時,根據配置檔案指定的服務註冊中心配置資訊,向 Registry 註冊自身的服務路由,並向Registry定期傳送心跳彙報存活狀態。
RPC Client 呼叫服務,在啟動時,根據配置檔案指定的服務註冊中心配置資訊,向 Registry 訂閱服務,把Registry返回的服務節點列表快取在本地記憶體中,並與 RPC Sever 建立連線。
當 RPC Server 節點發生變更時,Registry會同步變更,RPC Client 感知後會重新整理本地記憶體中快取的服務節點列表。
RPC Client 從本地快取的服務節點列表中,基於負載均衡演算法選擇一臺 RPC Sever 發起呼叫。
::: tip 提示
- 對於一個微服務應用來說,在叢集中,它既可以作為RPC Sever,也可能作為RPC Client,主要是看在rpc通訊過程中,是提供服務的一方,還是呼叫服務的一方。
:::
當前, silky微服務框架支援使用 Zookeeper 、 Nacos 、 Consul 作為服務註冊中心,開發者可以選擇熟悉的服務中介軟體作為服務註冊中心。
服務後設資料
在silky框架中,服務提供者向服務註冊中心註冊的資料被稱為: 服務後設資料 。服務後設資料主要四部分組成:
- hostName : 用於描述服務提供者的名稱,為構建主機的包名稱
- services : 該服務提供者所提供的應用服務資訊,是一個陣列,包括:服務Id,服務名稱,服務協議,服務條目,後設資料等資訊
- timeStamp : 更新服務後設資料的時間戳
- endpoints : 該服務例項的終結點,是一個陣列。不同服務註冊中心註冊服務例項的終結點不同
如果使用 Zookeeper 作為服務註冊中心, 所有的服務後設資料將會被維護到該主機所在節點下, 註冊到 Zookeeper 服務註冊中心的服務後設資料如下:
{
"hostName":"DemoHost",
"services":[
{
"id":"Demo.Application.Contracts.System.ISystemAppService",
"serviceName":"SystemAppService",
"serviceProtocol":0,
"serviceEntries":[
{
"id":"Demo.Application.Contracts.System.ISystemAppService.GetInfo_Get",
"serviceId":"Demo.Application.Contracts.System.ISystemAppService",
"serviceName":"SystemAppService",
"method":"GetInfo",
"webApi":"api/system/demo/info",
"httpMethod":0,
"serviceProtocol":0,
"metadatas":{
},
"prohibitExtranet":false,
"isAllowAnonymous":true,
"isDistributeTransaction":false
}
],
"metadatas":{
}
}
],
"endpoints":[
{
"host":"172.26.144.1",
"port":2200,
"processorTime":2578.125,
"timeStamp":1636464575,
"serviceProtocol":0
}
],
"timeStamp":1636464576
}
如果服務註冊中心是 Consul 或是 Nacos, 服務例項的終結點則會單獨註冊和維護, 服務後設資料格式如下:
{
"hostName":"DemoHost",
"services":[
{
"id":"Demo.Application.Contracts.System.ISystemAppService",
"serviceName":"SystemAppService",
"serviceProtocol":0,
"serviceEntries":[
{
"id":"Demo.Application.Contracts.System.ISystemAppService.GetInfo_Get",
"serviceId":"Demo.Application.Contracts.System.ISystemAppService",
"serviceName":"SystemAppService",
"method":"GetInfo",
"webApi":"api/system/demo/info",
"httpMethod":0,
"serviceProtocol":0,
"metadatas":{
},
"prohibitExtranet":false,
"isAllowAnonymous":true,
"isDistributeTransaction":false
}
],
"metadatas":{
}
}
],
"timeStamp":1636464576
}
主機名稱(hostName)
hostName 用於描述服務提供者的名稱,在向服務註冊中心註冊服務的過程中,應用會判斷服務註冊中心是否存在該應用的服務後設資料,如果不存在,則建立相應的節點,並新增相應的服務後設資料;如果已經存在相應的服務節點,則會更新服務後設資料,其他服務提供者的例項從服務註冊中心獲取到服務後設資料,並更新本地記憶體的服務後設資料。
服務列表(services)
該屬性包含該應用所支援的服務列表,如果服務註冊中心的服務列表被更新,其他服務例項也會從服務註冊中心獲取,並更新到本地記憶體。
服務列表包括:服務Id,服務名稱,服務協議,服務條目,後設資料等資訊
欄位 | 說明 | 備註 |
---|---|---|
id | 服務Id | 具有唯一性;服務介面定義的完全限定名 |
serviceName | 服務名稱 | |
serviceProtocol | 服務通訊協議 | rpc通訊框架中,採用的通訊協議 |
serviceEntries | 該服務支援的服務條目(即:應用服務定義的方法) | 資料型別為陣列 |
serviceEntries.id | 服務條目Id | 方法的完全限定名 + 引數名 + Http方法名 |
serviceEntries.serviceId | 服務Id | |
serviceEntries.serviceName | 服務名稱 | |
serviceEntries.method | 服務條目對應的方法名稱 | |
serviceEntries.webApi | 生成的webapi 地址 | 如果被禁止訪問外網則為空 |
serviceEntries.httpMethod | 生成的webapi的請求地址 | 如果被禁止訪問外網則為空 |
serviceEntries.serviceProtocol | rpc通訊框架中,採用的通訊協議 | |
serviceEntries.metadatas | 服務條目的後設資料 | 可以為服務條目寫入(k,v)格式的後設資料 |
metadatas | 服務的其他後設資料 | 可以為服務寫入(k,v)格式的後設資料 |
::: warning 注意
- 在一個微服務叢集中,服務條目具有唯一性。也就是說,不允許在同一個微服務叢集中, 不同微服務應用中不允許出現兩個一模一樣的方法(應用服務介面的完全限定名和方法名、引數名一致);
- 只有被實現的應用服務才會被註冊到服務註冊中心。
:::
終結點
endpoints 是用來描述該微服務的服務例項的地址資訊。
一個服務例項可能存在多個終結點,如:使用webhost構建的微服務應用(存在web地址終結點和rpc終結點地址);構建支援websocket服務的微服務應用(存在websocket服務地址終結點和rpc終結點地址)。
使用不同的服務註冊中心,註冊終結點可能會做不同的處理。
- 如果使用 Zookeeper 作為服務註冊中心, 服務例項的終結點將被更新到該服務提供者對應節點資料的
endpoints
屬性,也就是說,endpoints
將作為服務後設資料的一個屬性。
{
"hostName": "DemoHost",
"services": ["..."],
"timeStamp": 1636464576,
"endpoints":[
{
"host":"localhost",
"port":5000,
"processorTime":2984.375,
"timeStamp":1636464576,
"serviceProtocol":4
},
{
"host":"172.26.144.1",
"port":2200,
"processorTime":2578.125,
"timeStamp":1636464575,
"serviceProtocol":0
}
]
}
- 如果使用 Consul 作為服務註冊中心, 服務例項將會被註冊到 Services 節點,並且只會註冊協議為
TCP
的終結點,服務例項的其他協議的將會以後設資料的方式新增到後設資料
- 如果使用 Nacos 作為服務註冊中心, 服務將會被註冊到服務列表節點,與使用 Consul 作為服務註冊中心相同,只會註冊協議為
TCP
的終結點,服務例項的其他協議的將會以後設資料的方式新增到後設資料
終結點的屬性如下所述:
欄位 | 說明 | 備註 |
---|---|---|
host | 對應的主機地址 | 微服務應用的Ip內網地址 |
port | 埠號 | |
processorTime | CPU使使用率 | |
timeStamp | 註冊時間戳 | |
serviceProtocol | 服務協議 |
時間戳
timeStamp
是指向服務註冊中心更新服務後設資料的時間戳。
使用Zookeeper作為服務註冊中心
silky支援使用 Zookeeper 作為服務註冊中心。
silky支援為微服務叢集配置多個 Zookeeper 服務註冊中心,您只需要在配置服務註冊中心的連結字串registrycenter.connectionStrings
中,使用分號;
就可以指定微服務框架的多個服務註冊中心。
使用 Zookeeper 作為服務註冊中心需要在配置檔案中,在registrycenter
配置節點下,將服務註冊中心的型別type
設定為: Zookeeper
,通過connectionStrings
屬性配置服務中心的連結。同時可以通過其他屬性配置服務註冊中心的連結屬性。
registrycenter: // 服務註冊中心配置節點
type: Zookeeper
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 // 服務配置中心連結
connectionTimeout: 1000 // 連結超時時間(單位:ms)
sessionTimeout: 2000 // 會話超時時間(單位:ms)
operatingTimeout: 4000 // 操作超時時間(單位:ms)
routePath: /services/serviceroutes
一般地,使用 Zookeeper 作為服務註冊中心我們只需要指定服務註冊中心型別和連結字串即可,其他屬性(如連結超時時間、會話時間、操作超時時間、註冊的路由地址等)均提供了預設值。
registrycenter: // 服務註冊中心配置節點
type: Zookeeper
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 // 服務配置中心連結
silky框架提供了使用 docker-compose 來編排 Zookeeper 的 編排檔案, 開發者在獲取 silky原始碼後,進入到 ./samples/docker-compose/infrastr
目錄後,執行如下命令,就可以構建一個 Zookeeper 服務叢集。
docker-compose -f docker-compose.zookeeper.yml up -d
使用Nacos作為服務註冊中心
silky支援使用 Nacos 作為服務註冊中心。
如果使用 Nacos 作為服務註冊中心,需要將 registrycenter:type
配置設定為:Nacos
,再加上 Nacos 的其他配置屬性。開發者可以參考Nacos文件以及nacos-sdk-csharp 來熟悉 Nacos 的配置和使用。
使用 Nacos 作為服務註冊中心的配置如下:
registrycenter:
type: Nacos
namespace: silky
serverAddresses:
- http://127.0.0.1:8848/
- http://127.0.0.1:8849/
- http://127.0.0.1:8850/
userName: nacos
password: nacos
groupName: DEFAULT_GROUP
clusterName: DEFAULT
registerEnabled: true
instanceEnabled: true
namingUseRpc: true
關於 Nacas服務的搭建可以參考Nacos Docker 快速開始。當然, silky框架也提供了使用 docker-compose 來編排 Nacos 服務的檔案,開發者在獲取原始碼後,進入到 ./samples/docker-compose/infrastr
目錄後,執行如下命令,就可以構建一個 Nacos 服務叢集。
docker-compose -f docker-compose.nacos.cluster-hostname.yaml up -d
使用Consul作為服務註冊中心
silky支援使用 Consul 作為服務註冊中心。
如果使用 Consul 作為服務註冊中心,需要將 registrycenter:type
配置設定為:Consul
,再加上 Consul 的其他配置屬性。開發者可以參考Consul文件以及consuldotnet 來熟悉 Consul 的配置和使用。
使用 Consul 作為服務註冊中心的配置如下:
registrycenter:
type: Consul
address: http://127.0.0.1:8500
datacenter: dc1 # 預設值為 dc1
token:"" # 如果consul服務設定了token,則需要配置token
waitTime: 1000 # 預設值為空
heartBeatInterval: 10 # 預設值為10,單位為秒
搭建consul服務叢集的方式開發者可以參考。同樣地,silky框架提供了使用 docker-compose 部署 Consul 叢集的編排檔案,開發者在獲取原始碼後,進入到 ./samples/docker-compose/infrastr
目錄後,執行如下命令,就可以構建一個 Consul 服務叢集。
docker-compose -f docker-compose.consul.yaml up -d
開源地址
- github: https://github.com/liuhll/silky
- gitee: https://gitee.com/liuhll2/silky