目前,我为一个项目提供了20 个微服务。每个微服务都存储在单独的 GIT 存储库中。随后,服务数量将增加到200 个(或更多)。
每个服务都有单元测试和集成测试。每个服务都内置在 TeamCity(持续集成服务器)中。
问题:如何为一个项目存储200个微服务的源代码?在一个存储库中还是在单独的存储库中?
目前,我为一个项目提供了20 个微服务。每个微服务都存储在单独的 GIT 存储库中。随后,服务数量将增加到200 个(或更多)。
每个服务都有单元测试和集成测试。每个服务都内置在 TeamCity(持续集成服务器)中。
问题:如何为一个项目存储200个微服务的源代码?在一个存储库中还是在单独的存储库中?
除非这些微服务是紧密耦合的(这意味着只下载其中一些是没有意义的,并且您只能使用它们全部),否则建议将它们分别保存在一个单独的 Git 存储库中。
但是您仍然可以在父 repo 中将它们作为子模块引用,以便在任何给定时间跟踪它们的状态。
git 子模块和子树也有自己的问题。脸书和谷歌?他们的所有微服务都有一个存储库。这个问题没有明确的答案,但是诸如重构、依赖管理和项目设置之类的事情可以从单一存储库中受益。同样,服务的耦合以及不同团队如何与 repo 交互是选择一个或另一个的关键。
我们没有使用子模块;我们所做的是分支策略
每个微服务在 base_folder 文件夹下都有自己的文件夹。
有一个发布分支 -> 目前一个主控(这拥有一切)有一个接口分支 -> 接口(这只有接口,例如所有服务的 protobuffer/grpc 文件)。这个分支总是合并到 master
每个服务都有一个分支 --> sprint_service_name 推送代码(用于代码审查)和创建到主分支的合并请求
代码流
对于新组件
git checkout interfaces
git checkout -b sprint_service_name
(create branch from interface branch)
对于现有组件
git checkout sprint_service_name
git fetch origin interfaces
git merge origin/interfaces (don't use git merge origin interfaces !!)
(或以上两个步骤 git pull origin 接口)
这是开发人员流程
Push to sprint_service_name branch and create merge request to master branch
git push origin sprint_service_name
支流
sprint_service_namexxx --> Merge Request --> master
sprint_interfaces --> Merge Request --> Interfaces -->master
interfaces --> sprint_service_namexxx (by all, every day)
所有公共部分都将在接口分支中
(您可以拥有任意数量的私有分支;但请注意不要将 master 合并到 sprint_service_name 或 master 合并到 interfaces ;否则不需要的文件将在您的分支中)
优点 每个微服务都只有它的代码和接口文件夹
缺点
我已经看到以下流程并不总是理想地发生,例如
sprint_interfaces --> Merge Request --> Interfaces -->master
它更像
sprint_interfaces --> Merge Request --> master
这意味着有人必须手动从 master 获取 Interfaces文件夹并合并到 Interfaces分支。但这只是纪律的事情,并没有破坏任何东西
我的选择是存储在不同的存储库中,我已经这样做了多年,并认为它更容易管理,然后变得复杂。如果您参考 12 因素应用程序,您应该知道拥有单独回购的好处。每个微服务都有不同的测试套件、不同的版本和生命周期。它将最终提高可交付成果的速度。
一个单一的存储库可能会起作用,但最好将它们分离到不同的存储库中,并为每个服务拥有一套完整的管道工具。正如微服务原则所说,服务可以由不同的团队管理,可以使用不同的技术构建,并且应该有自己的版本,这只能通过不同的 repos 来实现。
如果上述因素还不够,那么您可以考虑这样一种情况,即只需要通过管道单独更改和测试一个服务,然后单独的 repos 将使其更容易发布。
对于整个项目,无论大小,您都应该只有一个 repo。
你可以参考 12 Factor Application 来构建这样的项目,它可以从这里处理大部分事情。
12 Factor 应用程序的概念适用于具有许多微服务的大型项目。
我曾在一家公司工作过,我们曾经使用过 130 多种服务。一些服务连接到外部 API,即在我们的生态系统之外。但我们只是使用将每个服务保存到它们自己的 GIT 存储库中。我们在一个 BOM 下有用于加密、日志记录等的公共库。创建单独的存储库将阻止您意外地创建相互关联的微服务,这就是整个想法的目标。将来,如果需要,您可以进一步减少个人服务。使用 130 多个微服务,我们从未遇到过相互依赖的代码问题,而且部署也很顺利,无需担心其他服务。
拥有单独的存储库将在启动时有所帮助,但随着项目的发展,它变得非常难以管理。12 要素应用指南还建议维护一个单一的单体存储库。这些不应该是子模块,除非您在单独的存储库中管理配置等场景。拥有一个包含每个微服务子项目的单体代码库,可以让您构建CI/CD 管道。这是另一个很大的优势。例如:假设您需要处理两个或多个微服务来完成特定功能或问题。您可以针对该问题通过一次提交来跟踪所有服务。