Nacos server re-implemented in Rust.

Overview

rnacos

简介

rnacos是一个用rust实现的nacos服务。

rnacos是一个轻量、快速、稳定的服务,包含注册中心、配置中心、web管理控制台功能。

rnacos兼容nacos client sdk用到的协议(包含1.x的http OpenApi,和2.x的grpc协议),支持使用nacos服务的应用平迁到 rnacos。

详细说明可以看 rnacos book

开发原由

一方面自己学习 rust 后想,写个中间件实践rust网络并发编程。

另一方面,自己开发应用有用到 nacos,个人云服务部署一个nacos太重,本地开发测试开nacos也比较重。

本人能读java源码又能写rust,分析确认开发可行性后,决定先写一个最小功能集给自己用。

自己写完后用下来整体体验很顺畅,就想开源出来给有需要的人使用。

最开始只兼容sdk 协议,没有配置控制台,后面补上控制台发才放出来。

适用场景

  1. 开发测试环境使用nacos,nacos服务可以换成rnacos。启动更快,秒启动。
  2. 个人资源云服务部署的 nacos,可以考虑换成rnacos。资源占用率低: 包10M 左右,不依赖 JDK;运行时 cpu 小于0.5% ,小于5M(具体和实例有关)。
  3. 其它非集群部署的 nacos ,理论上都支持迁移到 rnacos。
  4. 目前 rnacos 只支持单机部署,其支持容量在一万个服务实例以上。在一万服务实例场景下压测,qps可以稳定在1.3万左右,内存稳定在50 M以下,cpu稳定在33%左右(和压测环境有关)。

快速开始

一、 安装运行 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:stable
docker run --name mynacos -p 8848:8848 -p 9848:9848 -d qingpan/rnacos:stable

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、服务实例管理

功能说明

这里把 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 中,后继考虑支持其它中心数据库。

性能

压测环境与工具

压测环境:macos i7四核 /16G , 施压、受压机器是同一台机器(会拉低压测结果)。 压测工具: * wrk ,qps: 24450左右 * goose, qps 17000左右 (单进程加限流施压比 wrk低) * 单进程施压请求wrk比goose 输出高

rnacos server版本:v0.1.1 java nacos server版本: 2.1.0

因wrk,goose暂时不支持grpc协议,暂时只压测http协议接口

配置中心

配置中心,不会频繁更新,写入不做压测。

rust rnacos server:

  1. 配置中心单机查询 wrk 压测 qps 在2.4万左右.

java nacos server:

  1. 配置中心单机查询 wrk 压测, qps 在7700左右

注册中心

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万实例】

性能压测总结

  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。

后继计划

一、 对单机功能补全

  1. 配置中心
    1. 控制台支持导出
    2. 查询配置历史变更记录
    3. 支持历史记录回滚。
    4. 回滚时支持配置内容比较。
    5. 支持恢复发布,与 tag配置隔离 (优先级暂定晚于支持集群部署功能)
    6. 支持查询服务监听列表
  2. 注册中心 7. [ ] 支持服务路由类型的设置(这部分涉及插件,暂定不支持) 8. [ ] 支持查询服务监听列表

二、支持集群部署

  1. 配置中心数据支持 mysql 存储
  2. 注册中心支持集群
    1. 写路由
    2. 集群间的数据同步
  3. 其它
    1. 集群用户认证同步

rnacos架构图

前端应用因依赖nodejs,所以单独放到另一个项目 rnacos-console-web ,再通过cargo 把打包好的前端资源引入到本项目,避免开发rust时还要依赖nodejs。

You might also like...
A minimal ngrok liked reverse proxy implemented in Rust.

rok A minimal ngrok implementation in Rust, for educational purpose. This work is largely based on rathole, especially the very first commit. Other ho

Grow Rust is a Growtopia Private Server made in Rust

Grow Rust is a Growtopia Private Server made in Rust

Multiplex server for rust-analyzer, allows multiple LSP clients (editor windows) to share a single rust-analyzer instance per cargo workspace

