本文已收錄 https://github.com/lkxiaolou/lkxiaolou 歡迎star峦阁。
Nacos簡(jiǎn)介
Nacos : Naming and Configuration Service晴埂,可打包部署配置中心和注冊(cè)中心茂洒,也可獨(dú)立部署其中之一胖缤,配置中心十电、控制臺(tái)依賴(lài)mysql赛糟,由阿里巴巴2018年8月開(kāi)源淤刃,github 19.1k star(截止2021.08.24)
本文只講解服務(wù)發(fā)現(xiàn)部分睁搭。
服務(wù)注冊(cè)發(fā)現(xiàn)模型
- namespace:環(huán)境隔離赶诊、租戶(hù)隔離笼平;不同namespace服務(wù)無(wú)法相互發(fā)現(xiàn)
- group:業(yè)務(wù)隔離;解決不同業(yè)務(wù)下serviceName相同的問(wèn)題舔痪;可獲取默認(rèn)或指定group實(shí)例
- cluster:集群隔離寓调;可定制化路由偏好;可獲取全部或指定集群實(shí)例
臨時(shí)實(shí)例
臨時(shí)實(shí)例:靠client的心跳或連接背耄活夺英,當(dāng)不存活時(shí),直接下線(xiàn)實(shí)例滋捶;適用于主動(dòng)注冊(cè)的服務(wù)痛悯,特別適合K8S下ip漂移的場(chǎng)景
永久實(shí)例:注冊(cè)后不用保活重窟,靠服務(wù)端健康檢查來(lái)判斷實(shí)例是否健康载萌,不健康實(shí)例也不用下線(xiàn);適用于ip不常變化的場(chǎng)景
在Nacos中他們的主要區(qū)別如下:
emphemral | true | false |
---|---|---|
名稱(chēng) | 臨時(shí)實(shí)例 | 永久實(shí)例 |
CAP | AP | CP |
一致性協(xié)議 | distro | raft |
是否持久化 | 否 | 是 |
健康檢查方式 | 心跳/連接 | 服務(wù)端檢查(TCP亲族、HTTP炒考、MYSQL) |
Dubbo適配
- 使用臨時(shí)實(shí)例
- 應(yīng)用級(jí):serviceName為應(yīng)用名即可
- 服務(wù)級(jí)(Dubbo):以
provider/consumer:$[service_name]:${version}:${group}
為服務(wù)名
路由模式
客戶(hù)端路由模式
客戶(hù)端(SDK)根據(jù)service,指定部分或全部group霎迫、cluster獲取相應(yīng)的實(shí)例斋枢,客戶(hù)端根據(jù)權(quán)重或其他策略進(jìn)行路由
服務(wù)端路由模式
插件式selector實(shí)現(xiàn)自定義路由模式,可對(duì)接第三方CMDB
與CMDB對(duì)接知给,根據(jù)service瓤帚、ip等信息獲取元數(shù)據(jù)(如機(jī)房位置)
自定義實(shí)現(xiàn)選擇器selector,根據(jù)手動(dòng)配置規(guī)則表達(dá)式選取相應(yīng)實(shí)例
架構(gòu)設(shè)計(jì)
存儲(chǔ)模型
全量數(shù)據(jù)位于內(nèi)存中涩赢,每個(gè)節(jié)點(diǎn)數(shù)據(jù)保持一致戈次,節(jié)點(diǎn)間采取同步協(xié)議進(jìn)行復(fù)制
數(shù)據(jù)結(jié)構(gòu)
一個(gè)客戶(hù)端連接為一個(gè)client,打包客戶(hù)端的信息與注冊(cè)筒扒、訂閱數(shù)據(jù)
- 注冊(cè)
- publisherIndexes => 哪些客戶(hù)端注冊(cè)了哪些服務(wù)
- serviceName
- clientid
- clientid
- serviceName
- ...
- serviceName
- publisherIndexes => 哪些客戶(hù)端注冊(cè)了哪些服務(wù)
- 訂閱
- subscriberIndexes => 哪些客戶(hù)端訂閱了哪些服務(wù)
- serviceName
- clientid
- clientid
- serviceName
- ...
- serviceName
- subscriberIndexes => 哪些客戶(hù)端訂閱了哪些服務(wù)
同步協(xié)議
distro
- 客戶(hù)端心跳/連接鼻有埃活,重連時(shí)有恢復(fù)(注冊(cè)花墩、訂閱)機(jī)制
- 數(shù)據(jù)同步為異步
raft
- 半數(shù)以上節(jié)點(diǎn)同步成功才返回給客戶(hù)端
通信協(xié)議
功能/版本 | 1.x distro | 1.x raft | 2.x distro | 2.x raft |
---|---|---|---|---|
注冊(cè)/注銷(xiāo) | http | http | grpc | http |
訂閱 | http | http | grpc | grpc |
心跳/健康檢查 | http | TCP/http/mysql | TCP | TCP/http/mysql |
推送 | udp | udp | grpc | grpc |
集群間數(shù)據(jù)同步 | http/distro | http/自研raft | grpc/distro | jraft |
生態(tài)建設(shè)
- 客戶(hù)端
- 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
主要用于注冊(cè)中心遷移以及多數(shù)據(jù)中心數(shù)據(jù)同步
Nacos-coredns-plugin
consumer側(cè)可使用域名方式發(fā)現(xiàn)服務(wù)悬秉,無(wú)需使用Nacos客戶(hù)端
Nacos-istio
支持Nacos數(shù)據(jù)同步至MCP Server
優(yōu)缺點(diǎn)分析
- 優(yōu)點(diǎn):
- AP模式,擴(kuò)展性冰蘑、多數(shù)據(jù)中心支持友好
- 服務(wù)發(fā)現(xiàn)模型設(shè)計(jì)支持邏輯上namespace和泌、group、cluster等的隔離
- 健康檢查模式支持較多
- 支持臨時(shí)實(shí)例與持久化實(shí)例祠肥,滿(mǎn)足不同場(chǎng)景
- 功能多武氓,生態(tài)豐富,支持多語(yǔ)言SDK
- 2.x版本grpc長(zhǎng)連接性能強(qiáng)
- 單一進(jìn)程,部署簡(jiǎn)單县恕,且附帶開(kāi)箱即用的控制臺(tái)
- 基本無(wú)依賴(lài)(除控制臺(tái)依賴(lài)mysql东羹,注冊(cè)中心部分實(shí)際不依賴(lài)任何第三方組件)
- 缺點(diǎn):
- 1.x http心跳消耗大,2.x剛發(fā)布不久弱睦,可能存在一些bug
- 沒(méi)有分層設(shè)計(jì)百姓,沒(méi)辦法針對(duì)性擴(kuò)容,如連接數(shù)太多時(shí)况木,擴(kuò)容能解決垒拢,但也會(huì)增加數(shù)據(jù)同步壓力