rnacos——用rust重新实现的nacos开源配置、注册中心服务

2023-08-01,,

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。

rnacos——用rust重新实现的nacos开源配置、注册中心服务的相关教程结束。

《rnacos——用rust重新实现的nacos开源配置、注册中心服务.doc》

下载本文的Word格式文档,以方便收藏与打印。