本文已收錄 https://github.com/lkxiaolou/lkxiaolou 歡迎star。
Nacos簡介
Nacos : Naming and Configuration Service,可打包部署配置中心和注冊中心,也可獨立部署其中之一,配置中心、控制台依賴mysql,由阿里巴巴2018年8月開源,github 19.1k star(截止2021.08.24)
本文只講解服務發現部分。
服務注冊發現模型
- namespace:環境隔離、租戶隔離;不同namespace服務無法相互發現
- group:業務隔離;解決不同業務下serviceName相同的問題;可獲取默認或指定group實例
- cluster:集群隔離;可定制化路由偏好;可獲取全部或指定集群實例
臨時實例
-
臨時實例:靠client的心跳或連接保活,當不存活時,直接下線實例;適用於主動注冊的服務,特別適合K8S下ip漂移的場景
-
永久實例:注冊后不用保活,靠服務端健康檢查來判斷實例是否健康,不健康實例也不用下線;適用於ip不常變化的場景
在Nacos中他們的主要區別如下:
emphemral | true | false |
---|---|---|
名稱 | 臨時實例 | 永久實例 |
CAP | AP | CP |
一致性協議 | distro | raft |
是否持久化 | 否 | 是 |
健康檢查方式 | 心跳/連接 | 服務端檢查(TCP、HTTP、MYSQL) |
Dubbo適配
- 使用臨時實例
- 應用級:serviceName為應用名即可
- 服務級(Dubbo):以
provider/consumer:$[service_name]:${version}:${group}
為服務名
路由模式
客戶端路由模式
客戶端(SDK)根據service,指定部分或全部group、cluster獲取相應的實例,客戶端根據權重或其他策略進行路由
服務端路由模式
插件式selector實現自定義路由模式,可對接第三方CMDB
-
與CMDB對接,根據service、ip等信息獲取元數據(如機房位置)
-
自定義實現選擇器selector,根據手動配置規則表達式選取相應實例
架構設計
存儲模型
全量數據位於內存中,每個節點數據保持一致,節點間采取同步協議進行復制
數據結構
一個客戶端連接為一個client,打包客戶端的信息與注冊、訂閱數據
- 注冊
- publisherIndexes => 哪些客戶端注冊了哪些服務
- serviceName
- clientid
- clientid
- serviceName
- ...
- serviceName
- publisherIndexes => 哪些客戶端注冊了哪些服務
- 訂閱
- subscriberIndexes => 哪些客戶端訂閱了哪些服務
- serviceName
- clientid
- clientid
- serviceName
- ...
- serviceName
- subscriberIndexes => 哪些客戶端訂閱了哪些服務
同步協議
distro
- 客戶端心跳/連接保活,重連時有恢復(注冊、訂閱)機制
- 數據同步為異步
raft
- 半數以上節點同步成功才返回給客戶端
通信協議
功能/版本 | 1.x distro | 1.x raft | 2.x distro | 2.x raft |
---|---|---|---|---|
注冊/注銷 | http | http | grpc | http |
訂閱 | http | http | grpc | grpc |
心跳/健康檢查 | http | TCP/http/mysql | TCP | TCP/http/mysql |
推送 | udp | udp | grpc | grpc |
集群間數據同步 | http/distro | http/自研raft | grpc/distro | jraft |
生態建設
- 客戶端
- Java
- golang
- Python
- C#
- Nodejs
- C++
- 插件
- Dubbo-registry-nacos
- Rpc-java-registry-nacos
- Nacos-spring-starter
- Nacos-sync
- Nacos-k8s-sync
- Nacos-client-mse-extension
- Nacos-coredns-plugin
- Nacos-istio
Nacos-sync
主要用於注冊中心遷移以及多數據中心數據同步
Nacos-coredns-plugin
consumer側可使用域名方式發現服務,無需使用Nacos客戶端
Nacos-istio
支持Nacos數據同步至MCP Server
優缺點分析
- 優點:
- AP模式,擴展性、多數據中心支持友好
- 服務發現模型設計支持邏輯上namespace、group、cluster等的隔離
- 健康檢查模式支持較多
- 支持臨時實例與持久化實例,滿足不同場景
- 功能多,生態豐富,支持多語言SDK
- 2.x版本grpc長連接性能強
- 單一進程,部署簡單,且附帶開箱即用的控制台
- 基本無依賴(除控制台依賴mysql,注冊中心部分實際不依賴任何第三方組件)
- 缺點:
- 1.x http心跳消耗大,2.x剛發布不久,可能存在一些bug
- 沒有分層設計,沒辦法針對性擴容,如連接數太多時,擴容能解決,但也會增加數據同步壓力
搜索關注微信公眾號"捉蟲大師",后端技術分享,架構設計、性能優化、源碼閱讀、問題排查、踩坑實踐。