升级 Nacos 1.x 到 2.0 最稳妥的方案是先升级服务端并开放新增的 gRPC 端口,再分批升级客户端 SDK,适合大多数生产环境平滑过渡。
先说结论:Nacos 2.0 通信协议从 HTTP 变为 gRPC,必须同时调整服务端端口配置和客户端 SDK 版本,否则服务发现或配置监听会失效。
- 适合: 需要长连接支持、追求更低延迟的生产环境集群。
- 前置要求:JDK 8 及以上,防火墙放行 9848 和 9849 端口,备份 data 目录。
- 验收: 客户端日志无连接报错,控制台能看到健康实例。
环境前置要求
1. JDK 版本
Nacos 2.0 服务端和客户端 SDK 均要求 JDK 8 或更高版本(推荐 JDK 8/11)。升级前请执行 java -version 确认环境,避免启动失败。
2. 数据库建议
生产环境建议使用外部 MySQL 数据库存储配置和服务信息。若使用嵌入式 Derby 数据库,升级前务必备份 data 目录,防止数据丢失。
3. 端口规划
除原有 8848 端口外,必须确保 9848(客户端 gRPC)和 9849(服务端集群同步)端口未被占用且防火墙已放行。
核心配置与依赖
1. 客户端依赖升级(Maven 示例)
将 Spring Cloud Alibaba 依赖升级至支持 Nacos 2.0 的版本。以下为例示版本,具体请参考官方兼容性矩阵:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.0</version>
</dependency>2. 客户端连接配置
在 application.yml 中确认地址配置,2.0 版本客户端会自动识别 gRPC 端口(主端口 +1000),无需额外配置 gRPC 地址:
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848
namespace: your-namespace-id3. 服务端关键配置
检查 conf/application.properties,确保端口配置未被修改。gRPC 端口默认基于主端口计算,无需额外配置,但需确认 server.port=8848 未被冲突占用。
服务端升级步骤
1. 停止服务与备份
停止现有 Nacos 服务。备份整个安装目录,特别是 conf 配置文件和 data 数据目录(嵌入式数据库场景)。
2. 部署新版本
下载 Nacos 2.x 安装包,解压覆盖原有程序文件。注意: 不要覆盖原有的 conf/application.properties 和 conf/cluster.conf,保留原有配置。
3. 检查 JVM 参数
编辑 bin/startup.sh 或 startup.cmd,确认 JVM 内存参数(Xms/Xmx)满足生产需求,默认值可能偏小。
4. 启动与观察
启动服务端,观察 logs/start.out 确认无报错,且监听端口包含 9848/9849。
怎么验证是否生效
1. 端口监听检查
在服务端执行以下命令,确认三个端口均处于监听状态:
netstat -tunlp | grep -E "8848|9848|9849"
2. 客户端日志验证
客户端启动日志中应出现 "Nacos Client 2.0" 或 gRPC 连接成功标识,不应频繁出现 "Connection refused" 或 HTTP 超时错误。
3. 控制台健康检查
登录 Nacos 控制台,查看服务列表,确认实例状态为 "健康",且最后心跳时间是在最近几秒内更新。
常见坑与排查
1. 防火墙遗漏新端口
运维习惯只开放 8848,升级 2.0 后忘记开放 9848/9849,导致客户端能连通 HTTP 接口但无法建立 gRPC 长连接,表现为注册不上。
2. 嵌入式数据丢失
直接覆盖安装未备份 data 目录,导致原有配置和服务信息丢失。生产环境强烈建议迁移至 MySQL。
3. 客户端版本混杂
同一集群内如果存在 1.x 和 2.x 的客户端混用,1.x 客户端可能无法正常工作,建议统一升级。
4. 负载均衡配置未更新
如果在 Nacos 前端挂了负载均衡器(如 Nginx),需要确认负载均衡策略是否支持 gRPC 长连接透传,否则可能导致连接中断。
参考来源
- Nacos 官方 GitHub 仓库,Release Notes 页面,https://github.com/alibaba/nacos/releases
- Nacos 官方文档,2.0 升级指南,https://nacos.io/zh-cn/docs/upgrade.html