Alanxtl opened a new issue, #3693:
URL: https://github.com/apache/dubbo-go/issues/3693

   ## 背景
   
   当前 dubbo-go 仍直接依赖几项已经可以由 Go 标准库或活跃维护实现替代的基础组件。这些依赖本身并不是 Dubbo 
协议的一部分,继续保留会增加依赖树、维护成本和新项目脚手架中的历史依赖。
   
   本 issue 聚焦以下四项迁移:
   
   - `github.com/hashicorp/vault/sdk/helper/jsonutil`
   - `github.com/modern-go/concurrent`
   - `github.com/golang/mock`
   - `go.uber.org/atomic` → `sync/atomic`
   
   ZooKeeper 相关迁移不在本 issue 范围内。
   
   ## 1. Vault jsonutil → encoding/json
   
   ### 当前使用位置
   
   `registry/etcdv3/service_discovery.go` 使用:
   
   - `jsonutil.EncodeJSON`
   - `jsonutil.DecodeJSON`
   
   ### 修改要求
   
   1. 使用 `encoding/json` 替换 Vault SDK 的 JSON helper。
   2. `EncodeJSON` 可替换为 `json.Marshal` 或 `json.Encoder`。
   3. `DecodeJSON` 不要简单地无条件替换为 `json.Unmarshal`,需要确认并保留当前对数字类型的处理语义,必要时使用:
      ```go
      decoder := json.NewDecoder(reader)
      decoder.UseNumber()
      ```
   4. 确认 etcd 中保存的是普通 JSON,不需要兼容 Vault jsonutil 的压缩 canary 
逻辑;如果历史数据存在该格式,需要增加兼容读取或明确迁移策略。
   5. 删除 `github.com/hashicorp/vault/sdk` 的直接依赖,并执行 `go mod tidy`。
   
   ### 验收标准
   
   - 注册、注销、服务实例变更、事件恢复测试通过。
   - JSON 中整数、浮点数、空值和未知字段的行为保持兼容。
   - 不再有生产代码 import Vault `jsonutil`。
   
   ## 2. modern-go/concurrent → sync.Map
   
   ### 当前使用位置
   
   - `filter/exec_limit/filter.go`
   - `filter/tps/limiter/method_service.go`
   
   当前主要使用 `NewMap`、`Load` 和 `LoadOrStore`。
   
   ### 修改要求
   
   1. 将字段类型改为 `sync.Map` 或 `*sync.Map`。
   2. 将 `concurrent.NewMap()` 替换为标准库零值初始化:
      ```go
      var states sync.Map
      ```
   3. 保留现有 `LoadOrStore` 的并发初始化语义。
   4. 检查类型断言、状态对象生命周期和清理逻辑,避免迁移后出现 panic 或数据竞争。
   5. 删除 `github.com/modern-go/concurrent` 的直接依赖。
   
   ### 验收标准
   
   - exec-limit 和 TPS limiter 的并发测试通过。
   - 增加或保留针对并发首次初始化的测试。
   - `go test -race` 通过相关 package。
   - 生产代码不再 import `github.com/modern-go/concurrent`。
   
   ## 3. github.com/golang/mock → go.uber.org/mock
   
   Google 已不再维护原 `golang/mock` 项目,建议迁移到活跃维护的 `go.uber.org/mock`。
   
   ### 修改要求
   
   1. 将测试代码中的:
      ```go
      github.com/golang/mock/gomock
      ```
      替换为:
      ```go
      go.uber.org/mock/gomock
      ```
   2. 将 `mockgen` 工具替换为:
      ```bash
      go install go.uber.org/mock/mockgen@latest
      ```
      CI 或 Makefile 中应固定版本,不要依赖不受控的 latest。
   3. 更新所有 `go:generate mockgen` 指令。
   4. 使用新版本 `mockgen` 重新生成仓库中的 mocks,不要手工修改生成文件。
   5. 删除 `github.com/golang/mock` 的直接依赖,并执行 `go mod tidy`。
   6. 同步更新 `tools/dubbogo-cli` 脚手架中可能嵌入的旧 mock 依赖记录。
   
   ### 验收标准
   
   - 所有生成 mock 可以重新生成且 diff 稳定。
   - 测试代码不再 import `github.com/golang/mock`。
   - `go generate`、`go test ./...` 通过。
   - 不改变现有 mock 的行为和测试断言。
   
   ## 4. go.uber.org/atomic → sync/atomic
   
   ### 修改要求
   
   1. 将 `go.uber.org/atomic` 的类型迁移到 Go 标准库 `sync/atomic` 的类型化 API,例如:
      - `atomic.Bool`
      - `atomic.Int32`
      - `atomic.Int64`
      - `atomic.Uint32`
      - `atomic.Uint64`
      - `atomic.Pointer[T]`
   2. 将 `atomic.NewXXX(...)` 构造方式改为标准库类型的零值或显式初始化。
   3. 逐处检查 `Load`、`Store`、`Swap`、`CompareAndSwap` 等方法的返回值和类型差异。
   4. 重点检查结构体中的 atomic 字段:标准库类型在首次使用后不能被复制,应避免值拷贝,并运行 `go vet` 检查 copylocks。
   5. 迁移完成后删除 `go.uber.org/atomic` 的直接依赖。
   
   ### 验收标准
   
   - 保留现有原子读写、CAS 和零值行为。
   - 相关 shutdown、server、remoting、registry 和 filter 测试通过。
   - 关键并发 package 的 `go test -race` 通过。
   - 生产代码不再 import `go.uber.org/atomic`。
   
   ## 总体验收标准
   
   - 四个旧依赖均不再被生产代码或测试代码直接 import。
   - `go.mod` 中移除不再需要的直接依赖,`go mod tidy` 后无异常依赖回流。
   - `go test ./...` 通过。
   - 相关 package 的 `go test -race` 通过。
   - `go vet ./...` 通过。
   - `tools/dubbogo-cli` 生成的新项目不再带入这些旧依赖。
   - 不改变 Dubbo 协议、注册发现和测试 mock 的对外行为。
   
   建议拆分为一个或多个 PR,优先顺序为:
   
   1. `modern-go/concurrent` → `sync.Map`
   2. Vault `jsonutil` → `encoding/json`
   3. `github.com/golang/mock` → `go.uber.org/mock`
   4. `go.uber.org/atomic` → `sync/atomic`
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to