rnacos——用rust重新實現的nacos開源設定、註冊中心服務

2023-05-08 09:02:35

1. 簡介

rnacos 是一個用rust實現的nacos服務。

rnacos是一個輕量、快速、穩定的服務,包含註冊中心、設定中心、web管理控制檯功能。
rnacos相容nacos client sdk用到的協定,支援使用nacos服務的應用平遷到 rnacos。

注:
nacos 是一個更易於構建雲原生應用的動態服務發現、設定管理和服務管理平臺。它的功能實用,在微服務架構中有較廣泛的應用。

2. 為什麼用rust重新實現nacos ?

nacos是由 java 實現,對輕度使用使用者來說佔用資源較重。

  1. 依賴 jdk,對非 java應用來說要多依賴一個 jdk;
  2. 應用比較大,最新應用壓縮包142M, docker壓縮包577M
  3. 啟動慢,啟動後要10秒左右才可用
  4. 執行時佔用資源比較大,啟動後執行緒數270左右,初始記憶體531M左右。
  5. 200qps左右流量單核cpu利用率就有17%左右。

本人開發應用有用到 nacos,個人雲服務部署一個nacos太重,本地開發測試開nacos也比較重。有使用更輕量服務的需求。

另一方面自己學習 rust 後,想寫個中介軟體實踐rust網路並行程式設計。

本人能讀java原始碼又能寫rust,分析確認開發可行性後,決定先寫一個最小功能集給自己用。

rnacos由此而開發出來。

目前rnacos的資源佔用情況

  1. rnacos 打包成原生應用,不依賴其它元件,支援多平臺。
  2. 應用大小11M左右, 壓縮包不到5M,docker 壓縮包9.4M
  3. 秒啟動,啟動1秒內應用控制檯、介面可用。
  4. 執行時佔用資源很小。啟動後執行緒數量在10左右,這個數量是固定的,後繼不什變化;初始記憶體2M,一萬個服務範例時,記憶體也在20M以內;
  5. 每秒200qps,單核cpu: 4.5% 左右。

具體效能可以看後面的壓測對比資料

3. 適用場景

  1. 開發測試環境使用nacos,nacos服務可以換成rnacos。啟動更快,秒啟動。
  2. 個人資源雲服務部署的 nacos,可以考慮換成rnacos。資源佔用率低: 包10M 左右,不依賴 JDK;執行時 cpu 小於0.5% ,小於5M(具體和範例有關)。
  3. 其它非叢集部署的 nacos ,理論上都支援遷移到 rnacos。
  4. 目前 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 的功能

存取認證:

  1. 有提供獲取認證token的介面
  2. 實際請求暫不支援認證,都算認證通過。

設定中心:

  1. 支援設定中心的基礎功能、支援維護設定歷史記錄
  2. 相容設定中心的SDK協定
  3. 暫不支援灰度釋出、暫不支援tag隔離

註冊中心:

  1. 支援註冊中心的基礎功能
  2. 相容設定中心的SDK協定
  3. 暫不支援1.x的 udp 範例變更實時通知,只支援 2.x 版本grpc範例變更實時通知 。最開始的版本也有支援過udp範例變更 通知,後面因支援 grpc 的兩者不統一,就暫時去掉,後繼可以考慮加回去。

二、面向控制檯的功能

存取認證:
暫時不開啟認證

設定中心:

  1. 暫不支援設定的匯入、匯出,後繼計劃支援匯入、匯出,其格式相容 nacos 的匯出格式
  2. 暫不支援tag 的高階查詢
  3. 暫不支援設定歷史記錄檢視與恢復
  4. 暫不支援查詢設定監聽記錄

服務中心:

  1. 暫不支援路由型別的設定
  2. 暫不支援查詢監聽記錄

三、面向部署、叢集的功能

  1. 目前只支援單機部署,後繼考慮支援叢集部署。
  2. 設定中心的資料存放在本地 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:

  1. 設定中心單機查詢 wrk 壓測 qps 在2.4萬左右.

