传统 Java 网站如何实现容器化?看看 Cars.com 如何玩转 Docker!
背景
Cars.com 是美國的汽車門戶網(wǎng)站,為用戶提供各種購車相關(guān)的信息和資訊,類似于國內(nèi)的汽車之家。
他們之前的技術(shù)棧是比較傳統(tǒng)的 Java Web 結(jié)構(gòu):Java 7, ?Websphere/Weblogic, Oracle Linux, IBM 硬件,Oracle 數(shù)據(jù)庫 。開發(fā)語言包含 Java,NodeJs,Go。隨著網(wǎng)站宣傳的投入,Cars.com 的流量也變大了。
·????? 3000萬訪問者 / 月
·????? 470萬車輛信息
·????? 每天處理200萬張圖片請求
·????? 每天服務(wù)端處理1億次請求
問題來了,流量變大之后,傳統(tǒng)的架構(gòu)顯得力不從心。同時,軟件交付流程也成為了瓶頸,來看看他們的痛點。
痛點
·????? 兩套操作系統(tǒng)和中間件
操作系統(tǒng)和中間件的選型不同,各自分別包含Websphere, Weblogic, Oracle Linux, Redhat Linux, AIX等等。
·????? 每套運行環(huán)境需要5份
包含開發(fā)者環(huán)境,功能測試環(huán)境,集成測試環(huán)境,性能測試環(huán)境,生產(chǎn)環(huán)境。
·????? 10個 Web 應(yīng)用,100多個服務(wù)需要部署。
由于環(huán)境的差異性,上線流程的復(fù)雜性,導(dǎo)致 Cars.com 的團(tuán)隊經(jīng)常碰到的問題是:為什么代碼在這個環(huán)境能運行,在另外一個環(huán)境不行?久而久之為團(tuán)隊帶來大量重復(fù)的定位環(huán)境問題的工作,嚴(yán)重影響了開發(fā)進(jìn)度。
?
?Cars.com 總結(jié)了他們的訴求 – 實現(xiàn)不可變基礎(chǔ)設(shè)施
·????? 統(tǒng)一上線流程。
·????? 具備實時擴展的能力,應(yīng)對高峰期流量。
·??????當(dāng)服務(wù)出現(xiàn)問題,能夠自動回滾,自動恢復(fù)。
使用 Docker 實現(xiàn)不可變基礎(chǔ)設(shè)施
為什么選擇 Docker?
·????? 提供一致性,可預(yù)期的環(huán)境。
使用 Docker 可以屏蔽環(huán)境的差異,解決維護(hù)5份環(huán)境的痛點。
·????? 實現(xiàn)微服務(wù)部署。
Cars.com 底層有100多個服務(wù),服務(wù)如果不能單獨部署,會有造成構(gòu)建時間長,上線周期長,排除問題困難等問題。 實現(xiàn)微服務(wù)的獨立部署,可以加速軟件上線速度,降低問題排除難度。
·????? 秒級故障恢復(fù)。
Docker 作為服務(wù)的載體,具備快速銷毀,快速上線,快速回滾的能力。一旦線上服務(wù)出問題,可以快速回滾到上一個版本。
·????? 實現(xiàn)藍(lán)綠部署,金絲雀發(fā)布。
快速發(fā)布環(huán)境,讓一部分用戶體驗?zāi)承┬鹿δ?#xff0c;待功能被快速驗證得到積極的反饋之后,再進(jìn)行大面積部署。
構(gòu)建一個通用 Docker 鏡像
為什么需要構(gòu)建通用的 Docker 鏡像?
·????? 公司內(nèi)部有很多鏡像,當(dāng)有新的環(huán)境需要搭建時,要把鏡像從倉庫一個一個都拷貝到開發(fā)者的機器。
·????? 多語言開發(fā)團(tuán)隊,包括 JavaScript,Java,Go 等等,每種語言打包的鏡像體積過大,導(dǎo)致鏡像構(gòu)建,下載速度慢,影響開發(fā)效率。
經(jīng)過一系列實踐,Cars.com 總結(jié)出來了通用鏡像的方案:
·????? 采用 Alpine Linux 作為基礎(chǔ)鏡像
Alpine Linux 系統(tǒng)的文件大小非常小,可以達(dá)到5MB。
·????? 輕量級的容器
????- 刪除 Package Manager 里面的所有Source。
????- 在軟件安裝完之后,刪除安裝包,刪除沒有用到的依賴,刪除臨時文件。
????- 剪裁官方鏡像。剪裁 Node 鏡像,Node 官方鏡像最新版達(dá)到了649MB,他們將這個鏡像縮減到55MB。JDK 縮減到122MB,Tomcat 從357MB 縮減到181MB。
?
在裁剪鏡像大小的實踐中,Artifactory 中的 Docker info 提供了幫助,可以在 Docker info 中看到每次打包的鏡像 Layer 的實際大小,通過裁剪每層 Layer 的大小,最終達(dá)到縮小鏡像的目的。
倉庫的需求
每個團(tuán)隊都有管理包的需求,開發(fā)者要管理 Jar,War,靜態(tài)文件,系統(tǒng) Admin 要管理不同的 Linux 發(fā)行版,每種語言都用不同的包管理系統(tǒng),維護(hù)這5,6種二進(jìn)制包倉庫非常麻煩,他們使用了 Artifactory 作為一站式包管理平臺。理由:
·????? 本地搭建的倉庫
大大提升所有語言構(gòu)建,打包的速度。
·????? 支持 NPM modules,Docker 注冊中心,Maven,Go。
·????? 支持 Linux 的包管理工具(RPM,Debian)。
·????? 和 Jenkins/Bamboo/MSBuild/TFS 等工具集成,收集構(gòu)建信息。
·????? 元數(shù)據(jù)支持,并且提供 Rest API。
Cars.com 通過為 Docker 鏡像,War 包設(shè)置元數(shù)據(jù),使得任何包都可以通過 Artifactory Query Language ?根據(jù)元數(shù)據(jù),過濾出符合上線條件的包,打包到鏡像里,部署到環(huán)境上。
封裝 Docker API – PowerTrain
? ? ? 為什么要封裝Docker API?
·????? 需要即時響應(yīng)快速上線,回滾,支持滾動升級,動態(tài)綁定端口。
·????? 保證開發(fā)者環(huán)境里能跑的應(yīng)用,在生產(chǎn)環(huán)境里也能跑,實現(xiàn)不可變基礎(chǔ)設(shè)施。
· ? ? ?聲明式配置管理。
PowerTrain 的配置文件 powertrain.mk 解決的問題是將不同環(huán)境中變化的部分,作為變量,存在文件里,當(dāng)需要生成某個環(huán)境時,只需將需要的變量傳遞給 PowerTrain,即可獲取對應(yīng)環(huán)境所需的依賴,實現(xiàn)按需搭建環(huán)境。
PowerTrain 也封裝了一些 Docker 的常用操作,例如 Docker build,pull,push 等等,在這基礎(chǔ)之上增加的一些定制化的信息,來適應(yīng)靈活的鏡像構(gòu)建和部署。利用 Docker 的輕量級部署特性,實現(xiàn)快速搭建環(huán)境,快速上線服務(wù)。PowerTrain 的具體的實現(xiàn)可以在 Carsdotcom 的 Github 上找到源代碼。
持續(xù)集成流水線
·????? 開發(fā)提交代碼到 Bitbucket。
·????? Commit 觸發(fā) Jenkins 的 Webhook, 執(zhí)行構(gòu)建。
·????? Jenkins 執(zhí)行 PowerTrain build。
·????? 從 Artifactory 找到對應(yīng)的 War 文件,基礎(chǔ)鏡像,構(gòu)建出新的鏡像。
·??????快速搭建測試環(huán)境,使用 Docker 作為載體運行 war 包,進(jìn)行測試(功能,接口,性能) 。
持續(xù)交付流水線
·????? 鏡像通過測試,會升級到 Artifactory 的生產(chǎn)倉庫。
·??????通過 Jenkins 觸發(fā) PowerTrain 命令,部署到生產(chǎn)環(huán)境。
要部署到不同的環(huán)境,只需要執(zhí)行不同的 powertrain.mk 文件,就能拉取不同的依賴,部署到不同的環(huán)境。
總結(jié)
Cars.com 通過一系列的實踐,完成了從傳統(tǒng) ?Java Web 應(yīng)用到容器化的轉(zhuǎn)型。得到的收獲:
·????? 使用 Docker 屏蔽之前5份環(huán)境的差異,實現(xiàn)一次構(gòu)建,處處運行,大大減少運維中的重復(fù)性工作。使用 ?PowerTrain 的配置文件,讓上線流程腳本化,實現(xiàn)不可變基礎(chǔ)設(shè)施。
·????? 使用 Artifactory 作為多語言的本地倉庫,大大提高獲取第三方依賴,和管理自研件的效率。
· ? ? ?剪裁 Docker 鏡像,實現(xiàn)輕量級鏡像發(fā)布,在突發(fā)流量到來時能夠?qū)崿F(xiàn)動態(tài)擴容,以及快速故障恢復(fù)。
作者;王青
目前任職 JFrog 中國首席架構(gòu)師,之前在 IBM,HPE,愛奇藝,新浪,VIPKID 等公司做過研發(fā)和架構(gòu),是有十多年開發(fā)經(jīng)驗的互聯(lián)網(wǎng)老兵,專注于軟件生命周期管理,微服務(wù)架構(gòu),云原生應(yīng)用,容器化等領(lǐng)域。
歡迎轉(zhuǎn)載,但轉(zhuǎn)載請注明作者與出處。謝謝!
總結(jié)
以上是生活随笔為你收集整理的传统 Java 网站如何实现容器化?看看 Cars.com 如何玩转 Docker!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年安徽省安全员C证考试资料及安徽
- 下一篇: 重要知识:身份证复印件的正确使用方法