3 回答
TA贡献1765条经验 获得超5个赞
你所说的现在通常被称为“monorepo”。虽然我个人喜欢将所有项目放在自己的独立存储库中(包括微服务和其他所有内容),但有许多支持者将公司的所有代码放在单个存储库中。有趣的是,谷歌和 Facebook 都使用 monorepos,尽管必须说他们已经构建了很多奇特的工具来使其为他们工作。
需要注意的一件重要事情是,您的存储库与您的架构是分开的。它们之间不一定有任何相关性。您可以将微服务全部放在一个存储库中,也可以将一个整体划分为多个存储库;存储库只是存储和记录代码库的工具,仅此而已。
在研究该主题时,以下是从网络上的许多文章中得出的一些优点和缺点:
Monorepo的优势
易于在项目之间共享模块(即使在微服务中,也经常存在交叉问题)
一个地方可以查看并了解存在哪些代码 - 对于拥有大量代码的大公司尤其有用
简化自动和手动代码审查流程
简化文档,而不是从多个、断开连接的存储库中提取
Monorepo的缺点
大量代码库在本地签入/签出可能具有挑战性/缓慢
如果没有非常清晰、严格的指导方针,很容易导致产品之间的紧密耦合
需要(稍微)更复杂的 CI/CD 工具来进行部分发布
根据存储库平台的不同,非常大的代码库可能会影响性能
与编程中的许多其他事物(尤其是 SOA 中的许多其他事物)一样,适合您的解决方案取决于许多只有您可以确定的因素。主要的结论是,大大小小的公司在这两种选择以及许多介于两者之间的选择上都取得了成功,因此请谨慎选择,但不要太担心。
TA贡献1806条经验 获得超5个赞
Go 项目所依赖的子包的版本控制可以通过git tagging来跟踪。因此,鼓励使用 Go-modules 将子包移动到他们自己的 git 存储库中。
如果您的大部分解决方案将用 go 编写,我建议利用go module。
TA贡献1818条经验 获得超7个赞
有一种使用单独的存储库和 Go 微服务的好方法:Go 插件。简而言之:
构建一个实现共享功能的基础镜像。
让该基础镜像在容器中的某个位置查找Go 插件
在派生镜像中,将功能编译为 Go 插件,并将其放置在基础镜像可以找到的位置。
对于 Go/gRPC,我在这里放置了一个执行此操作的基础映像。
- 3 回答
- 0 关注
- 107 浏览
添加回答
举报