The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
5wunian

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

  •  
  •   5wunian · 20h 12m ago · 542 views

    目前,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

    No Comments Yet
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3853 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:09 · PVG 13:09 · LAX 22:09 · JFK 01:09
    ♥ Do have faith in what you're doing.