1. 簡介
rnacos 是一個用rust實現的nacos服務。
rnacos是一個輕量、快速、穩定的服務,包含註冊中心、設定中心、web管理控制檯功能。
rnacos相容nacos client sdk用到的協定,支援使用nacos服務的應用平遷到 rnacos。
注:
nacos 是一個更易於構建雲原生應用的動態服務發現、設定管理和服務管理平臺。它的功能實用,在微服務架構中有較廣泛的應用。
2. 為什麼用rust重新實現nacos ?
nacos是由 java 實現,對輕度使用使用者來說佔用資源較重。
- 依賴 jdk,對非 java應用來說要多依賴一個 jdk;
- 應用比較大,最新應用壓縮包142M, docker壓縮包577M
- 啟動慢,啟動後要10秒左右才可用
- 執行時佔用資源比較大,啟動後執行緒數270左右,初始記憶體531M左右。
- 200qps左右流量單核cpu利用率就有17%左右。
本人開發應用有用到 nacos,個人雲服務部署一個nacos太重,本地開發測試開nacos也比較重。有使用更輕量服務的需求。
另一方面自己學習 rust 後,想寫個中介軟體實踐rust網路並行程式設計。
本人能讀java原始碼又能寫rust,分析確認開發可行性後,決定先寫一個最小功能集給自己用。
rnacos由此而開發出來。
目前rnacos的資源佔用情況
- rnacos 打包成原生應用,不依賴其它元件,支援多平臺。
- 應用大小11M左右, 壓縮包不到5M,docker 壓縮包9.4M
- 秒啟動,啟動1秒內應用控制檯、介面可用。
- 執行時佔用資源很小。啟動後執行緒數量在10左右,這個數量是固定的,後繼不什變化;初始記憶體2M,一萬個服務範例時,記憶體也在20M以內;
- 每秒200qps,單核cpu: 4.5% 左右。
具體效能可以看後面的壓測對比資料
3. 適用場景
- 開發測試環境使用nacos,nacos服務可以換成rnacos。啟動更快,秒啟動。
- 個人資源雲服務部署的 nacos,可以考慮換成rnacos。資源佔用率低: 包10M 左右,不依賴 JDK;執行時 cpu 小於0.5% ,小於5M(具體和範例有關)。
- 其它非叢集部署的 nacos ,理論上都支援遷移到 rnacos。
- 目前 rnacos 只支援單機部署,其支援容量在一萬個服務範例以上。在一萬服務範例場景下壓測,qps 可以穩定在1.2萬左右,記憶體穩定在50 M以下,cpu穩定在30%左右(和壓測環境有關)。
4. 快速開始
一、 安裝執行 rnacos
方式1:從 github release 下載對應系統的應用包,解壓後即可執行。
linux 或 mac
# 解壓
tar -xvf rnacos-x86_64-apple-darwin.tar.gz
# 執行
./rnacos
windows 解壓後直接執行 rnacos.exe 即可。
方式2: 通過docker 執行
docker pull qingpan/rnacos:latest
docker run --name mynacos -p 8848:8848 -p 9848:9848 -d qingpan/rnacos:latest
docker 的容器執行目錄是 /io,會從這個目錄讀寫組態檔
方式3:通過 cargo 編譯安裝
# 安裝
cargo install rnacos
# 執行
rnacos
方式4: 下載原始碼編譯執行
git clone https://github.com/heqingpan/rnacos.git
cd rnacos
cargo build --release
cargo run
推薦使用第1、第2種方式。
執行引數
rnacos 執行時支援的環境變數,如果不設定則按預設設定執行。
RNACOS_CONFIG_DB_FILE: 設定中心的本地資料庫檔案地址,預設為執行目錄下的 config.db
RNACOS_HTTP_PORT: rnacos監聽http埠,預設是8848
RNACOS_GRPC_PORT: rnacos監聽的grpc埠,預設是 HTTP埠+1000
RNACOS_HTTP_WORKERS: http工作執行緒數,預設是cpu核數
也支援從執行目錄下的.env讀取環境變數
.env 設定格式如下:
RNACOS_CONFIG_DB_FILE=config.db
RNACOS_HTTP_PORT=8848
二、執行nacos 應用
服務啟動後,即可執行原有的 nacos 應用。
具體的用法參考 nacos.io 的使用者指南。
JAVA-SDK
其它語言
open-api
三、控制檯管理
啟動服務後可以在瀏覽器通過 http://127.0.0.1:8848/
存取rnacos控制檯。
主要包含名稱空間管理、設定管理、服務管理、服務範例管理。
1、設定管理
設定列表管理
新建、編輯設定
2、服務列表管理
3、服務範例管理
5. rnacos對比nacos的功能說明
這裡把 nacos 服務的功能分為三塊
1、面向 SDK 的功能
2、面向控制檯的功能
3、面向部署、叢集的功能
第一塊做一個對nacos服務的對比說明。
一、面向 SDK 的功能
存取認證:
- 有提供獲取認證token的介面
- 實際請求暫不支援認證,都算認證通過。
設定中心:
- 支援設定中心的基礎功能、支援維護設定歷史記錄
- 相容設定中心的SDK協定
- 暫不支援灰度釋出、暫不支援tag隔離
註冊中心:
- 支援註冊中心的基礎功能
- 相容設定中心的SDK協定
- 暫不支援1.x的 udp 範例變更實時通知,只支援 2.x 版本grpc範例變更實時通知 。最開始的版本也有支援過udp範例變更 通知,後面因支援 grpc 的兩者不統一,就暫時去掉,後繼可以考慮加回去。
二、面向控制檯的功能
存取認證:
暫時不開啟認證
設定中心:
- 暫不支援設定的匯入、匯出,後繼計劃支援匯入、匯出,其格式相容 nacos 的匯出格式
- 暫不支援tag 的高階查詢
- 暫不支援設定歷史記錄檢視與恢復
- 暫不支援查詢設定監聽記錄
服務中心:
- 暫不支援路由型別的設定
- 暫不支援查詢監聽記錄
三、面向部署、叢集的功能
- 目前只支援單機部署,後繼考慮支援叢集部署。
- 設定中心的資料存放在本地 sqlite 中,後繼考慮支援其它中心資料庫。
6. rnacos與nacos效能比較
1. 壓測環境與工具
壓測環境:macos i7四核 /16G , 施壓、受壓機器是同一臺機器(會拉低壓測結果)。
壓測工具:
* wrk ,qps: 24450左右
* goose, qps 17000左右 (單程序加限流施壓比 wrk低)
* 單程序施壓請求wrk比goose 輸出高
rnacos server版本:v0.1.1
java nacos server版本: 2.1.0
2. 設定中心
設定中心,不會頻繁更新,寫入不做壓測。
rust rnacos server:
- 設定中心單機查詢 wrk 壓測 qps 在2.4萬左右.
java nacos server:
- 設定中心單機查詢 wrk 壓測, qps 在7700左右
3. 註冊中心
rust rnacos server:
- naming 註冊1000 x 1個範例,每秒200qps,單核cpu: 4.5% 左右
- naming 單查詢1.5萬 QPS 左右
- wrk 查詢單個服務 ,1.65萬 qps
- goose 查詢1000個服務 ,1.5萬 qps
- naming 單註冊服務
- goose,5萬到7萬範例數 0.7萬 qps左右。
- 查詢與註冊混合
- wrk 查詢單個服務(1.5萬 qps) + goose 註冊(0.075 萬qps) 【5千範例】
- goose 查詢1000個服務(1.3萬 qps) + goose 註冊(0.07萬 qps) 【5千範例】
- wrk 查詢單個服務(1.5萬 qps) + goose 註冊(0.15萬qps) 【1萬範例】
- goose 查詢1000個服務(1.3萬 qps) + goose 註冊(0.13萬 qps) 【1萬範例】
java nacos server:
- 設定中心查詢 wrk 壓測, 7700 qps 左右
- naming 註冊1000 x 1個範例,每秒200qps,單核cpu: 17% 左右
- naming 單查詢
- wrk 查詢單個服務 ,1.35萬 qps 。
- goose 查詢1000個服務,1萬 qps(前期應該還能上去一些)。前30秒能穩定在1萬左右,30秒後,跌到200左右之後再上下浮動,可能受 GC 影響。
- naming 單註冊
- goose,5萬到7萬範例數 0.45萬 qps左右。
- 查詢與註冊混合
- wrk 查詢單個服務(1.3萬 qps) + goose 註冊(0.07 萬qps) 【5千範例】
- goose 查詢1000個服務(1萬 qps) + goose 註冊(0.07萬 qps) 【5千範例】; 前期能保持,後期 qps 上下浮動比較大,最低小於50。
- wrk 查詢單個服務(0.9萬 qps) + goose 註冊(0.12萬qps) 【1萬範例】
- goose 查詢1000個服務(0.6萬 qps) + goose 註冊(0.08萬 qps) 【1萬範例】
4. 效能壓測總結
-
rnacos,除了服務服務註冊不能穩定在1萬以上,其它的介面qps都能穩定在1萬以上。
-
java 的查詢介面基本能壓到1萬以上,但不平穩,後繼浮動比較大。如果降低壓測流程,qps 可以相對平穩。
-
在多服務查詢疊加上多服務註冊場景,rnacos qps能穩定在1.3萬左右, java nacos qps 下降明顯在0.6萬左右。
-
rnacos 綜合 qps是 java版的2倍以上,因 java 有 GC,qps水位穩定性上 java較差(相同施壓流量,qps 能從峰值1萬能降到1百以下)。
-
rnacos 服務,執行緒數穩定在7,cpu 用例率最大200%左右(相當用個2核),記憶體在50M 以下
-
java nacos 服務,執行緒數最大300左右, cpu 用例率最大500%左右,記憶體600M到900M。
7. 後繼計劃
一、 對rnacos單機功能補全
- 設定中心
- 控制檯支援匯入匯出
- 查詢設定歷史變更記錄
- 支援歷史記錄回滾。
- 支援恢復釋出,與 tag設定隔離
- 支援查詢服務監聽列表
- 註冊中心
- 支援服務路由型別的設定
- 支援查詢服務監聽列表
二、rnacos支援叢集部署
- 設定中心資料支援 mysql 儲存
- 註冊中心支援叢集
- 寫路由
- 叢集間的資料同步
- 其它
- 叢集使用者認證同步
其它
目前專案已開源到 github, 歡迎共建PR。
希望用使用nacos場景的開發的同學可以試用 rnacos,如果過程中發現問題可以到 github 提Issues。