rnacos——用rust重新实现的nacos开源配置注册中心服务
Posted 拾玄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rnacos——用rust重新实现的nacos开源配置注册中心服务相关的知识,希望对你有一定的参考价值。
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 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 的用户指南。
三、控制台管理
启动服务后可以在浏览器通过 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 gitee, 欢迎共建PR。
希望用使用nacos场景的开发的同学可以试用 rnacos,如果过程中发现问题可以到 github 提Issues。
如果对你有帮忙就给个star 鼓励鼓励
超赞!用阿里开源的Nacos做SpringCloud注册中心真贴心...
# 什么是 Nacos?
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
Kubernetes Service
gRPC & Dubbo RPC Service
Spring Cloud RESTful Service
Nacos 的关键特性包括:
服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
Nacos 全景图
阿里巴巴中间件团队出品的Nacos来作为新一代的服务管理中间件。
# Nacos Spring Cloud 快速开始
安装nacos
下载完成之后,解压。根据不同平台,执行不同命令,启动单机版Nacos服务:
Linux/Unix/Mac:sh startup.sh -m standalone
Windows:cmd startup.cmd -m standalone
startup.sh脚本位于Nacos解压后的bin目录下。
启动之后 nacos默认端口为8848
补充一点,nacos不仅可以做注册中心,还可以做分布式配置,相对SpringCloud 在git做配置较好点
# 构建应用接入Nacos注册中心
在完成了Nacos服务的安装和启动之后,下面我们就可以编写两个应用(服务提供者与服务消费者)来验证服务的注册与发现了。
服务提供者
1、创建第一个Springboot项目 spring-cloud-nacos-provider 作为服务提供者
2、引入gradle
compile 'org.springframework.boot:spring-boot-starter-actuator'
compile 'org.springframework.boot:spring-boot-starter-web'
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '0.1.1.RELEASE'
注意:这里之前确实采坑,因为nacos是新生态所以无法自动和cloud或boot版本
一致,所以必须写入版本号,版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版
本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。
3、创建主要类
启动入口
package org.gw;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @DATA 2019-03-18 15:21
* @Author 张国伟 WeChat:17630376104
* @Description TODO
*/
public class NoApplication {
public static void main(String[] args) {
SpringApplication.run(NoApplication.class,args);
}
}
public class NacosProducerController {
public String hello( String name)
{
return "hello::"+name;
}
}
内容非常简单,@SpringBootApplication定义是个Spring Boot应用;@EnableDiscoveryClient开启Spring Cloud的服务注册与发现,由于这里引入了spring-cloud-starter-alibaba-nacos-discovery模块,所以Spring Cloud Common中定义的那些与服务治理相关的接口将使用Nacos的实现。这点不论我们使用Eureka、Consul还是其他Spring Cloud整合的注册中心都一样,这也是Spring Cloud做了封装的好处所在
4、配置文件
server:
port: 5005
spring:
application:
name: spring-cloud-nacos-provider
cloud:
nacos:
discovery:
127.0.0.1:8848 :
management:
endpoints:
web:
exposure:
include: '*'
5、启动应用程序,启动后可以看到控制台日志出现以下内容说明已经成功注册到nacos中。
Wed Mar 20 08:59:13 CST 2019 sun.misc.Launcher$AppClassLoader@18b4aac2 JM.Log:INFO Log root path: /Users/mac/logs/
Wed Mar 20 08:59:13 CST 2019 sun.misc.Launcher$AppClassLoader@18b4aac2 JM.Log:INFO Set nacos log path: /Users/mac/logs/nacos
2019-03-20 08:59:13.438 INFO 1645 --- [ main] o.s.c.a.n.registry.NacosServiceRegistry : nacos registry, spring-cloud-nacos-provider 172.20.10.3:5005 register finished
在启动都ok之后,我们可以访问Nacos的管理页面http://127.0.0.1:8848/nacos/来查看服务列表,此时可以看到如下内容:
这里会显示当前注册的所有服务,以及每个服务的集群数目、实例数、健康实例数。点击详情,我们还能看到每个服务具体的实例信息,如下图所示:
服务消费者
接下来,实现一个应用来消费上面已经注册到Nacos的服务。
1、创建一个Spring Boot应用,命名为:spring-cloud-nacos-consumer。
2、编辑pom.xml中的依赖内容,与上面服务提供者的一样即可。
3、创建应用主类,并实现一个HTTP接口,在该接口中调用服务提供方的接口。
package org.gw;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @DATA 2019-03-18 15:45
* @Author 张国伟 WeChat:17630376104
* @Description TODO
*/
public class ConApplication
{
public RestTemplate resultTemplate()
{
RestTemplate template = new RestTemplate();
return template;
}
public static void main(String[] args)
{
SpringApplication.run(ConApplication.class, args);
}
}
package org.gw.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @DATA 2019-03-18 16:06
* @Author 张国伟 WeChat:17630376104
* @Description TODO
*/
public class ConController {
RestTemplate restTemplate;
/**
* 消费服务
*/
public String services( String name) {
String callServiceResult = restTemplate.getForEntity("http://spring-cloud-nacos-provider/hello?name="+name,String.class).getBody();
System.out.println(callServiceResult);
return callServiceResult;
}
}
server:
port: 5006
spring:
application:
name: spring-cloud-nacos-consumer
cloud:
nacos:
discovery:
127.0.0.1:8848 :
management:
endpoints:
web:
exposure:
include: '*'
第五步:启动服务消费者,我们在浏览器测试:
到此nacos单机版的服务与发现就完全实现。
本文章示例:https://github.com/zgw1469039806/SpringCloud-nacos
本文参考:http://blog.didispace.com/spring-cloud-alibaba-1/
来源:https://www.cnblogs.com/zgwjava/p/10562775.html
往期推荐
以上是关于rnacos——用rust重新实现的nacos开源配置注册中心服务的主要内容,如果未能解决你的问题,请参考以下文章