使用 gitlab 实现 proto 文件的 semantic version 管理(1) - 使用规范

前言

历史原因我司的后端团队在同时使用 3 种语言:Python、Go、Java。为了实现团队的水平拆分和业务逻辑的收敛,我们会在不同的业务线间使用 unary 模式的 gRPC 来进行同步通信。 例如报名业务中会存在一个查询某个用户所有报名记录的接口,这个接口是 Python 语言开发的,在不同的业务场景上 Go、Java 都会调用这个接口。这就导致该接口的 protobuf 文件由 Python 开发者维护,同时 Go 和 Java 的 client 需要同步变更以使用最新版本的接口。一旦接口需要升级,协调 server 端有发布和升级,proto 文件仓库的变更,client 端变更发布就变成了一个很麻烦的事情。我们需要一个方便透明的规范来协调各端。

一. 解决方案对比和选择

1. 可选方案

A. 在不同的 server / client 代码项目中复制 proto 文件并各自生成对应语言的包;
B. 使用 git submodule 使用同一个仓库的 proto 文件
C. 使用 semantic version 并使用第三方的方式管理 proto 文件

2. 损益分析

截屏2020-05-02 下午5.55.10.png

二. 如何创建新的 Proto 仓库

1. 创建新的 Proto 仓库

  • 每个后端项目对应新建一个 proto 仓库,proto 文件不再跟项目代码放到一起。
  • proto 三方仓库分 dev/master 两个分支;
  • master 分支只能通过提 merge request 的方式提交新代码
  • 所有 release 都从 master 打 tag 生成

2. Proto 语言文件的规范

  • proto 文件遵循只增不减的原则
  • proto 文件中的接口遵循只增不减的原则
  • proto 文件中的 message 字段遵循只增不减的原则
  • proto 文件中的 message 字段类型和序号不得修改

四. Proto 文件仓库的使用流程

1. Proto 文件仓库的修改

  • 从 master 检出分支,feature/abc123,添加字段或者接口然后合并到 dev
  • 从 dev 提 merge request 到 master 分支
  • 合并 merge 之后稍等 3 分钟(gitlab CI 会自动生成各种语言的包并发布)就会得到一个版本号: v1.1.3243 (去 git.mycompany.com/proto/{project}/-/releases 查看发布的的版本)项目 、版本

2. 在各个语言的包管理工具中使用对应的 version 引用生成的 proto 文件

  • 在 Go 项目中修改 go mod ,添加第三方依赖并指定版本
import (
    gitlab.company.com/proto/abc v1.1.3243
)
  • Python 使用 proto 项目对应版本
pip install https://gitlab.mycompany.com/proto/abc@v1.1.3243
  • Java 直接使用私有 maven 仓库中的包和对应版本

3. Go mod 中 proto 包的 import 和使用

  • 配置 git config
git config --global url."git@git.mycompany.com".instead of "http://git.mycompany.com"
git config --global url."git@git.mycompany.com".instead of "https://git.mycompany.com"
  • 设置 Go 环境  

    • 升级 go 版本到 1.13 或以上版本
    • 配置环境变量:
    GOPROXY="https://goproxy.io,direct"
                
    GOPRIVATE="git.mycompany.com"
    • 使用 go build -v  可以方便的排查和定位问题

----------- EOF ----------
转载请注明原链接,谢谢。

相关文章:
使用 gitlab 实现 proto 文件的 semantic version 管理(2) - 配置篇


github.com/airylinus

2.4k 声望
67 粉丝
0 条评论
推荐阅读
记一次 go mod vendor 报错排查经过
该步骤将以 go.mod 文件中写明的包和版本为准下载第三方依赖并保存到本地的 vendor 目录。下载过程中将校验 go.sum 中的 hash 值是否同文件 hash 一致。

Airy阅读 894

使用 gitlab 实现 proto 文件的 semantic version 管理(2) - 配置篇
最终目标:所有 proto 文件的改动都体现在版本号中;开发者不需要手动编译 proto 文件;同一个版本号在各个语言中是通用的;配置方案:配置 gitlab CI,实现 merge request 通过之后自动打包并生成版本号;每个版...

Airy2阅读 3.1k评论 2

Golang RPC Go标准库的简单实现 介绍+使用
在涉及RPC的应用中,作为开发人员一般至少有三种角色:首先是服务端实现RPC方法的开发人员,其次是客户端调用RPC方法的人员,最后也是最重要的是制定服务端和客户端RPC接口规范的设计人员。在前面的例子中我们为...

LiberHome3阅读 800

Git 分支管理策略汇总
我大概说了一些规则,但仔细想来,好像也并没有形成一个清晰规范的流程。所以查了一些资料,总结出下面这篇文章,一共包含四种常见的分支管理策略,分享给大家。

alwaysbeta3阅读 941

封面图
Dubbo架构设计与源码解析(三)责任链模式
责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传...

京东云开发者3阅读 595

封面图
CentOS7 Docker安装Gitlab
官方教程 [链接]搜索镜像docker search gitlab 下载镜像文件docker pull docker.io/gitlab/gitlab-ce创建GitLab 的配置 (etc) 、 日志 (log) 、数据 (data) 放到容器之外, 便于日后升级, 因此请先准备这三个目...

YYGP阅读 4.7k

Answer.dev 走进华师大课堂:Answer 项目开发流程详解
前不久,Answer.dev 开发团队受到华东师范大学 CS4ALL 研究中心邀请,为在读硕士的同学们进行了一次分享,以 Answer.dev 项目开发过程为例,与同学们探讨了项目研发管理、开发流程、DevOps 等相关话题。以下为 An...

AnswerDev2阅读 615

github.com/airylinus

2.4k 声望
67 粉丝
宣传栏