gRPC服务Proto文件采用集中仓库还是分散存储更合适?
集中式Proto仓库的潜在问题
这种方案确实存在不少明显的缺陷:
- 版本依赖冲突风险高:所有服务共用一个仓库的
.pb.go生成代码,一旦某份service/message定义做了不兼容更新,所有依赖它的服务只要拉取了最新版本就会直接报错,既没法做灰度升级,也不支持不同服务按需选择依赖的proto版本。 - 开发流程强耦合:服务迭代需要调整proto定义时,得跨仓库提交PR走中央仓库的审批流程,和自身服务的代码迭代流程完全割裂,调试阶段要两边同步修改,额外增加很多流程成本,对初学者来说非常影响学习和调试效率。
- 仓库极易膨胀:长期迭代后所有服务的proto定义、多语言生成代码都堆在同一个仓库,clone、拉取的速度会越来越慢,还会积累大量已下线服务的冗余定义。
- 权限管控成本高:多团队协作场景下,很难限制不同团队只能修改自己负责的服务的proto,很容易出现误改其他团队定义的问题。
分散式Proto方案的适用性
对于初学者、中小团队、服务迭代速度快的场景,把service对应的proto文件分散存放在各自服务仓库,确实是更优选择,优势非常明显:
- 开发流程完全对齐:proto定义和服务代码放在同一个仓库,修改proto、调整服务逻辑、测试验证可以在同一个PR里完成,迭代效率高,不需要跨仓库协调,非常适合学习阶段快速调试验证。
- 版本管控灵活:每个服务的proto版本和服务代码版本一一对应,发布服务时直接打对应标签,依赖方可以按需选择要引用的版本,不会出现一个仓库更新牵连所有服务的问题。
- 权责清晰:谁负责的服务谁维护自己的proto定义,不会出现跨团队误改的问题。
当然分散式也有小缺陷:很难统一推行API规范,容易出现不同服务的proto定义风格不统一、公共message重复定义的问题,这个只要单独抽一个轻量的公共proto仓库,只存全项目通用的公共定义(比如错误码、通用分页结构)就可以解决,不要把业务服务的service定义放到公共仓库即可。
入门阶段优先选择分散式+轻量公共仓库的组合,完全够用且学习成本低。等你对gRPC的版本管理、依赖分发流程熟悉之后,再根据团队规模、协作模式评估要不要切换到集中式方案即可,绝大多数中小团队不需要走全量集中式的路线。
内容的提问来源于stack exchange,提问作者Alok Kumar Singh
相关产品推荐
相关产品推荐