java nacos server:

  1. 設定中心單機查詢 wrk 壓測, qps 在7700左右

3. 註冊中心

rust rnacos server:

  1. naming 註冊1000 x 1個範例,每秒200qps,單核cpu: 4.5% 左右
  2. naming 單查詢1.5萬 QPS 左右
    1. wrk 查詢單個服務 ,1.65萬 qps
    2. goose 查詢1000個服務 ,1.5萬 qps
  3. naming 單註冊服務
    1. goose,5萬到7萬範例數 0.7萬 qps左右。
  4. 查詢與註冊混合
    1. wrk 查詢單個服務(1.5萬 qps) + goose 註冊(0.075 萬qps) 【5千範例】
    2. goose 查詢1000個服務(1.3萬 qps) + goose 註冊(0.07萬 qps) 【5千範例】
    3. wrk 查詢單個服務(1.5萬 qps) + goose 註冊(0.15萬qps) 【1萬範例】
    4. goose 查詢1000個服務(1.3萬 qps) + goose 註冊(0.13萬 qps) 【1萬範例】

java nacos server:

  1. 設定中心查詢 wrk 壓測, 7700 qps 左右
  2. naming 註冊1000 x 1個範例,每秒200qps,單核cpu: 17% 左右
  3. naming 單查詢
    1. wrk 查詢單個服務 ,1.35萬 qps 。
    2. goose 查詢1000個服務,1萬 qps(前期應該還能上去一些)。前30秒能穩定在1萬左右,30秒後,跌到200左右之後再上下浮動,可能受 GC 影響。
  4. naming 單註冊
    1. goose,5萬到7萬範例數 0.45萬 qps左右。
  5. 查詢與註冊混合
    1. wrk 查詢單個服務(1.3萬 qps) + goose 註冊(0.07 萬qps) 【5千範例】
    2. goose 查詢1000個服務(1萬 qps) + goose 註冊(0.07萬 qps) 【5千範例】; 前期能保持,後期 qps 上下浮動比較大,最低小於50。
    3. wrk 查詢單個服務(0.9萬 qps) + goose 註冊(0.12萬qps) 【1萬範例】
    4. goose 查詢1000個服務(0.6萬 qps) + goose 註冊(0.08萬 qps) 【1萬範例】

4. 效能壓測總結

  1. rnacos,除了服務服務註冊不能穩定在1萬以上,其它的介面qps都能穩定在1萬以上。

  2. java 的查詢介面基本能壓到1萬以上,但不平穩,後繼浮動比較大。如果降低壓測流程,qps 可以相對平穩。

  3. 在多服務查詢疊加上多服務註冊場景,rnacos qps能穩定在1.3萬左右, java nacos qps 下降明顯在0.6萬左右。

  4. rnacos 綜合 qps是 java版的2倍以上,因 java 有 GC,qps水位穩定性上 java較差(相同施壓流量,qps 能從峰值1萬能降到1百以下)。

  5. rnacos 服務,執行緒數穩定在7,cpu 用例率最大200%左右(相當用個2核),記憶體在50M 以下

  6. java nacos 服務,執行緒數最大300左右, cpu 用例率最大500%左右,記憶體600M到900M。

7. 後繼計劃

一、 對rnacos單機功能補全

  1. 設定中心
    1. 控制檯支援匯入匯出
    2. 查詢設定歷史變更記錄
    3. 支援歷史記錄回滾。
    4. 支援恢復釋出,與 tag設定隔離
    5. 支援查詢服務監聽列表
  2. 註冊中心
    1. 支援服務路由型別的設定
    2. 支援查詢服務監聽列表

二、rnacos支援叢集部署

  1. 設定中心資料支援 mysql 儲存
  2. 註冊中心支援叢集
    1. 寫路由
    2. 叢集間的資料同步
  3. 其它
    1. 叢集使用者認證同步

其它

目前專案已開源到 github, 歡迎共建PR。

希望用使用nacos場景的開發的同學可以試用 rnacos,如果過程中發現問題可以到 github 提Issues。