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