ServiceComb如何支援多資料中心微服務發現
作者:little-cui
現在使用ServiceComb開發的微服務已經支援多資料中心服務發現,這個特性主要是依賴於服務管理中心ServiceCenter的多註冊中心Adaptor架構設計。
多註冊中心Adaptor架構
從圖中可以知,ServiceCenter實現了多種註冊中心的Adaptor,如基於客戶端註冊的etcd和基於平臺註冊的kubernetes;其中也包括ServiceCenter自身。ServiceCenter會將配置中宣告的Adaptor型別(宣告方式下面會詳述)找到對應的實現類,並註冊到Aggregator中,Aggregator定期(預設30秒)通過這些類的例項的discovery介面拉取已註冊的微服務例項資訊。這樣設計的好處是方便擴充套件各類註冊中心的Adaptor,方式就是實現discovery介面即可。另一個好處就是Adaptor可以按配置多次被例項化,也就是支援同時接入不同的註冊中心,ServiceCenter支援多資料中心服務發現的特性也正是依賴這一點實現的。
多資料中心服務發現
每個資料中心會部署一套ServiceCenter叢集,且叢集的每個例項配置中會宣告該叢集的別名和各個資料中心ServiceCenter叢集完整的地址列表,下面是一個例子:
Cluster | Datacenter | Address |
---|---|---|
sc-1-1 | dc-1 | 10.12.0.1 |
sc-1-2 | dc-1 | 10.12.0.2 |
sc-2-1 | dc-2 | 10.12.1.1 |
sc-2-2 | dc-2 | 10.12.1.2 |
sc-3-1 | dc-3 | 10.12.2.1 |
sc-3-2 | dc-3 | 10.12.2.2 |
我們假設在三個資料中心dc-1/2/3中分別部署一套ServiceCenter叢集(高可靠)sc-1/2/3,並使得註冊到本資料中心的ServiceCenter的微服務可以發現並呼叫其它資料中心的微服務,當然,前提是資料中心之間的網路是互通的。
以配置一個數據中心的ServiceCenter為例,開啟編輯ServiceCenter程式目錄下 conf/app.conf
# 服務監聽地址 httpaddr = 10.12.0.1 # 配置服務發現的外掛型別 discovery_plugin = aggregate # 註冊etcd和ServiceCenter兩種服務發現機制 aggregate_mode = "etcd,servicecenter" # 配置服務註冊的外掛型別 registry_plugin = etcd # 當前叢集名稱後端註冊中心的訪問地址 manager_name = "sc-1" manager_addr = "${ETCD_CLIENT_URLS}" manager_cluster = "sc-1=http://10.12.0.1:30100,http://10.12.0.1:30100,sc-2=http://10.12.1.1:30100,http://10.12.1.1:30100,sc-3=http://10.12.2.1:30100,http://10.12.2.1:30100" # 自動拉取例項週期 auto_sync_interval = 30s複製程式碼
這裡解釋一下上述配置, aggregate_mode
會讓Aggregator建立etcd adaptor和servicecenter adaptor例項,etcd adaptor主要是讓ServiceCenter支援本資料中心的微服務使用客戶端註冊方式接入,而servicecenter adaptor主要是拉取其它資料中心的ServiceCenter叢集的微服務例項資訊; manager_addr
指明etcd的訪問地址; manager_cluster
指明各個資料中心ServiceCenter叢集的完整地址列表。
- 注:其它資料中心部署時,只需要對應更新
httpaddr
,manager_name
,manager_addr
配置即可。
scctl --addr http://10.12.0.1:30100 get cluster #CLUSTER |ENDPOINTS # +---------+-------------------------+ #sc-1| http://10.12.0.1:30100 #| http://10.12.0.2:30100 #sc-2| http://10.12.1.1:30100 # ...複製程式碼
Example
這裡演示了一個很簡單的例子,例子引用的微服務均為微服務開發框架 go-chassis
中的 example
。
Microservice | Datacenter | Address |
---|---|---|
Client | dc-1 | 10.12.0.3 |
Server | dc-2 | 10.12.1.3 |
我們假設微服務Client部署到資料中心dc-1,Server部署到資料中心dc-2中。
啟動微服務Server
開啟編輯配置檔案
vi examples/discovery/server/conf/chassis.yaml複製程式碼
修改如下
cse: service: registry: type: servicecenter address: http://10.12.1.1:30100 # the address of SC in dc-2複製程式碼
執行
go run examples/discovery/server/main.go複製程式碼
啟動微服務Client
開啟編輯配置檔案
vi examples/discovery/client/conf/chassis.yaml複製程式碼
修改如下
cse: service: registry: type: servicecenter address: http://10.12.0.1:30100 # the address of SC in dc-1複製程式碼
執行
go run examples/discovery/client/main.go複製程式碼
確認呼叫成功
由於Client微服務沒有暴露外部訪問介面,所以這裡我們只需要檢查它的呼叫日誌即可。
2018-09-29 10:30:25.556 +08:00 INFO registry/bootstrap.go:69 Register [Client] success ... 2018-09-29 10:30:25.566 +08:00 WARN servicecenter/servicecenter.go:324 55c783c5c38e11e8951f0a58ac00011d Get instances from remote, key: default Server 2018-09-29 10:30:25.566 +08:00 INFO client/client_manager.go:86 Create client for highway:Server:127.0.0.1:8082 ... 2018/09/29 10:30:25 AddEmploy ------------------------------ employList:<name:"One" phone:"15989351111" > 複製程式碼
觀察日誌我們可以知道,部署在不同的資料中心的微服務相互發現和相互呼叫。
更多高階特性,可參考文件