Nacos 架構(gòu)
基本架構(gòu)及概念
服務(wù) (Service)
服務(wù)是指一個(gè)或一組軟件功能(例如特定信息的檢索或一組操作的執(zhí)行),其目的是不同的客戶端可以為不同的目的重用(例如通過跨進(jìn)程的網(wǎng)絡(luò)調(diào)用)。Nacos 支持主流的服務(wù)生態(tài),如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service.
服務(wù)注冊中心 (Service Registry)
服務(wù)注冊中心,它是服務(wù),其實(shí)例及元數(shù)據(jù)的數(shù)據(jù)庫。服務(wù)實(shí)例在啟動時(shí)注冊到服務(wù)注冊表,并在關(guān)閉時(shí)注銷。服務(wù)和路由器的客戶端查詢服務(wù)注冊表以查找服務(wù)的可用實(shí)例。服務(wù)注冊中心可能會調(diào)用服務(wù)實(shí)例的健康檢查 API 來驗(yàn)證它是否能夠處理請求。
服務(wù)元數(shù)據(jù) (Service Metadata)
服務(wù)元數(shù)據(jù)是指包括服務(wù)端點(diǎn)(endpoints)、服務(wù)標(biāo)簽、服務(wù)版本號、服務(wù)實(shí)例權(quán)重、路由規(guī)則、安全策略等描述服務(wù)的數(shù)據(jù)
服務(wù)提供方 (Service Provider)
是指提供可復(fù)用和可調(diào)用服務(wù)的應(yīng)用方
服務(wù)消費(fèi)方 (Service Consumer)
是指會發(fā)起對某個(gè)服務(wù)調(diào)用的應(yīng)用方
配置 (Configuration)
在系統(tǒng)開發(fā)過程中通常會將一些需要變更的參數(shù)、變量等從代碼中分離出來獨(dú)立管理,以獨(dú)立的配置文件的形式存在。目的是讓靜態(tài)的系統(tǒng)工件或者交付物(如 WAR,JAR 包等)更好地和實(shí)際的物理運(yùn)行環(huán)境進(jìn)行適配。配置管理一般包含在系統(tǒng)部署的過程中,由系統(tǒng)管理員或者運(yùn)維人員完成這個(gè)步驟。配置變更是調(diào)整系統(tǒng)運(yùn)行時(shí)的行為的有效手段之一。
配置管理 (Configuration Management)
在數(shù)據(jù)中心中,系統(tǒng)中所有配置的編輯、存儲、分發(fā)、變更管理、歷史版本管理、變更審計(jì)等所有與配置相關(guān)的活動統(tǒng)稱為配置管理。
名字服務(wù) (Naming Service)
提供分布式系統(tǒng)中所有對象(Object)、實(shí)體(Entity)的“名字”到關(guān)聯(lián)的元數(shù)據(jù)之間的映射管理服務(wù),例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服務(wù)發(fā)現(xiàn)和 DNS 就是名字服務(wù)的2大場景。
配置服務(wù) (Configuration Service)
在服務(wù)或者應(yīng)用運(yùn)行過程中,提供動態(tài)配置或者元數(shù)據(jù)以及配置管理的服務(wù)提供者。
更多概念...
邏輯架構(gòu)及其組件介紹
- 服務(wù)管理:實(shí)現(xiàn)服務(wù)CRUD,域名CRUD,服務(wù)健康狀態(tài)檢查,服務(wù)權(quán)重管理等功能
- 配置管理:實(shí)現(xiàn)配置管CRUD,版本管理,灰度管理,監(jiān)聽管理,推送軌跡,聚合數(shù)據(jù)等功能
- 元數(shù)據(jù)管理:提供元數(shù)據(jù)CURD 和打標(biāo)能力
- 插件機(jī)制:實(shí)現(xiàn)三個(gè)模塊可分可合能力,實(shí)現(xiàn)擴(kuò)展點(diǎn)SPI機(jī)制
- 事件機(jī)制:實(shí)現(xiàn)異步化事件通知,sdk數(shù)據(jù)變化異步通知等邏輯
- 日志模塊:管理日志分類,日志級別,日志可移植性(尤其避免沖突),日志格式,異常碼+幫助文檔
- 回調(diào)機(jī)制:sdk通知數(shù)據(jù),通過統(tǒng)一的模式回調(diào)用戶處理。接口和數(shù)據(jù)結(jié)構(gòu)需要具備可擴(kuò)展性
- 尋址模式:解決ip,域名,nameserver、廣播等多種尋址模式,需要可擴(kuò)展
- 推送通道:解決server與存儲、server間、server與sdk間推送性能問題
- 容量管理:管理每個(gè)租戶,分組下的容量,防止存儲被寫爆,影響服務(wù)可用性
- 流量管理:按照租戶,分組等多個(gè)維度對請求頻率,長鏈接個(gè)數(shù),報(bào)文大小,請求流控進(jìn)行控制
- 緩存機(jī)制:容災(zāi)目錄,本地緩存,server緩存機(jī)制。容災(zāi)目錄使用需要工具
- 啟動模式:按照單機(jī)模式,配置模式,服務(wù)模式,dns模式,或者all模式,啟動不同的程序+UI
- 一致性協(xié)議:解決不同數(shù)據(jù),不同一致性要求情況下,不同一致性機(jī)制
- 存儲模塊:解決數(shù)據(jù)持久化、非持久化存儲,解決數(shù)據(jù)分片問題
- Nameserver:解決namespace到clusterid的路由問題,解決用戶環(huán)境與nacos物理環(huán)境映射問題
- CMDB:解決元數(shù)據(jù)存儲,與三方cmdb系統(tǒng)對接問題,解決應(yīng)用,人,資源關(guān)系
- Metrics:暴露標(biāo)準(zhǔn)metrics數(shù)據(jù),方便與三方監(jiān)控系統(tǒng)打通
- Trace:暴露標(biāo)準(zhǔn)trace,方便與SLA系統(tǒng)打通,日志白平化,推送軌跡等能力,并且可以和計(jì)量計(jì)費(fèi)系統(tǒng)打通
- 接入管理:相當(dāng)于阿里云開通服務(wù),分配身份、容量、權(quán)限過程
- 用戶管理:解決用戶管理,登錄,sso等問題
- 權(quán)限管理:解決身份識別,訪問控制,角色管理等問題
- 審計(jì)系統(tǒng):擴(kuò)展接口方便與不同公司審計(jì)系統(tǒng)打通
- 通知系統(tǒng):核心數(shù)據(jù)變更,或者操作,方便通過SMS系統(tǒng)打通,通知到對應(yīng)人數(shù)據(jù)變更
- OpenAPI:暴露標(biāo)準(zhǔn)Rest風(fēng)格HTTP接口,簡單易用,方便多語言集成
- Console:易用控制臺,做服務(wù)管理、配置管理等操作
- SDK:多語言sdk
- Agent:dns-f類似模式,或者與mesh等方案集成
- CLI:命令行對產(chǎn)品進(jìn)行輕量化管理,像git一樣好用
領(lǐng)域模型
數(shù)據(jù)模型
Nacos 數(shù)據(jù)模型 Key 由三元組唯一確定, Namespace默認(rèn)是空串,公共命名空間(public),分組默認(rèn)是 DEFAULT_GROUP。
服務(wù)領(lǐng)域模型
配置領(lǐng)域模型
圍繞配置,主要有兩個(gè)關(guān)聯(lián)的實(shí)體,一個(gè)是配置變更歷史,一個(gè)是服務(wù)標(biāo)簽(用于打標(biāo)分類,方便索引),由 ID 關(guān)聯(lián)。
類視圖
Nacos-SDK 類視圖
服務(wù)部分待續(xù)
構(gòu)建物、部署及啟動模式
兩種交付工件
Nacos 支持標(biāo)準(zhǔn) Docker 鏡像(TODO: 0.2版本開始支持)及 zip(tar.gz)壓縮包的構(gòu)建物。
兩種啟動模式
Nacos 支持將注冊中心(Service Registry)與配置中心(Config Center) 在一個(gè)進(jìn)程合并部署或者將2者分離部署的兩種模式。
免費(fèi)的公有云服務(wù)模式
除了您自己部署和啟動 Nacos 服務(wù)之外,在云計(jì)算時(shí)代,Nacos 也支持公有云模式,在阿里云公有云的商業(yè)產(chǎn)品(如ACM, EDAS) 中會提供 Nacos 的免費(fèi)的公有云服務(wù)。我們也歡迎和支持其他的公有云提供商提供 Nacos 的公有云服務(wù)。
Nacos 快速開始
這個(gè)快速開始手冊是幫忙您快速在您的電腦上,下載、安裝并使用 Nacos。
0.版本選擇
您可以在Nacos的release notes及博客中找到每個(gè)版本支持的功能的介紹,當(dāng)前推薦的穩(wěn)定版本為1.3.1。
1.預(yù)備環(huán)境準(zhǔn)備
Nacos 依賴 Java 環(huán)境來運(yùn)行。如果您是從代碼開始構(gòu)建并運(yùn)行Nacos,還需要為此配置 Maven環(huán)境,請確保是在以下版本環(huán)境中安裝使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;下載 & 配置。
- Maven 3.2.x+;下載 & 配置。
2.下載源碼或者安裝包
你可以通過源碼和發(fā)行包兩種方式來獲取 Nacos。
從 Github 上下載源碼方式
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
下載編譯后壓縮包方式
您可以從 最新穩(wěn)定版本 下載 nacos-server-$version.zip 包。
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
3.啟動服務(wù)器
Linux/Unix/Mac
啟動命令(standalone代表著單機(jī)模式運(yùn)行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系統(tǒng),或者運(yùn)行腳本報(bào)錯提示[[符號找不到,可嘗試如下運(yùn)行:
bash startup.sh -m standalone
Windows
啟動命令:
cmd startup.cmd
或者雙擊startup.cmd運(yùn)行文件。
4.服務(wù)注冊&發(fā)現(xiàn)和配置管理
服務(wù)注冊
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
服務(wù)發(fā)現(xiàn)
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
發(fā)布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
獲取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
5.關(guān)閉服務(wù)器
Linux/Unix/Mac
sh shutdown.sh
Windows
cmd shutdown.cmd
或者雙擊shutdown.cmd運(yùn)行文件。
Nacos 系統(tǒng)參數(shù)介紹
Nacos Server
對于Server端來說,一般是設(shè)置在{nacos.home}/conf/application.properties里,如果參數(shù)名后標(biāo)注了(-D)的,則表示是 JVM 的參數(shù),需要在{nacos.home}/bin/startup.sh里進(jìn)行相應(yīng)的設(shè)置。例如像設(shè)置 nacos.home 的值,可以在{nacos.home}/bin/startup.sh進(jìn)行如下設(shè)置:
JAVA_OPT="${JAVA_OPT} -Dnacos.home=${BASE_DIR}"
全局參數(shù)
| 參數(shù)名 | 含義 | 可選值 | 默認(rèn)值 | 支持版本 |
|---|---|---|---|---|
| nacos.home(-D) | Nacos的根目錄 | 目錄路徑 | Nacos安裝的目錄 | >= 0.1.0 |
| nacos.standalone(-D) | 是否在單機(jī)模式 | true/false | false | >= 0.1.0 |
| nacos.functionMode(-D) | 啟動模式,支持只啟動某一個(gè)模塊,不設(shè)置時(shí)所有模塊都會啟動 | config/naming/空 | 空 | >= 0.9.0 |
| nacos.inetutils.prefer-hostname-over-ip |
cluster.conf里是否應(yīng)該填hostname
|
true/false | false | >= 0.3.0 |
| nacos.inetutils.ip-address | 本機(jī)IP,該參數(shù)設(shè)置后,將會使用這個(gè)IP去cluster.conf里進(jìn)行匹配,請確保這個(gè)IP的值在cluster.conf里是存在的 |
本機(jī)IP | null | >= 0.3.0 |
| nacos.security.ignore.urls | 控制臺鑒權(quán)跳過的接口 | 需要跳過控制臺鑒權(quán)的接口列表 | 空 | >= 0.9.0 |
Naming模塊
| 參數(shù)名 | 含義 | 可選值 | 默認(rèn)值 | 支持版本 |
|---|---|---|---|---|
| nacos.naming.data.warmup | 是否在Server啟動時(shí)進(jìn)行數(shù)據(jù)預(yù)熱 | true/false | false | >= 1.0.2 |
| nacos.naming.expireInstance | 是否自動摘除臨時(shí)實(shí)例 | true/false | true | >= 1.0.2 |
| nacos.naming.distro.taskDispatchPeriod | 同步任務(wù)生成的周期,單位為毫秒 | 正整數(shù) | 200 | >= 1.0.2 |
| nacos.naming.distro.batchSyncKeyCount | 同步任務(wù)每批的key的數(shù)目 | 正整數(shù) | 1000 | >= 1.0.2 |
| nacos.naming.distro.syncRetryDelay | 同步任務(wù)失敗的重試間隔,單位為毫秒 | 正整數(shù) | 5000 | >= 1.0.2 |
除了上面列到的在application.properties里配置的屬性,還有一些可以在運(yùn)行時(shí)調(diào)用接口來進(jìn)行調(diào)節(jié),這些參數(shù)都在Open API里的查看系統(tǒng)當(dāng)前數(shù)據(jù)指標(biāo)這個(gè)API里有聲明。
Config模塊
| 參數(shù)名 | 含義 | 可選值 | 默認(rèn)值 | 支持版本 |
|---|---|---|---|---|
| db.num | 數(shù)據(jù)庫數(shù)目 | 正整數(shù) | 0 | >= 0.1.0 |
| db.url.0 | 第一個(gè)數(shù)據(jù)庫的URL | 字符串 | 空 | >= 0.1.0 |
| db.url.1 | 第二個(gè)數(shù)據(jù)庫的URL | 字符串 | 空 | >= 0.1.0 |
| db.user | 數(shù)據(jù)庫連接的用戶名 | 字符串 | 空 | >= 0.1.0 |
| db.password | 數(shù)據(jù)庫連接的密碼 | 字符串 | 空 | >= 0.1.0 |
CMDB模塊
| 參數(shù)名 | 含義 | 可選值 | 默認(rèn)值 | 支持版本 |
|---|---|---|---|---|
| nacos.cmdb.loadDataAtStart | 是否打開CMDB | true/false | false | >= 0.7.0 |
| nacos.cmdb.dumpTaskInterval | 全量dump的間隔,單位為秒 | 正整數(shù) | 3600 | >= 0.7.0 |
| nacos.cmdb.eventTaskInterval | 變更事件的拉取間隔,單位為秒 | 正整數(shù) | 10 | >= 0.7.0 |
| nacos.cmdb.labelTaskInterval | 標(biāo)簽集合的拉取間隔,單位為秒 | 正整數(shù) | 300 | >= 0.7.0 |
Nacos Java Client
客戶端的參數(shù)分為兩種,一種是通過-D參數(shù)進(jìn)行指定的配置,一種是構(gòu)造客戶端時(shí),通過Properties對象指定的配置,以下沒有帶-D標(biāo)注的都是通過Properties注入的配置。
通用參數(shù)
| 參數(shù)名 | 含義 | 可選值 | 默認(rèn)值 | 支持版本 |
|---|---|---|---|---|
| endpoint | 連接Nacos Server指定的連接點(diǎn),可以參考文檔 | 域名 | 空 | >= 0.1.0 |
| endpointPort | 連接Nacos Server指定的連接點(diǎn)端口,可以參考文檔 | 合法端口號 | 空 | >= 0.1.0 |
| namespace | 命名空間的ID | 命名空間的ID | config模塊為空,naming模塊為public | >= 0.8.0 |
| serverAddr | Nacos Server的地址列表,這個(gè)值的優(yōu)先級比endpoint高 | ip:port,ip:port,... | 空 | >= 0.1.0 |
| nacos.logging.path(-D) | 客戶端日志的目錄 | 目錄路徑 | 用戶根目錄 | >= 0.1.0 |
Naming客戶端
| 參數(shù)名 | 含義 | 可選值 | 默認(rèn)值 | 支持版本 |
|---|---|---|---|---|
| namingLoadCacheAtStart | 啟動時(shí)是否優(yōu)先讀取本地緩存 | true/false | false | >= 1.0.0 |
| namingClientBeatThreadCount | 客戶端心跳的線程池大小 | 正整數(shù) | 機(jī)器的CPU數(shù)的一半 | >= 1.0.0 |
| namingPollingThreadCount | 客戶端定時(shí)輪詢數(shù)據(jù)更新的線程池大小 | 正整數(shù) | 機(jī)器的CPU數(shù)的一半 | >= 1.0.0 |
| com.alibaba.nacos.naming.cache.dir(-D) | 客戶端緩存目錄 | 目錄路徑 | {user.home}/nacos/naming | >= 1.0.0 |
| com.alibaba.nacos.naming.log.level(-D) | Naming客戶端的日志級別 | info,error,warn等 | info | >= 1.0.0 |
| com.alibaba.nacos.client.naming.tls.enable(-D) | 是否打開HTTPS | true/false | false | >= 1.0.0 |
Config客戶端
| 參數(shù)名 | 含義 | 可選值 | 默認(rèn)值 | 支持版本 |
|---|---|---|---|---|
| configLongPollTimeout(config.long-poll.timeout 1.0.1版本) | 長輪詢的超時(shí)時(shí)間,單位為毫秒 | 正整數(shù) | 30000 | >= 1.0.2 |
| configRetryTime(config.retry.time 1.0.1版本) | 長輪詢?nèi)蝿?wù)重試時(shí)間,單位為毫秒 | 正整數(shù) | 2000 | >= 1.0.2 |
| maxRetry | 長輪詢的重試次數(shù) | 正整數(shù) | 3 | >= 1.0.2 |
| enableRemoteSyncConfig | 監(jiān)聽器首次添加時(shí)拉取遠(yuǎn)端配置 | 布爾值 | false | >= 1.0.2 |
| com.alibaba.nacos.config.log.level(-D) | Config客戶端的日志級別 | info,error,warn等 | info | >= 1.0.0 |
| JM.SNAPSHOT.PATH(-D) | 客戶端緩存目錄 | 目錄路徑 | {user.home}/nacos/config | >= 1.0.0 |