tikrok 第 7 代微服务重构: Golang 微服务 grpc 接口与服务实现隔离方案

目前,tkrok 第 7 代,实现代码行业达到了 20+ 万行,即将达到个人维护的边界。为方便后续个人远程开发者可以方便地接入项目维护工作,特此将第 6 代实现重构升级。分享给社区,为 golang 微服务兴旺,肋力。也方便后续开发者接手了解生产级的代码实现,为自学的开发者指南。 接口契约优先 · ...
tikrok 第 7 代微服务重构: Golang 微服务 grpc 接口与服务实现隔离方案
tikrok 第 7 代微服务重构: Golang 微服务 grpc 接口与服务实现隔离方案

目前,tkrok 第 7 代,实现代码行业达到了 20+ 万行,即将达到个人维护的边界。为方便后续个人远程开发者可以方便地接入项目维护工作,特此将第 6 代实现重构升级。分享给社区,为 golang 微服务兴旺,肋力。也方便后续开发者接手了解生产级的代码实现,为自学的开发者指南。

接口契约优先 · 实现细节隐藏 · 协作零泄露


🎯 核心目标拆解

✅ 服务提供方:只暴露 IDL + 生成的 Client/Handler 接口,隐藏业务实现
✅ 服务消费方:仅依赖 RPC 客户端代码,无需拉取服务端源码
✅ 协作开发:通过契约版本协商变更,避免「改接口改到崩溃」
✅ 安全管控:私有仓库 + 权限隔离 + 依赖审计,防止源码泄露

💡 本质:「接口定义仓库」与「业务实现仓库」物理分离 + 自动化代码生成


🏗️ 整体架构设计(参考字节/腾讯实践)

📦 公司 Git 组织
├── 🔓 idl-registry/           #  [公开] 接口定义仓库(只含 IDL + 生成代码)
│   ├── user-service/
│   │   ├── user.thrift        # 服务契约(唯一真理源)
│   │   ├── kitex_gen/         # 自动生成的 Client/Handler/Model
│   │   ├── go.mod             # module company.com/idl/user-service
│   │   └── README.md          # 接口变更规范 + 版本日志
│   └── order-service/
│       └── ...
│
├── 🔐 user-service-impl/      #  [私有] 服务端实现仓库(仅内部可见)
│   ├── handler/               # 业务逻辑实现(实现 idl 定义的 Handler 接口)
│   ├── main.go                # 服务启动入口
│   ├── go.mod
│   │   require company.com/idl/user-service v1.2.0  # 依赖接口仓库
│   └── .gitignore             # 禁止提交 handler 业务代码到 idl 仓库
│
├── 🔐 order-service-impl/     #  [私有] 其他服务实现
│   └── ...
│
└── 🔐 internal-tools/         #  [私有] 代码生成/发布工具链
    ├── kitex-gen-wrapper.sh   # 封装 kitex 生成命令
    └── publish-idl.sh         # 自动打标签 + 推送到私有 GOPROXY

🔑 关键原则:

  • idl-registry只含接口契约 + 生成代码,权限开放给所有开发者
  • *-impl仅含业务实现,权限严格管控,禁止外部访问
  • 消费方 go.mod 只依赖 company.com/idl/*永远不依赖 *-impl

来源: V2EX - 技术查看原文