做者 | 李志鵬html
近幾年,隨着 Go 語言社區逐漸發展和壯大,愈來愈多的公司開始嘗試採用 Go 搭建微服務體系,也涌現了一批 Go 的微服務框架,如 go-micro、go-kit、Dubbo-go 等,跟微服務治理相關的組件也逐漸開始在 Go 生態發力,如 Sentinel、Hystrix 等都推出了 Go 語言版本,而做爲微服務框架的核心引擎--註冊中心,也是必不可缺乏的組件,市面已經有多款註冊中心支持 Go 語言,應該如何選擇呢?咱們能夠對目前主流的支持 Go 語言的註冊中心作個對比。git
圖 1github
根據上表的對比咱們能夠從如下幾個維度得出結論:golang
綜合上面各維度的對比,能夠了解到 Nacos 做爲註冊中心有必定的優點,那麼它對 Go 微服務生態的集成作得如何?爲此,咱們策劃了本系列文章,該系列將爲你們介紹 Nacos 在 Go 微服務生態集成中作的一些工做和實踐經驗,系列內容將主要包含如下三個篇章:spring
接下來咱們首先探索下 Nacos 是如何與 Dubbo-go 集成。apache
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 接口訂閱該應用的服務實例變化,並對的實例發起服務調用。app
圖 2負載均衡
圖 3 是咱們 Dubbo-go 的應用維度服務發現模型,主要有服務和實例兩個層級關係,服務實例的屬性主要包含實例Id、主機地址、服務端口、激活狀態和元數據。圖 4 爲 Nacos 的服務分級存儲模型,包含服務、集羣和實例三個層次。二者對比,多了一個集羣維度的層級,並且實例屬性信息可以徹底匹配。
因此在 Dubbo-go 將應用服務實例註冊到 Nacos 時,咱們只須要將集羣設置爲默認集羣,再填充服務和實例的相關屬性,便可完成服務模型上的匹配。此外 Nacos 能夠將服務註冊到不一樣的 Namespace 下,實現多租戶的隔離。
圖 3
圖 4
Dubbo-go 的 Provider 在向 Nacos 註冊應用服務實例信息後,須要主動上報心跳,讓 Nacos 服務端感知實例的存活與否,以判斷是否將該節點從實例列表中移除。維護心跳的工做是在 Nacos-SDK-go 完成的,從圖 5 代碼中能夠看到,當 Dubbo-go 調用 RegisterInstance 註冊一個服務實例時,SDK 除了調用 Nacos 的 Register API 以外,還會調用 AddBeatInfo,將服務實例信息添加到本地緩存,經過後臺協程按期向 Nacos 發送服務實例信息,保持心跳。
當服務下線時,能夠經過調用 DeRegisterInstance 執行反註冊,並移除本地的心跳保持任務,Nacos 實例列表中也會將該實例移除。
圖 5
Dubbo-go 的 Consumer 在啓動的時候會調用 Nacos-SDK-go 的 Subscribe 接口,該接口入參如圖 6,訂閱的時候只須要傳遞 ServiceName 即應用名和回調函數 SubscribeCallback,Nacos 在服務實例發生變化的時候便可經過回調函數通知 Dubbo-go。Nacos-SDK-go 是如何感知 Nacos 的服務實例變化的呢?主要有兩種方式:
圖 6
此外 Nacos-SDK-go 還支持推空保護,當 Nacos 推送的實例列表爲空時,不更新本地緩存,也不通知 Dubbo-go 變動,避免 Consumer 無可用實例調用,形成故障。同時,SDK 還支持服務實例信息本地持久化存儲,能夠保證在 Nacos 服務故障過程當中,Consumer 重啓也能獲取到可用實例,具有容災效果。
圖 7
進入 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=
圖 8
圖 9
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 端成功。
圖 10
若是你對咱們在作的事情感興趣,歡迎你加入咱們團隊。內推郵箱:water.lyl@alibaba-inc.com
李志鵬,Github 帳號:Lzp0412,開源社區愛好者,Nacos Committer,Nacos-SDK-go 做者,現就任於阿里云云原生應用平臺,主要參與服務發現、CoreDNS、ServiceMesh 相關工做,負責推進 Nacos Go 微服務生態建設。
服務註冊與發現是微服務架構體系中最關鍵的組件之一,爲了帶領你們系統入門微服務架構,9 月 24 日,由 Spring Cloud Alibaba 創始團隊主筆的 Spring Cloud Alibaba 實戰訓練營將正式開營。七天時間瞭解微服務各模塊的實現原理,手把手教學如何獨立開發一個微服務應用,助力小白開發者從 0 到 1 創建系統化的知識體系。點擊連接便可參與:https://developer.aliyun.com/learning/trainingcamp/spring/1
「 阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的公衆號。」