Golang 模块

etcd 项目 Golang 模块的组织结构

etcd 项目(自 3.5 版本起)被划分为多个 Golang 模块,托管在同一个 代码仓库 中。

modules graph

目前包含以下模块:

  • go.etcd.io/etcd/api/v3 - 包含 API 定义(如 Protobuf 及其生成的库),用于定义 etcd 客户端与服务器之间的通信协议。

  • go.etcd.io/etcd/pkg/v3 - 收集了 etcd 使用但不专属于 etcd 的通用工具包。只有当一个包未来有可能独立拆分为单独的仓库时,才应放在此处。请避免在此添加依赖较多的代码,因为这些依赖会自动成为客户端库的依赖(我们希望保持客户端库轻量化)。

  • go.etcd.io/etcd/client/v3 - 用于通过网络(gRPC)连接 etcd 的客户端库。推荐所有新项目使用此库。

  • go.etcd.io/etcd/client/v2 - 通过 HTTP 协议连接 etcd 的旧版客户端库。已弃用。所有新项目都应依赖 /v3 版本的库。

  • go.etcd.io/etcd/raft/v3 - 分布式共识协议的实现。不应包含任何 etcd 特有的代码。

  • go.etcd.io/etcd/server/v3 - etcd 的核心实现。该包中的代码属于 etcd 内部实现,不应被外部项目直接使用。其包结构和 API 可能在小版本间发生变化。

  • go.etcd.io/etcd/etcdctl/v3 - 用于访问和管理 etcd 的命令行工具。

  • go.etcd.io/etcd/tests/v3 - 包含 etcd 所有集成测试的模块。注意:所有单元测试(快速且无需跨模块依赖)应保留在被测代码所在模块的本地。

  • go.etcd.io/bbolt - 持久化 B 树的实现。托管在独立的仓库中:https://github.com/etcd-io/bbolt

运维

  1. 所有 etcd 模块应以相同版本发布,例如 go.etcd.io/etcd/client/v3@v3.5.10 必须依赖于 go.etcd.io/etcd/api/v3@v3.5.10

    可通过以下方式统一更新版本:

    % DRY_RUN=false TARGET_VERSION="v3.5.10" ./scripts/release_mod.sh update_versions
    
  2. 发布的模块应根据 https://golang.org/ref/mod#vcs-version 规则打标签,即每个模块都应拥有自己的标签。可使用以下方式完成标签操作:

    % DRY_RUN=false REMOTE_REPO="origin" ./scripts/release_mod.sh push_mod_tags
    
  3. 所有 etcd 模块应依赖相同版本的底层依赖。可通过以下方式验证:

    % PASSES="dep" ./test.sh
    
  4. go.mod 文件不得包含未使用的依赖,并必须符合 go mod tidy 的格式要求。这将通过以下方式验证:

    % PASSES="mod_tidy" ./test.sh
    
  5. 若需在所有模块上触发操作(例如自动格式化所有文件),请使用或扩展以下脚本:

    % ./scripts/fix.sh
    

未来

作为长远目标,我们希望将 etcd 模块向以下模型演进:

modules graph

这需要满足以下假设:

  • 将 etcdmigrate/etcdadm 从 etcdctl 二进制文件中分离出来。这样 etcdctl 将明确成为一个围绕网络客户端 API 的命令行封装工具,而 etcdmigrate/etcdadm 则专注于对 etcd 存储文件进行直接的物理操作。
  • 将 etcd-proxy 从 ./etcd 二进制文件中分离出来,因为它包含更多实验性代码,带来额外风险和依赖。
  • 弃用对 v2 协议的支持。

最后更新于 2025 年 6 月 3 日:递归地将 v3.6 的内容复制到 v3.7(a90b2a6)