ra-multiplex   Multiplex server for rust-analyzer, allows multiple LSP clients (editor windows) to share a single rust-analyzer instance per cargo wor

A telnet chat server written in Rust, running on Lunatic.
A telnet chat server written in Rust, running on Lunatic.

Lunatic.chat A telnet chat server written in Rust, running on Lunatic. If you just would like to try it out, join the hosted version with: # US server

server security proxy write by Rust

server-security-proxy server security proxy write by Rust how to use config toml file

Simple project to test grpc between ruby (client) and rust (server)

grpc-example Simple project to test grpc between ruby (client) and rust (server). Usage To simplify a lot this project uses docker and docker compose

A high performence Socks5 proxy server with bind/reverse support implementation by Rust.

rsocx A high performence Socks5 proxy server with bind/reverse support implementation by Rust Features Async-std No unsafe code Single executable Linu

Revolt backend API server, built with Rust.

Delta Description Delta is a blazing fast API server built with Rust for Revolt. Features: Robust and efficient API routes for running a chat platform

Network Block Storage server, written in Rust. Supports pluggable and chainable underlying storage

nbd-rs Disclaimer DO NEVER USE THIS FOR PRODUCTION Do not use this for any data that you cannot afford to lose any moment. Expect data loss, corruptio

Releases(v0.1.10)
Owner
heqingpan
heqingpan
Dav-server-rs - Rust WebDAV server library. A fork of the webdav-handler crate.

dav-server-rs A fork of the webdav-handler-rs project. Generic async HTTP/Webdav handler Webdav (RFC4918) is defined as HTTP (GET/HEAD/PUT/DELETE) plu

messense 30 Dec 29, 2022
axum-server is a hyper server implementation designed to be used with axum framework.

axum-server axum-server is a hyper server implementation designed to be used with axum framework. Features Conveniently bind to any number of addresse

null 79 Jan 4, 2023
Jex Compiler Server - Server that runs Jex code

Server that compiles and runs Jex code.

furetur 3 Nov 18, 2021
A simple web server(and library) to display server stats over HTTP and Websockets/SSE or stream it to other systems.

x-server-stats A simple web server(and library) to display server stats over HTTP and Websockets/SSE or stream it to other systems. x-server(in x-serv

Pratyaksh 11 Oct 17, 2022
QUIC proxy that allows to use QUIC to connect to an SSH server without needing to patch the client or the server.

quicssh-rs ?? quicssh-rs is a QUIC proxy that allows to use QUIC to connect to an SSH server without needing to patch the client or the server. quicss

Jun Ouyang 18 May 5, 2023
A µTP (Micro/uTorrent Transport Library) library implemented in Rust

rust-utp A Micro Transport Protocol library implemented in Rust. API documentation Overview The Micro Transport Protocol is a reliable transport proto

Ricardo Martins 134 Dec 11, 2022
A Constrained Application Protocol(CoAP) library implemented in Rust.

coap-rs A fast and stable Constrained Application Protocol(CoAP) library implemented in Rust. Features: CoAP core protocol RFC 7252 CoAP Observe optio

Covertness 170 Dec 19, 2022
Simple VPN implemented using rust

fubuki Simple VPN implemented using rust fubuki是类似与tincVPN的简单组网工具 不支持对等NAT 支持的平台: Windows Linux 工作机制 它由一台拥有公网IP的服务器来维持各个内网客户端的实际地址映射,在客户端和客户端之间实现P2P通信

XTY 84 Dec 31, 2022
TeleMQ is an experimental MQTT broker implemented in Rust language.

TeleMQ TeleMQ is an experimental MQTT broker implemented in Rust language. The broker implements MQTT version 3.1.1 specification. License This projec

null 12 Dec 27, 2022
A generic Rust based Bigtable connection library implemented using gRPC

A generic Rust based Bigtable connection library refactored out the solana mono-repo so that can be shared for different applications.

Lijun Wang 3 Sep 25, 2022