@xuemingdeng
2017-05-02T20:58:26.000000Z
字数 2241
阅读 493
微服务架构为软件开发带来了极大的灵活性,并加快了交付速度,但同时也带来了依赖管理问题。传统的解决方案虽然能够解决依赖管理问题,但都太极端,顾此失彼。于是,Netflix尝试着寻找自己的解决方案,期待着在整个组织层面做到真正的持续集成。本文内容来自Netflix技术博客,已获得翻译授权,查看英文原文 Towards true continuous integration:distributed repositories and dependencies。
在过去的8年间,Netflix基于AWS构建了一套健壮的微服务架构,我们因此学会了如何在AWS上构建可靠的高性能服务。我们的微服务架构解耦了工程团队,让他们可以自由地构建、测试和部署他们的服务。这种灵活性最大化了团队的交付速度。在Netflix,交付速度和可靠性是设计解决方案时首要的考虑点。
基于我们的架构,微服务为它们的消费者提供了一个客户端软件包,用于处理所有的IPC(进程间通信)逻辑。这同时为服务的提供者和消费者带来了很多好处。除了客户端,微服务的很大部分是基于我们的运行时平台而构建的,这个平台由内部的软件包和第三方开源的软件包组成。
尽管服务开发团队有很大的发布灵活性,但他们的交付速度却受到了依赖软件包的影响。一项新增的产品特性可能要求很多微服务都用上最新版本的共享软件包或客户端,而更新依赖版本可能会带来风险。
简而言之,依赖管理是一项艰巨的任务。
更新项目的依赖可能带来潜在的问题。
我们发现,为了解决大规模的依赖管理问题,很多公司使用了两种方案:共享最小化(Share Little)和单体仓库(MonoRepo)。
这两种方式都能解决大规模的依赖管理问题,不过它们也带来了一些挑战。共享最小化促进了解耦,也加快了工程速度,但牺牲了代码的重用性和一致性。单体仓库保证了代码一致性,并降低了风险,但牺牲了灵活性。不管采用哪一种方式,我们都需要对Netflix的开发基础设施和运行时架构做出重大的调整。况且,这两种方案会破坏我们所推崇的自由和责任文化。
我们给自己提出了一个很大的挑战目标:
我们能否为Netflix的工程师们提供一种解决方案,它不但具有单体仓库的优势,还能保持分布式仓库的灵活性?
我们以单体仓库为蓝本,另辟蹊径,希望找出能够达到相同目的的可替代方案。单体仓库所要解决的核心问题是什么?我们能否在传统的二元集成世界里开发出一种新的方案?
我们的解决方案,虽然还在试验阶段,不过可以从中归纳出三个关键的特性。
我们的旅程才刚刚开始。我们的发布者反馈服务目前正处于alpha测试阶段,我们计划后续会大规模采用这个服务,紧接着会进行来源管理。我们的分布式重构试验让我们了解到进行快速的全局重构是多么的重要。我们也看到了通过我们所构建的工具来降低依赖图复杂度的可能性。我们相信,通过扩展和培养这种能力,我们的Netflix团队将会在组织层面做到真正的持续集成,并减少(甚至免去)依赖管理的痛苦。