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
的 cluster
指令,這樣就可以很方便的看到當前接入了哪些資料中心的ServiceCenter叢集。
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" > 複製程式碼
觀察日誌我們可以知道,部署在不同的資料中心的微服務相互發現和相互呼叫。
更多高階特性,可參考文件