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包,并根據配置發布到相應位置。
BakeNetflix的部署策略是圍繞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上分享。想進一步了解,可以查看大會日程信息。