Web应用中客户端和服务端都需维护protobuf副本吗?最佳维护方式是什么?
gRPC集成及Protobuf跨端维护方案
Flutter与Go gRPC服务集成步骤
你要实现两端连通,只需要按以下步骤操作即可:
- 首先确保你的Go服务已经开启gRPC监听,如果是给Flutter Web提供服务,还需要额外开启
gRPC-Web支持或者部署反向代理做gRPC到gRPC-Web的转换 - 本地安装
protoc编译器,以及Dart官方的gRPC代码生成插件protoc-gen-dart - 基于统一维护的
.proto文件,运行protoc命令生成Dart侧的客户端调用桩代码、请求/响应结构体 - Flutter代码中导入生成的dart文件,初始化gRPC客户端连接到后端服务地址,直接调用生成的方法即可完成请求
Protobuf跨端维护最佳实践
完全不需要在前后端两个仓库独立维护、手动复制protobuf文件,手动同步不仅维护成本高,还极易出现版本不一致、更新遗漏的问题,目前行业内通用的维护方案有以下几种,你可以根据团队规模和项目情况选择:
独立集中仓库方案
把项目所有.proto文件统一存放在一个独立的公共代码仓库中,前后端代码库都通过git submodule或者包管理工具依赖该仓库的指定版本。两端各自的编译脚本直接读取依赖目录下的proto文件,分别生成Go侧和Dart侧的业务代码,版本更新时只需要修改公共仓库内容,两端按需更新依赖版本即可。后端仓库作为唯一源方案
如果是小型项目、团队人数少,不需要额外维护独立仓库,可以直接把所有proto文件统一存放在后端代码库的固定目录(比如/api/proto),前端写个简单的自动化脚本,通过git sparse-checkout等方式只拉取后端仓库中proto相关的目录到本地,不需要拉取整个后端仓库。后端同学更新proto提交后,前端执行同步脚本就能拿到最新版本。Protobuf专用工具链方案
目前有成熟的Protobuf生态工具可以提供proto文件的托管、版本管理、跨端代码自动生成能力,你只需要把proto文件上传到托管服务,前后端可以直接拉取对应版本的、已经生成好的端侧代码,连本地执行protoc编译的步骤都可以省略,适合多端多服务的中大型项目使用。
不管使用哪种方案,都要遵循以下规则避免兼容性问题:
- 所有proto修改都要保证向下兼容,禁止做删除字段、修改字段号、修改字段类型这类破坏性变更
- 给proto文件对应的版本打tag,两端锁定使用的版本号,避免出现一端更新后另一端未同步导致的兼容故障
- 把proto编译生成本地代码的步骤集成到CI/CD流程中,不要本地手动生成后提交代码,避免不同开发环境的protoc、插件版本不一致导致生成的代码有差异
内容的提问来源于stack exchange,提问作者Sal
相关产品推荐
相关产品推荐

