天天看點

Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

作者 | 李志鵬

近幾年,随着 Go 語言社群逐漸發展和壯大,越來越多的公司開始嘗試采用 Go 搭建微服務體系,也湧現了一批 Go 的微服務架構,如 go-micro、go-kit、Dubbo-go 等,跟微服務治理相關的元件也逐漸開始在 Go 生态發力,如 Sentinel、Hystrix 等都推出了 Go 語言版本,而作為微服務架構的核心引擎--注冊中心,也是必不可缺少的元件,市面已經有多款注冊中心支援 Go 語言,應該如何選擇呢?我們可以對目前主流的支援 Go 語言的注冊中心做個對比。

Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

圖 1

根據上表的對比我們可以從以下幾個次元得出結論:

  • 生态:各注冊中心對 Go 語言都有支援,但是 Nacos、 Consul、Etcd 社群活躍,zookeeper 和 Eureka 社群活躍度較低;
  • 易用性:Nacos、Eureka、Consul 都有現成的管控平台,Etcd、zookeeper 本身作為 kv 存儲,沒有相應的管控平台,Nacos 支援中文界面,比較符合國人使用習慣;
  • 場景支援:CP 模型主要針對強一緻場景,如金融類,AP 模型适用于高可用場景,Nacos 可以同時滿足兩種場景,Eureka 主要滿足高可用場景,Consul、Zookeepr、Etcd 主要滿足強一緻場景,此外 Nacos 支援從其它注冊中心同步資料,友善使用者注冊中心遷移;
  • 功能完整性:所有注冊中心都支援健康檢查,Nacos、Consul 支援的檢查方式較多,滿足不同應用場景,Zookeeper 通過 keep alive 方式,能實時感覺執行個體變化;Nacos、Consul 和 Eureka 都支援負載均衡政策,Nacos 通過 Metadata selector 支援更靈活的政策;此外,Nacos、Eureka 都支援雪崩保護,避免因為過多的執行個體不健康對健康的執行個體造成雪崩效應。

綜合上面各次元的對比,可以了解到 Nacos 作為注冊中心有一定的優勢,那麼它對 Go 微服務生态的內建做得如何?為此,我們策劃了本系列文章,該系列将為大家介紹 Nacos 在 Go 微服務生态內建中做的一些工作和實踐經驗,系列内容将主要包含以下三個篇章:

  • Dubbo-go 雲原生核心引擎探索;
  • Sentinel-go 外部動态資料源初探;
  • go-micro 內建 Nacos 實踐;

接下來我們首先探索下 Nacos 是如何與 Dubbo-go 內建。

引言

Dubbo-go 目前是 Dubbo 多語言生态中最火熱的一個項目,從 2016 年釋出至今,已經走過 5 個年頭。最近,Dubbo-go 釋出了 v1.5 版本,全面相容 Dubbo 2.7.x 版本,支援了應用次元的服務注冊與發現,和主流的注冊模型保持一緻,标志着 Dubbo-go 向雲原生邁出了關鍵的一步。

作為驅動服務運轉的核心引擎--注冊中心,在切換到應用次元的注冊模型後,也需要做相應的适配,本文将解析如何以 Nacos 為核心引擎實作應用次元的服務注冊與發現,并且給出相應的實踐案例。此外,本文代碼基于 Dubbo-go v1.5.1,Nacos-SDK-go v1.0.0 和 Nacos v1.3.2。

服務注冊與發現架構

從架構中,我們可以看到,與接口級别的服務注冊發現不同的是,Dubbo-go 的 provider 啟動後會調用 Nacos-go-sdk 的 RegisterInstance 接口向 Nacos 注冊服務執行個體,注冊的服務名即為應用名稱,而不是接口名稱。Conusmer 啟動後則會調用 Subscribe 接口訂閱該應用的服務執行個體變化,并對的執行個體發起服務調用。

Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

圖 2

服務模型

圖 3 是我們 Dubbo-go 的應用次元服務發現模型,主要有服務和執行個體兩個層級關系,服務執行個體的屬性主要包含執行個體Id、主機位址、服務端口、激活狀态和中繼資料。圖 4 為 Nacos 的服務分級存儲模型,包含服務、叢集和執行個體三個層次。兩者對比,多了一個叢集次元的層級,而且執行個體屬性資訊能夠完全比對。

是以在 Dubbo-go 将應用服務執行個體注冊到 Nacos 時,我們隻需要将叢集設定為預設叢集,再填充服務和執行個體的相關屬性,即可完成服務模型上的比對。此外 Nacos 可以将服務注冊到不同的 Namespace 下,實作多租戶的隔離。

Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

圖 3

Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

圖 4

服務執行個體心跳維持

Dubbo-go 的 Provider 在向 Nacos 注冊應用服務執行個體資訊後,需要主動上報心跳,讓 Nacos 服務端感覺執行個體的存活與否,以判斷是否将該節點從執行個體清單中移除。維護心跳的工作是在 Nacos-SDK-go 完成的,從圖 5 代碼中可以看到,當 Dubbo-go 調用 RegisterInstance 注冊一個服務執行個體時,SDK 除了調用 Nacos 的 Register API 之外,還會調用 AddBeatInfo,将服務執行個體資訊添加到本地緩存,通過背景協程定期向 Nacos 發送服務執行個體資訊,保持心跳。

