Netflix 是如何针对云构建和部署代码的

阅读数:1227 2016 年 3 月 10 日

话题:QCon语言 & 开发架构

2008 年秋季,Netflix 遭遇了一次严重的数据库故障,连续 3 天无法向成员寄送 DVD,从那时起,他们决定向云迁移。今年 2 月,Netflix宣布完成了向云的迁移。

而与之相应的是,Netflix 的开发工作也要针对上云做很多工作。那么,Netflix 的代码在部署到云上之前,是如何构建的呢?

Netflix 的三位工程师 Ed Bukoski、Brian Moyles 和 Mike McGarr撰文介绍了相关的工具与技术。

Netflix 之前已经开源了其持续交付平台Spinnaker。Spinnaker 可以快速可靠地将软件变更发布到多种云平台。

从上图可以看到,很多工作是依托 Spinnaker 平台进行的。

一行代码在进入 Spinnaker 之前,还要经过很多步骤:

  • 在本地使用 Nebula 构建和测试
  • 修改被提交到一个中心 git 仓库
  • 使用 Jenkins 作业执行 Nebula,构建、测试和打包应用,准备部署
  • 将构建“baked”到 Amazon Machine Images 中
  • 使用 Spinnaker 流水线部署和提交代码变更

关键词:文化、云和微服务

Netflix 是一家非常强调“文化”的公司。其中有一点是“Freedom & Responsibility(自由与责任)”。该文化激励和促使工程师使用自己感觉最适合的工具来完成任务。如果一个工具广为接受,它肯定是很有竞争力,能够带来巨大的价值,并减少大部分工程师的整体认知负荷。团队可以自由地实现替代方案,但也有责任维护这些方案

另外两个关键词也不难理解,前面我们提到,2008 年开始,Netflix 开始向云上迁移,一体化的、基于数据中心的 Java 应用转向基于云的 Java 微服务。

下面就具体看一下代码部署步骤。

构建

Nebula是 Netflix 开发的 Gradle 插件集合,可以让开发者更方便地使用 Gradle 构建、测试和部署项目。也已经开源。

Gradle 为构建、测试和打包 Java 应用提供了很好的支持。之所以选择它,是因为方便编写可测试的插件,还能减小项目构建文件的大小。Nebula 通过一些插件在依赖管理、发布管理和打包等方面扩展了 Gradle。Nebula 提供了可复用和一致的构建功能,同时减少了每个应用构建文件中的样板代码。

集成

代码在本地经过 Nebula 构建和测试之后,已经为持续集成和交付做好了准备。第一步是将更新后的源代码推送到某个 git 仓库。变更提交会触发一个 Jenkins 作业。

最早,在 Netflix 的数据中心中,只有一个大规模的 Jenkins 主节点,而现在,他们在 AWS 中运行着 25 个主节点。Jenkins 被用于很多自动化任务,不单是简单的持续集成。Jenkins 作业会调用 Nebula 来构建、测试和打包应用代码。根据所构建内容的不同,Nebula 还会构建出.jar 文件、Debian 或 RPM 包,并根据配置发布到相应位置。

Bake

Netflix 的部署策略是围绕Immutable Server (不可变服务器) 模式进行的。为避免配置漂移 (configuration drift) 并确保部署可以从源代码重复进行,线上修改应该尽量避免。所以每次部署都会创建一个新的 Amazon Machine Image(AMI)。

为从源代码生成 AMI,Netflix 创建了 Bakery。Bakery 提供了一个 API,支持全局创建 AMI。Bakery API 服务会在工作节点上调度真正的 bake 作业,使用 Aminator 来创建 Image。

在 Jenkins 作业成功完成时,通常会触发 Spinnaker 流水线。Spinnaker 会读取 Nebula 生成的操作系统包,并调用 Bakery API 来触发 bake。

部署

一旦 bake 完成,Spinnaker 就可以将生成的 AMI 用于部署了。

未来探索

Netflix 希望进一步改进开发者的体验,做得更好。目前还面对一些挑战。

一个是积极解决二进制文件的依赖。Nebula 提供了简化 Java 依赖管理的工具,不过还有很大的改进空间。

另一个是 bake 时间。

随着 Netflix 的不断增长,很多非 JVM 语言应用也越来越多,像 JavaScript/Node.js、Python、Ruby 和 Go 等,最好能有一套语言无关的方案和工具。

更多细节,可以阅读 Netflix 的相关技术博客

号外

代码的构建与部署,本质上是一个工程效率问题。各公司研发体系内部会有很多工具及平台。他们和产品并没有直接的关系,但是这些工具及平台是工程师使用最多的。提高这部分的效率实际上对整个工程效率影响非常大,可以极大缩短开发的周期及人力投入。

因此,在 4 月 21~23 日的QCon 北京大会上,我们专门设置了《工程效率提升》专题,分享典型的互联网公司在提高工程效率方面的各种最佳实践以及典型思路。专题的出品人是 58 赶集技术工程平台部高级总监王海龙。他目前负责 58 赶集研发体系的自动构建部署发布平台,持续集成及自动化测试平台,以及研发管理平台等工程平台的研发与管理。之前曾在百度,淘宝网,阿里巴巴,用友软件等多家企业从事高级技术管理工作。

届时,百度工程效率部高级经理夏仲璞将分享《支持百度万人开发的工具装备及百度工程能力建设》。阿里巴巴技术专家刘昕(唐容)将分享《云上应用 Docker 化持续交付实践》。

另外,《七周七并发模型》作者Paul Butcher、阿里云研究员余锋(褚霸)等专家也会在 QCon 上分享。想进一步了解,可以查看大会日程信息。