1. 引言
很多同学了解 r-nacos 特性后最开始只将 r-nacos 用于开发测试环境。
经过一段时间的使用后,部分同学有打算生产环境也从 nacos 迁移到 r-nacos。
一些之前使用 nacos 服务的同学了解 r-nacos 后打算从 nacos 迁移到 r-nacos。
那么如何平衡地从 nacos 迁移到 r-nacos 呢?
提醒
r-nacos 简介:
① r-nacos 是一个用 rust 实现的 nacos 服务。相较于 java nacos 来说,是一个提供相同功能,启动更快、占用系统资源更小(初始内存小于 10 M)、性能更高、运行更稳定的服务。
② r-nacos 设计上完全兼容最新版本 nacos 面向 client sdk 的协议(包含 1.x 的 http OpenApi,和 2.x 的 grpc 协议), 支持使用 nacos 服务的应用平迁到 r-nacos。
2. 迁移计划
2.1 待迁移内容分析
迁移的目标已明确,在设计迁移计划前,我们需要先分析待迁移的数据。

从 nacos 迁移到 r-nacos 主要涉及 4 类数据:
- nacos 鉴权用户数据
- 命名空间数据
- 配置数据
- 服务实例数据
nacos 用户数据、命名空间数据与配置数据是持久化数据,需要事先完成设置与迁移。 服务实例数据是动态数据,切换后应该会自动注册,不需要事先迁移。
2.2 迁移阶段与步骤
我们可以把迁移分为 3 个阶段:
- 迁移前准备阶段;
- 迁移阶段;
- 迁移后收尾阶段;
一、迁移前准备

- 部署 r-nacos,用于迁移前做数据迁移与数据录入。(如果 nacos 与 r-nacos 在同一台机器,可以用临时端口号启动 r-nacos,等迁移时再更新端口号重启)
- 在 r-nacos 控制台录入应用依赖的用户信息,完成用户数据初始化。
- 在 r-nacos 控制台录入命名空间数据;
- 从 nacos 控制台按命名空间全量导出数据(每个命名空间会导出一个文件);然后分别把这部分配置数据通过 r-nacos 控制台导入对应命名空间中,完成配置数据迁移。
二、迁移中
数据迁移完成后即可开始切流迁移。

把应用请求流量切到 r-nacos 中,这一步不同的场景需要用不同的处理方式:
提醒
- ① 应用直接请求 nacos 服务场景:r-nacos 需要和 nacos 在同一个机器替换它;需要先关闭 nacos,再把 r-nacos 的端口改成原 nacos 端口启动,完成切换。
- ② 应用请求 nginx 后反向代理到 nacos 场景:更新 nginx 配置,把 nacos 反向代理地址更新为 r-nacos 地址,然后重新增加配置完成切换。
切流迁移完成后,注意观察应用与 r-nacos 的表现是否符合预期。
注意
就算目标是要开启鉴权,这个阶段 r-naocs 也不要启接口鉴权 ( RNACOS_ENABLE_OPEN_API_AUTH=false ),以防应用使用原 nacos 分配旧 token 请求被拦截。
三、迁移后收尾

完成迁移稳定运行一小段时间后,可以将 nacos 移除,只保留 r-nacos。
如果需要对接口开启鉴权,则走以下操作:
提醒
- ① 等应用旧 token 都过期 (默认过期时间是 5 小时) 都重新从 r-nacos 获取新 token 之后,再开启接口鉴权配置重启 r-nacos(r-nacos 可以秒级重启,应用几乎无感)。
- ② 也可以分批重启应用强行其使用 r-nacos token,之后再开启接口鉴权配置重启 r-nacos。
至此完成从 nacos 迁移到 r-nacos
3. 迁移案例
前面讲的是迁移操作步骤可能比较抽象,这里再补充两个具体迁移场景案例让读者更有体感。
3.1 应用服务直链单节点 nacos 的场景迁移方案
部署图:

nacos 持久化内容:

提醒
nacos 使用情况:
- ① 在 10.0.24.9 部署一台 nacos,使用默认端口号 8848,8948 提供服务。
- ② nacos 上设置两个命名空间 pre、prod 分别对预发、生产环境提供服务。
- ③ 有 3 个应用,每个应用 2 个实例使用 nacos 服务;总共两套环境,其中一套环境共有 3 个配置文件,3 个服务,6 个实例。
- ④ 应用使用的用户名:
xxx_app_id,密码:a07a6deb5e56
目标:在同一台机器中部署 r-nacos 替换 nacos 提供服务,使用 systemd 方式部署
3.1.1 迁移步骤——迁移前
步骤 1 、在 10.0.24.9 使用临时端口 8858 部署 r-nacos。 这里假设使用 linux systemd 方式部署。具体部署方式参考 r-nacos 说明文档,这里不展开。 关键配置项如下:
# r-nacos 监听 http 端口,这里使用临时端口 8858,后面切流时调整回来
RNACOS_HTTP_PORT=8858
# r-nacos 监听 grpc 端口,grpc 端口这里不配置,默认值:HTTP 端口 +1000
# RNACOS_GRPC_PORT=9858
# r-nacos 独立控制台端口,这个没有端口冲突,可以直接使用正式端口
RNACOS_HTTP_CONSOLE_PORT=10848
RNACOS_ENABLE_OPEN_API_AUTH=false2
3
4
5
6
7
注:如果是 docker 启动方式,配置端口不用改,只需改对应对外映射的端口号即可
步骤 2 、初始化用户信息 访问 http://10.0.24.9:10848/rnacos/ 进入控制台。 增加应用依赖用户,用户名: xxx_app_id ,密码:`a07a6deb5e56

