目前,我有一个项目的20个微服务,每个微服务都储存在单独的GIT存储库中。 随后,服务数量将增加到200(或更多)。
每个服务都有单元测试和集成测试。 每个服务在TeamCity(持续集成服务器)中构建。
问题:如何为一个项目的200个微服务存储源代码?是在一个仓库中还是在单独的仓库中?
目前,我有一个项目的20个微服务,每个微服务都储存在单独的GIT存储库中。 随后,服务数量将增加到200(或更多)。
每个服务都有单元测试和集成测试。 每个服务在TeamCity(持续集成服务器)中构建。
问题:如何为一个项目的200个微服务存储源代码?是在一个仓库中还是在单独的仓库中?
如果这些微服务没有紧密耦合(即仅下载其中一些不合理,您只能使用全部),则建议将它们放在单独的Git repo中。
但是,您仍然可以将它们作为子模块引用到父repo中,以便随时跟踪它们的状态。
Git子模块和子树也有自己的问题。Facebook和Google对于所有微服务都有一个单一的仓库。这个问题没有明确的答案,但是诸如重构、依赖管理和项目设置等事情从单体库中受益。再次强调,服务之间的耦合以及不同团队与仓库的互动是选择其中一个的关键。
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 interfaces 命令)
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)
sprint_interfaces --> Merge Request --> Interfaces -->master
它更像是
sprint_interfaces --> Merge Request --> master
我曾在一家公司工作,我们使用了130多个服务。有些服务连接到外部API,即超出我们的生态系统。但我们只是将每个服务保留在自己的GIT存储库中。我们有一个公共库,用于加密、日志记录等,都在一个BOM下。 创建单独的存储库将阻止您意外地制作相互链接的微服务,这是整个想法的目标。将来,如果需要,您可以进一步减少单个服务。 有了130多个微服务,我们从未遇到过相互依赖的代码问题,而且部署也很顺利,不必担心其他服务。
拥有单独的代码库在刚开始时会有所帮助,但当项目增长时,管理起来就变得非常困难。12-factor app guideline 还建议维护一个单一的单体式代码库。这些不应该是子模块,除非像在单独的代码库中管理配置等情况。将微服务分别作为子项目放在单体式代码库中,可以让您构建CI/CD pipeline。这是另一个重要的优势。例如:假设您需要处理两个或更多微服务才能完成特定的功能或问题。您可以使用一个提交跟踪所有服务以解决该问题。