GitHub user AlexStocks added a comment to the discussion: nacos-go-sdk 从 v2 升级到 v3
补充: 从 `apache/dubbo-go` 主仓开始升级,再用 `dubbo-go-samples` 做验证层”的思路,从零写一版完整方案。 先给结论:**这不是 sample 的升级文档,而是 dubbo-go 对 Nacos 3.x 的兼容改造与验证方案**。样例只负责证明主仓改造后的行为是对的,不应该反过来主导方案。 **升级目标** 把 `apache/dubbo-go` 当前基于 `nacos-sdk-go/v2` 的注册中心、配置中心、元数据报告能力,升级成一套能稳定对接 Nacos 3.x 的实现,并给出可回滚、可验证、可分阶段发布的落地路径。 **当前基线** 仓库里现在已经在用 `github.com/nacos-group/nacos-sdk-go/v2 v2.2.5`,而且 `RegistryConfig` 已经具备 `username/password/namespace/accessKey/secretKey` 这些透传字段,`registry/nacos/registry.go` 也已经把这些参数映射进 Nacos 客户端初始化流程。所以这次升级的重点不是“从零接入 Nacos”,而是“把现有接入改造成可稳定支持 Nacos 3.x 的形态”。 参考:[go.mod](D:\test\github\dubbo-go\go.mod:38),[config/registry_config.go](D:\test\github\dubbo-go\config\registry_config.go:43),[registry/nacos/registry.go](D:\test\github\dubbo-go\registry\nacos\registry.go:141) **推荐路径** 我建议走下面这条主线: 1. 先锁定兼容边界,不先动 sample。 2. 在 `apache/dubbo-go` 中梳理所有 Nacos 入口,明确 registry、config center、metadata report 三条链路各自是否受影响。 3. 补齐 Nacos 3.x 的环境约束、鉴权约束、数据库约束和回滚约束。 4. 先做兼容性改造和自动化测试,再让 samples 做集成验收。 5. 最后再决定是否需要单独升级 SDK 版本。 **为什么不是先从 samples 开始** 因为 samples 只能暴露“现象”,不能定义“能力边界”。真正的升级风险在主库里: - 注册/订阅的生命周期管理 - 鉴权参数透传 - 命名空间和分组兼容 - 监听器和重试逻辑 - 元数据和配置中心是否一起受影响 这些都在 `apache/dubbo-go` 里,不在 samples 里。 **方案正文** ### 1. 升级目标版本与范围 先明确目标不是“所有 3.x 都一次性覆盖”,而是“以业务实际准备上线的 Nacos 3.x 小版本为目标,先完成主干兼容,再做版本回归”。 范围建议分三层: - 第一层:注册中心 `nacos` 兼容 - 第二层:配置中心 `nacos` 兼容 - 第三层:元数据上报/发现链路兼容 如果你们当前只用了注册中心,第二层和第三层可以作为后续波次,但必须在方案里显式写明,不要默认跳过。 ### 2. 前置调研与风险确认 这一阶段只做事实确认,不改代码。 要确认四件事: - Nacos 3.x 目标版本号 - 是否启用鉴权 - 是否共用数据库 - 是否启用配置中心和 metadata center 官方文档明确说明:Nacos 3.x server 与 2.x client 是兼容的;同时 Nacos 3.x 的客户端鉴权开关默认是 `false`,但控制台鉴权默认是开启的。也就是说,升级方案不能把“控制台能登录”和“客户端能注册”混为一谈。 参考:[Nacos 升级手册](https://nacos.io/en/docs/latest/manual/admin/upgrading/),[Nacos 权限校验](https://nacos.io/docs/v3.0/manual/admin/auth/) ### 3. 主仓改造项 这部分才是方案核心。 #### 3.1 配置透传与初始化校验 检查并补强 `RegistryConfig` 到 Nacos 客户端的映射,至少覆盖: - namespace - username/password - accessKey/secretKey - timeout - group - registry type 目标不是简单“能传进去”,而是: - 参数缺失时有明确报错 - 参数冲突时能在启动期失败 - 不要把认证失败包装成模糊的注册失败 #### 3.2 注册与订阅生命周期 重点核查 `registry/nacos/registry.go` 里的几个行为: - 注册后是否有完整注销路径 - 订阅失败后的重试是否会泄露 goroutine - `Destroy()` 是否会正确关闭监听器、关闭 client、等待退出 - `IsAvailable()` 的缓存逻辑在 Nacos 3.x 下是否会导致假阳性或假阴性 这部分不一定要改接口,但必须做针对性回归,因为 Nacos 3.x 的连接、心跳、鉴权失败表现,往往会直接暴露在这里。 #### 3.3 命名空间和分组语义 如果升级涉及 config center,就必须补一段关于 namespace 迁移的说明。Nacos 3.0 对 config namespace 做过兼容和迁移处理,默认存在兼容模式,且关闭后无法再平滑降级。 这意味着方案里要写清楚: - 是否允许 `public` 和空 namespace 并存 - 是否要先做 namespace 数据迁移 - 是否允许关闭兼容模式 - 如何验证迁移完成 参考:[Nacos 升级手册](https://nacos.io/en/docs/next/manual/admin/upgrading/) ### 4. 数据库与环境准备 这是原方案最容易写虚的地方,我建议写得硬一点。 #### 4.1 数据库策略 不要把 v2 和 v3 放在同一个数据库实例里做首次验证。建议: - v2 保持原库,冻结不动 - v3 使用独立数据库或独立备份恢复出来的库 - 首次升级前先做 schema diff - 先验证升级脚本,再验证业务数据迁移 如果必须共库,那就必须写清楚: - 回滚点 - 备份策略 - 恢复步骤 - 哪些表可以回退,哪些不能回退 #### 4.2 鉴权策略 分成两条线写: - 控制台鉴权 - 客户端鉴权 验证时要明确: - 是否开启客户端鉴权 - `username/password` 是否必须配置 - 未配置时是否应当启动失败 - 密钥和 token secret 是否由谁管理 不要把“能打开控制台”当成“客户端可用”。 ### 5. 测试矩阵 这部分建议写成验收清单,不要只写“跑 demo”。 #### 5.1 必测项 - Provider 注册成功 - Consumer 能发现实例 - RPC 调用成功 - 实例心跳稳定 - Nacos 重启后可恢复 - 服务重启后可恢复 - 网络抖动后可恢复 - 鉴权开启时可正常注册/发现 - 鉴权关闭时行为符合预期 - 订阅和反订阅不会泄露资源 #### 5.2 稳定性项 - 长稳运行至少 24h - 高并发注册/发现/调用 - 频繁上下线场景 - 重试风暴场景 - 客户端短暂不可达恢复场景 #### 5.3 回归项 - `dubbo-go-samples` 中所有受 Nacos 影响的 demo - registry demo - config center demo - metadata 相关 demo - 你们实际业务依赖的最小链路 demo ### 6. 发布与回滚 这是必须单独成节的内容。 #### 发布策略 建议分三步: 1. 开发环境验证 2. 测试环境双跑 v2/v3 3. 预发灰度 4. 生产切换 #### 回滚策略 回滚不能只写“切回 v2”。 要明确: - 数据库是否可回滚 - 业务配置是否可回滚 - 客户端是否支持双注册 - 配置切换是否只改一个入口 - 回滚后是否要清理 v3 侧数据 如果数据库已经做了不可逆迁移,那就不能写“秒级回滚”,这会误导评审。 ### 7. 验收标准 这版方案的验收标准我建议直接写成硬条件: - 主仓中 Nacos 相关链路在 Nacos 3.x 下通过自动化测试 - 注册、发现、调用、订阅、反注册都稳定 - 鉴权配置明确,失败路径可解释 - 数据库迁移步骤可复现 - 回滚路径可执行 - samples 验证结果与主仓结论一致 **我对这版方案的建议结论** 这次升级的主战场应当是 `apache/dubbo-go`,不是 samples。samples 只能放在最后做“验收场”,不能当成升级起点。真正要把方案写实,就要把“兼容边界、数据库策略、鉴权策略、生命周期、回滚”这五件事写死。 GitHub link: https://github.com/apache/dubbo-go/discussions/3318#discussioncomment-16826435 ---- This is an automatically sent email for [email protected]. To unsubscribe, please send an email to: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