步骤 3、初始化命名空间
初始化命名空间 pre、prod

步骤 4、迁移配置信息
- 从 nacos 导出配置

分别导出 pre、prod 命名空间下的配置

导出的文件名格式为: nacos_config_export_20240721230938.zip
注意:每次导出后记得改下文件名增加命名空间标记,以防导入时选错文件。
- 把配置导入 r-nacos 分别把上一步 nacos 导出的配置文件包导出到 r-nacos pre、prod 命名空间下的配置。
a) 进入 r-nacos 控制台->配置列表页,选择对应命名空间

b) 上传导入配置文件
导入后: 
上面图中操作的是 pre 命名空间,prod 命名空间也操作一遍,这里不展开。
3.1.2 迁移步骤——迁移中
步骤 5、完成数据初始化后关闭 r-nacos,先把临时端口更新正式端口,方便后面可以直接启动 r-nacos。
关闭 r-nacos 服务
systemctl stop rnacos关键配置项如下:
properties
# r-nacos监听http端口
RNACOS_HTTP_PORT=8848
# r-nacos监听grpc端口,grpc端口这里不配置,默认值:HTTP端口+1000
# RNACOS_GRPC_PORT=9848
# r-nacos独立控制台端口
RNACOS_HTTP_CONSOLE_PORT=10848
# 切换过程中不开启接口鉴权
RNACOS_ENABLE_OPEN_API_AUTH=false2
3
4
5
6
7
8
9
步骤 6、关闭 nacos
# 切换到nacos目录,执行以下命名关闭nacos
./bin/shutdown.sh2
步骤 7、启动 r-nacos
配置信息在关闭 nacos 前已准备好,直接启动 r-nacos 服务:
systemctl start rnacos3.1.3 迁移步骤——迁移后
步骤 8、切流完成,观察应用与 r-nacos 确认其是否正常工作。
应用服务可通过上游应用页面访问看看是否正常。 r-nacos 可能通过监控页面查询其是否被应用访问。

步骤 9、开启 r-nacos 接口鉴权(可选)
切流完成后过 5 个小时之后,开启 r-nacos 接口鉴权。
关键配置项如下:
properties
# r-nacos监听http端口
RNACOS_HTTP_PORT=8848
# r-nacos监听grpc端口,grpc端口这里不配置,默认值:HTTP端口+1000
# RNACOS_GRPC_PORT=9848
# r-nacos独立控制台端口
RNACOS_HTTP_CONSOLE_PORT=10848
# 开启接口鉴权
RNACOS_ENABLE_OPEN_API_AUTH=true2
3
4
5
6
7
8
9
重启 r-nacos 服务:
systemctl start rnacos至此,完成从 nacos 到 r-nacos 的迁移
3.2 应用服务通过 nginx 链接 nacos 场景迁移方案
部署图:

nacos 内容和前一个场景一样,部署时中间多用了 nginx 代理提供服务。
通过 nginx 链接 nacos,那么切换时只需要把 nginx 配置中原 nacos 地址切换为 r-naocs 地址,然后通过 nginx -s reload 重新加载配置规则即可完成切流。
3.2.1 迁移步骤——迁移前
步骤和前一个场景第 1、2、3、4 步一致,这里不展开。
3.2.2 迁移步骤——迁移中
步骤 5、更新 nginx 配置,把原 nacos 地址切换为 r-naocs 地址。
原 nginx 配置
http {
# nacos http , 走http反向代理
server {
listen 8848;
listen [::]:8848;
server_name localhost;
location /nacos {
proxy_pass http://10.0.24.9:8848;
proxy_set_header Host $proxy_host;
proxy_set_header Connection "";
proxy_http_version 1.1;
}
}
}
stream {
# nacos grpc , 走tcp反向代理
server {
listen 9848;
proxy_pass http://10.0.24.9:9848;
proxy_connect_timeout 5s;
proxy_timeout 20s;
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
更新后的 nginx 配置
http {
# nacos http , 走http反向代理
server {
listen 8848;
listen [::]:8848;
server_name localhost;
location /nacos {
proxy_pass http://10.0.24.9:8858;
proxy_set_header Host $proxy_host;
proxy_set_header Connection "";
proxy_http_version 1.1;
}
}
}
stream {
# nacos grpc , 走tcp反向代理
server {
listen 9848;
proxy_pass http://10.0.24.9:9858;
proxy_connect_timeout 5s;
proxy_timeout 20s;
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
执行 nginx -s reload 重新加载配置规则即可完成切流。
切换后:

3.2.3 迁移步骤——迁移后
步骤和前一个场景第 8、9 步一致,这里不展开。
总结
对于 nacos 迁移到 r-nacos,分析待迁移数据项与划分好迁移各个阶段需要做的事项,可以设计出合适的迁移方案。
迁移可分在迁移前、迁移中、迁移后三个阶段,本文结合样例场景给出了较具体操作步骤。
如果上面的案例和自己的实际情况一致,可以考虑应用请求 nacos 前加一层 nginx 反向代理,之后再按案例 2 迁移即可。
时间:2024-07-22
作者: heqingpan