當服務下線時,可以通過調用 DeRegisterInstance 執行反注冊,并移除本地的心跳保持任務,Nacos 執行個體清單中也會将該執行個體移除。

Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

圖 5

訂閱服務執行個體變化

Dubbo-go 的 Consumer 在啟動的時候會調用 Nacos-SDK-go 的 Subscribe 接口,該接口入參如圖 6,訂閱的時候隻需要傳遞 ServiceName 即應用名和回調函數 SubscribeCallback,Nacos 在服務執行個體發生變化的時候即可通過回調函數通知 Dubbo-go。Nacos-SDK-go 是如何感覺 Nacos 的服務執行個體變化的呢?主要有兩種方式:

  • Nacos 服務端主動推送,Nacos-SDK-go 在啟動的時候會監聽一個 UDP 端口,該端口在調用 Nacos Register API 的時候作為參數傳遞,Nacos 會記錄 Ip 和端口,當服務執行個體發生變化時,Nacos 會對所有監聽該服務的 Ip 和端口發送 UDP 請求,推送變化後的服務執行個體資訊;
  • Nacos-SDK-go 定期查詢,SDK 會對訂閱的服務執行個體定時調用查詢接口,如果查詢有變化則通過回調接口通知 Dubbo-go。作為兜底政策保證 Nacos 服務端推送失敗後,仍能感覺到變化。
Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

圖 6

此外 Nacos-SDK-go 還支援推空保護,當 Nacos 推送的執行個體清單為空時,不更新本地緩存,也不通知 Dubbo-go 變更,避免 Consumer 無可用執行個體調用,造成故障。同時,SDK 還支援服務執行個體資訊本地持久化存儲,可以保證在 Nacos 服務故障過程中,Consumer 重新開機也能擷取到可用執行個體,具備容災效果。

範例實踐

1. 環境準備

Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

圖 7

2. Server 端搭建

進入 registry/servicediscovery/nacos/go-server/profiles 檔案,可以看到有 dev、release 和 test 三個檔案夾,分别對應開發、測試和生産配置。我們使用 dev 配置來搭建開發環境,dev 檔案下有 log.yml 和 server.yml 檔案,下面對 server.yml 配置進行修改。

remote 配置,這裡使用公共的 Nacos 服務,address 支援配置多個位址,用逗号分割。params 參數配置 nacos-sdk 的日志目錄。

remote:
  nacos:
    address: "console.nacos.io:80"
    timeout: "5s"
    params:
        logDir: "/data/nacos-sdk/log"           

configCenter 配置:

config_center:
  protocol: "nacos"
  address: "console.nacos.io:80"           

配置 server 端環境變量:

export CONF_PROVIDER_FILE_PATH=server端的server.yml檔案路徑
export APP_LOG_CONF_FILE=server端的log.yml檔案路徑           

進入 registry/servicediscovery/nacos/go-server/app,運作 server.go 的 main 方法,可以從 Nacos 的控制台看到,應用 user-info-server 已經注冊成功。

Nacos 的控制台位址:

http://console.nacos.io/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=
Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

圖 8

Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

圖 9

3. Client 端搭建

client 的配置檔案在 registry/servicediscovery/nacos/go-server/profiles 目錄下,需要修改的地方跟 server 端一樣,這裡不贅述。

配置 client 端環境變量:

export CONF_CONSUMER_FILE_PATH=client端的server.yml檔案路徑
export APP_LOG_CONF_FILE=client端的log.yml檔案路徑           

進入 registry/servicediscovery/nacos/go-client/app,運作 client.go 的 main 方法,看到如下日志輸出,表示調用 server 端成功。

Nacos Go 微服務生态系列(一)| Dubbo-go 雲原生核心引擎探索引言服務注冊與發現架構服務模型服務執行個體心跳維持訂閱服務執行個體變化範例實踐

圖 10

相關連結

招聘資訊

如果你對我們在做的事情感興趣,歡迎你加入我們團隊。内推郵箱:[email protected]

作者簡介

李志鵬,Github 賬号:Lzp0412,開源社群愛好者,Nacos Committer,Nacos-SDK-go 作者,現就職于阿裡雲雲原生應用平台,主要參與服務發現、CoreDNS、ServiceMesh 相關工作,負責推動 Nacos Go 微服務生态建設。

Spring Cloud Alibaba 七天訓練營

服務注冊與發現是微服務架構體系中最關鍵的元件之一,為了帶領大家系統入門微服務架構,9 月 24 日,由 Spring Cloud Alibaba 創始團隊主筆的 Spring Cloud Alibaba 實戰訓練營将正式開營。七天時間了解微服務各子產品的實作原理,手把手教學如何獨立開發一個微服務應用,助力小白開發者從 0 到 1 建立系統化的知識體系。點選連結即可參與:

https://developer.aliyun.com/learning/trainingcamp/spring/1
阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的公衆号。”