2008年秋季,Netflix遭遇了一次嚴重的數(shù)據(jù)庫故障,連續(xù)3天無法向成員寄送DVD,從那時起,他們決定向云遷移。今年2月,Netflix宣布完成了向云的遷移。
而與之相應(yīng)的是,Netflix的開發(fā)工作也要針對上云做很多工作。那么,Netflix的代碼在部署到云上之前,是如何構(gòu)建的呢?
Netflix的三位工程師Ed Bukoski、Brian Moyles和Mike McGarr撰文介紹了相關(guān)的工具與技術(shù)。
Netflix之前已經(jīng)開源了其持續(xù)交付平臺Spinnaker。Spinnaker可以快速可靠地將軟件變更發(fā)布到多種云平臺。
從上圖可以看到,很多工作是依托Spinnaker平臺進行的。
一行代碼在進入Spinnaker之前,還要經(jīng)過很多步驟:
在本地使用Nebula構(gòu)建和測試修改被提交到一個中心git倉庫使用Jenkins作業(yè)執(zhí)行Nebula,構(gòu)建、測試和打包應(yīng)用,準備部署將構(gòu)建“baked”到Amazon Machine Images中使用Spinnaker流水線部署和提交代碼變更關(guān)鍵詞:文化、云和微服務(wù)Netflix是一家非常強調(diào)“文化”的公司。其中有一點是“Freedom & Responsibility(自由與責任)”。該文化激勵和促使工程師使用自己感覺最適合的工具來完成任務(wù)。如果一個工具廣為接受,它肯定是很有競爭力,能夠帶來巨大的價值,并減少大部分工程師的整體認知負荷。團隊可以自由地實現(xiàn)替代方案,但也有責任維護這些方案。
另外兩個關(guān)鍵詞也不難理解,前面我們提到,2008年開始,Netflix開始向云上遷移,一體化的、基于數(shù)據(jù)中心的Java應(yīng)用轉(zhuǎn)向基于云的Java微服務(wù)。
下面就具體看一下代碼部署步驟。
構(gòu)建Nebula是Netflix開發(fā)的Gradle插件集合,可以讓開發(fā)者更方便地使用Gradle構(gòu)建、測試和部署項目。也已經(jīng)開源。
Gradle為構(gòu)建、測試和打包Java應(yīng)用提供了很好的支持。之所以選擇它,是因為方便編寫可測試的插件,還能減小項目構(gòu)建文件的大小。Nebula通過一些插件在依賴管理、發(fā)布管理和打包等方面擴展了Gradle。Nebula提供了可復(fù)用和一致的構(gòu)建功能,同時減少了每個應(yīng)用構(gòu)建文件中的樣板代碼。
集成代碼在本地經(jīng)過Nebula構(gòu)建和測試之后,已經(jīng)為持續(xù)集成和交付做好了準備。第一步是將更新后的源代碼推送到某個git倉庫。變更提交會觸發(fā)一個Jenkins作業(yè)。
最早,在Netflix的數(shù)據(jù)中心中,只有一個大規(guī)模的Jenkins主節(jié)點,而現(xiàn)在,他們在AWS中運行著25個主節(jié)點。Jenkins被用于很多自動化任務(wù),不單是簡單的持續(xù)集成。Jenkins作業(yè)會調(diào)用Nebula來構(gòu)建、測試和打包應(yīng)用代碼。根據(jù)所構(gòu)建內(nèi)容的不同,Nebula還會構(gòu)建出.jar文件、Debian或RPM包,并根據(jù)配置發(fā)布到相應(yīng)位置。
BakeNetflix的部署策略是圍繞Immutable Server (不可變服務(wù)器)模式進行的。為避免配置漂移 (configuration drift) 并確保部署可以從源代碼重復(fù)進行,線上修改應(yīng)該盡量避免。所以每次部署都會創(chuàng)建一個新的Amazon Machine Image(AMI)。
為從源代碼生成AMI,Netflix創(chuàng)建了Bakery。Bakery提供了一個API,支持全局創(chuàng)建AMI。Bakery API服務(wù)會在工作節(jié)點上調(diào)度真正的bake作業(yè),使用Aminator來創(chuàng)建Image。
在Jenkins作業(yè)成功完成時,通常會觸發(fā)Spinnaker流水線。Spinnaker會讀取Nebula生成的操作系統(tǒng)包,并調(diào)用Bakery API來觸發(fā)bake。
部署一旦bake完成,Spinnaker就可以將生成的AMI用于部署了。
未來探索Netflix希望進一步改進開發(fā)者的體驗,做得更好。目前還面對一些挑戰(zhàn)。
一個是積極解決二進制文件的依賴。Nebula提供了簡化Java依賴管理的工具,不過還有很大的改進空間。
另一個是bake時間。
隨著Netflix的不斷增長,很多非JVM語言應(yīng)用也越來越多,像JavaScript/Node.js、Python、Ruby和Go等,最好能有一套語言無關(guān)的方案和工具。
更多細節(jié),可以閱讀Netflix的相關(guān)技術(shù)博客。
號外代碼的構(gòu)建與部署,本質(zhì)上是一個工程效率問題。各公司研發(fā)體系內(nèi)部會有很多工具及平臺。他們和產(chǎn)品并沒有直接的關(guān)系,但是這些工具及平臺是工程師使用最多的。提高這部分的效率實際上對整個工程效率影響非常大,可以極大縮短開發(fā)的周期及人力投入。
因此,在4月21~23日的QCon北京大會上,我們專門設(shè)置了《工程效率提升》專題,分享典型的互聯(lián)網(wǎng)公司在提高工程效率方面的各種最佳實踐以及典型思路。專題的出品人是58趕集技術(shù)工程平臺部高級總監(jiān)王海龍。他目前負責58趕集研發(fā)體系的自動構(gòu)建部署發(fā)布平臺,持續(xù)集成及自動化測試平臺,以及研發(fā)管理平臺等工程平臺的研發(fā)與管理。之前曾在百度,淘寶網(wǎng),阿里巴巴,用友軟件等多家企業(yè)從事高級技術(shù)管理工作。
屆時,百度工程效率部高級經(jīng)理夏仲璞將分享《支持百度萬人開發(fā)的工具裝備及百度工程能力建設(shè)》。阿里巴巴技術(shù)專家劉昕(唐容)將分享《云上應(yīng)用Docker化持續(xù)交付實踐》。
另外,《七周七并發(fā)模型》作者Paul Butcher、阿里云研究員余鋒(褚霸)等專家也會在QCon上分享。想進一步了解,可以查看大會日程信息。