1. 程式人生 > >ServiceComb如何支援多資料中心微服務發現

ServiceComb如何支援多資料中心微服務發現

作者:little-cui

現在使用ServiceComb開發的微服務已經支援多資料中心服務發現,這個特性主要是依賴於服務管理中心ServiceCenter的多註冊中心Adaptor架構設計。

多註冊中心Adaptor架構

architecture

從圖中可以知,ServiceCenter實現了多種註冊中心的Adaptor,如基於客戶端註冊的etcd和基於平臺註冊的kubernetes;其中也包括ServiceCenter自身。ServiceCenter會將配置中宣告的Adaptor型別(宣告方式下面會詳述)找到對應的實現類,並註冊到Aggregator中,Aggregator定期(預設30秒)通過這些類的例項的discovery介面拉取已註冊的微服務例項資訊。這樣設計的好處是方便擴充套件各類註冊中心的Adaptor,方式就是實現discovery介面即可。另一個好處就是Adaptor可以按配置多次被例項化,也就是支援同時接入不同的註冊中心,ServiceCenter支援多資料中心服務發現的特性也正是依賴這一點實現的。

多資料中心服務發現

architecture

每個資料中心會部署一套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叢集的完整地址列表。

  • 注:其它資料中心部署時,只需要對應更新httpaddrmanager_namemanager_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" > 複製程式碼

觀察日誌我們可以知道,部署在不同的資料中心的微服務相互發現和相互呼叫。

更多高階特性,可參考文件

github.com/apache/incu…