rnacos——用rust重新实现的nacos开源配置注册中心服务(代码片段)

拾玄 拾玄     2023-05-09     532

关键词:

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 gitee 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 gitee, 欢迎共建PR。

希望用使用nacos场景的开发的同学可以试用 rnacos,如果过程中发现问题可以到 github 提Issues。

如果对你有帮忙就给个star 鼓励鼓励

开源|用rust编写的,闪电般快速且功能强大的代码编辑器

以下内容选自「码农周刊VIP会员」圈子,每日更新,精彩不断。用Rust编写的,闪电般快速且功能强大的代码编辑器。它的UI使用Druid,使用Xi编辑器的RopeScience技术进行文本编辑,并使用Wgpu进行渲染。 查看详情

使用nacos实现springcloudzuul的动态路由(代码片段)

...心赋能。二.SpringCloudZuul动态路由实现思路在社区书籍《重新定义SpringCloud实战》中第8章4小节,详细剖析了Zuul的路由配置表加载以及刷新原理,其大致思想就是重写SimpleRouteLocator类的locateRoutes()方法,同时实现Refreshabl... 查看详情

用 Rust 解释这个结构实现

】用Rust解释这个结构实现【英文标题】:ExplainthisstructimplementationinRust【发布时间】:2021-08-2323:43:24【问题描述】://`Inches`,atuplestructthatcanbeprinted#[derive(Debug)]structInches(i32);implInchesfnto_centimeters(&self)->Centimeterslet& 查看详情

alibaba-技术专区-开源项目之nacos功能特性(代码片段)

一、背景  先来说说大背景,现在,很明显的一个趋势就是:微服务。  这个趋势的底层驱动力就来源于分布式系统的普及,而微服务的各个特性是如今大大小小的企业无法拒绝的诱惑。  然后,用上了微服务的架构风格... 查看详情

springboot整合springcloudnacos实现配置管理和服务发现(代码片段)

...环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。Nacos=SpringCloud... 查看详情

阿里开源服务发现组件nacos快速入门(代码片段)

...用,以充分发挥云计算的优势。云原生应用的特点是可以实现快速和频繁的构建、发布、部署,可以方便的满足在扩展性,可用性,可移植性等方面的要求,并提供更好的经济性。针对云原生,云厂商也纷纷提出了自己的解决方... 查看详情

使用nacos实现springcloudzuul的动态路由(代码片段)

一.前言Nacos是阿里巴巴开源的致力于服务发现与管理、动态配置管理,以及动态DNS服务的中间件,目前已发布至0.5.0版本,除了与SpringCloud更加紧密结合以外,还丧心病狂地支持JDK11。如果您目前的项目碍于Eureka的... 查看详情

使用nacos实现springcloudzuul的动态路由(代码片段)

一.前言Nacos是阿里巴巴开源的致力于服务发现与管理、动态配置管理,以及动态DNS服务的中间件,目前已发布至0.5.0版本,除了与SpringCloud更加紧密结合以外,还丧心病狂地支持JDK11。如果您目前的项目碍于Eureka的... 查看详情

开源周刊第一期

...建工具,功能和用法上对齐webpack.启动速度极快:基于Rust实现,构建速度极快,带给你极致的开发体验。闪电般的HMR:内置增量编译机制,HMR速度极快,完全胜任大型项目的开发兼容webpack生态:针对webpack的架构和生态进行兼容,无... 查看详情

使用nacos实现分布式配置中心(代码片段)

...,部署。一旦配置需要变更,我们需要硬编码进行修改,重新上线,重启服务,这样非常的不灵活,也非常不 查看详情

springboot整合springcloudnacos实现配置管理和服务发现(代码片段)

微服务注册中心现在常用的主流有三个Nacos,Eureka与ZooKeeperNacos是阿里开源的,Nacos支持基于DNS和基于RPC的服务发现。在SpringCloud中使用Nacos,只需要先下载Nacos并启动Nacosserver,Nacos只需要简单的配置就可以完成服务的注... 查看详情

springboot整合springcloudnacos实现配置管理和服务发现(代码片段)

微服务注册中心现在常用的主流有三个Nacos,Eureka与ZooKeeperNacos是阿里开源的,Nacos支持基于DNS和基于RPC的服务发现。在SpringCloud中使用Nacos,只需要先下载Nacos并启动Nacosserver,Nacos只需要简单的配置就可以完成服务的注... 查看详情

用匹配结果读取 Rust 中的行

...:2022-01-1520:45:37【问题描述】:我对Rust很陌生,并尝试实现一些基本的东西。所以文档中的一个示例是关于从文本文件中读取行:https://doc.rust-lang.org/rust-by-example/std_misc/file/read_lines.html示例代码有效(显然......)但我想 查看详情

71nacos实现微服务的注册与发现

...直接写死的话,一旦接口发生变化的情况下,这时候需要重新发布版本才可以改接口调用地址,所以需要一个注册中心统一管理我们的服务注册与发现 查看详情

nacos1.1.4源码第五天ap的实现

参考技术ANacos集群默认支持的是CAP原则中的AP原则nacos后面的版本可以切换cp和apcpap状态切换命令:curl-XPUT'$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'目前1.1.4里面 如果是临时节点就是ap  持久化节... 查看详情

从0开始学微服务---2020年04月

...检测两种健康检查模式。  可以在配置变更时,不需要重新部署应用和服务,让配置的管理变的更加高效和敏捷。  动态DNS服务支持权重路由,可以实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心你给我的... 查看详情

一、nacos介绍

...的内部产品ConfigServer说起了,因为Nacos是ConfigServer的开源实现早在2008年阿里就开始服务化的进程(那个时候我好像还在上初中啊),在那个时候阿里内部自研的服务发现解决方案就叫做ConfigServerConfigServer经历了十年的发展从V1.0的单... 查看详情

微服务架构中主流的配置中心对比分析?

...效:传统的静态配置方式要想修改某个配置只能修改之后重新发布应用,要实现动态性,可以选择使用数据库,通过定时轮询访问数据库来感知配置的变化。轮询频率低感知配置变化的延时就长,轮询频率高,感知配置变化的延... 查看详情