自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

快速迭代 敏捷集成:Docker上運(yùn)行微服務(wù)之妙用

云計(jì)算
由七牛主辦的開(kāi)發(fā)者最佳實(shí)踐日第13期,成功邀請(qǐng)到對(duì)持續(xù)項(xiàng)目交付深有研究的ThoughtWorks首席咨詢師王磊、一站式Docker云平臺(tái)DaoCloud聯(lián)合創(chuàng)始人&研發(fā)副總裁郭峰、使用Docker應(yīng)用于電商場(chǎng)景的京東資深架構(gòu)師季錫強(qiáng)和對(duì)容器技術(shù)有著一定研究的七牛云CTO韓拓,分別就微服務(wù)架構(gòu)實(shí)踐、容器技術(shù)帶來(lái)的技術(shù)價(jià)值、微服務(wù)帶來(lái)的挑戰(zhàn)和解決目標(biāo)等方面的總結(jié)經(jīng)驗(yàn)分享給大家。

在過(guò)去的兩年里,微服務(wù)架構(gòu)已經(jīng)成了非常熱門的名詞,它出現(xiàn)在很多論壇、視頻、演講中。作為一種更靈活、可靠、開(kāi)放的架構(gòu),其應(yīng)用實(shí)踐也越來(lái)越多。因此,由七牛主辦的開(kāi)發(fā)者***實(shí)踐日第13期,成功邀請(qǐng)到對(duì)持續(xù)項(xiàng)目交付深有研究的ThoughtWorks***咨詢師王磊、一站式Docker云平臺(tái)DaoCloud聯(lián)合創(chuàng)始人&研發(fā)副總裁郭峰、使用Docker應(yīng)用于電商場(chǎng)景的京東資深架構(gòu)師季錫強(qiáng)和對(duì)容器技術(shù)有著一定研究的七牛云CTO韓拓,分別就微服務(wù)架構(gòu)實(shí)踐、容器技術(shù)帶來(lái)的技術(shù)價(jià)值、微服務(wù)帶來(lái)的挑戰(zhàn)和解決目標(biāo)等方面的總結(jié)經(jīng)驗(yàn)分享給大家。

微服務(wù)大探險(xiǎn)

軟件架構(gòu)是在考慮業(yè)務(wù)、技術(shù)能力、團(tuán)隊(duì)、可維護(hù)性、安全性、可靠性及可持續(xù)性等多重因素下對(duì)軟件內(nèi)部進(jìn)行的劃分。通過(guò)劃分,讓軟件內(nèi)部不同的部分之間能夠相互鼓勵(lì),又能夠相互協(xié)作,同時(shí)給用戶提供最終的價(jià)值。但什么是微服務(wù)架構(gòu)呢?ThoughtWorks***咨詢師王磊通過(guò)一個(gè)互聯(lián)網(wǎng)門戶案例為大家解釋了微服務(wù)架構(gòu)的概念,以及它如何影響傳統(tǒng)的軟件架構(gòu)設(shè)計(jì)。

一年前,該門戶每簽一個(gè)10萬(wàn)的合同所耗費(fèi)的成本是3.5天。他們當(dāng)時(shí)的CRM結(jié)構(gòu)是典型的三層架構(gòu),整個(gè)應(yīng)用程序由一個(gè)40萬(wàn)行的代碼庫(kù)組成,后端有一個(gè)主動(dòng)的數(shù)據(jù)庫(kù)。雖然使用三層架構(gòu)的成本比較小,但隨著代碼和功能的增加,代碼庫(kù)不斷膨脹,修改代碼存在的風(fēng)險(xiǎn)很大,整個(gè)維護(hù)成本也變得越來(lái)越高。

每當(dāng)開(kāi)發(fā)人員提交代碼后,所需的數(shù)據(jù)集成和構(gòu)建需要50分鐘,意味著每天8小時(shí)工作時(shí)間最多能有9次代碼提交。但為了系統(tǒng)的穩(wěn)定性,持續(xù)集成過(guò)程中要盡量避免提交代碼,因此,整個(gè)團(tuán)隊(duì)的交付能力受到了限制。此外,從準(zhǔn)備部署包到上線需要3天,3天后才能讓用戶真正用到部署包,才能實(shí)現(xiàn)價(jià)值。而如果增加新人,要開(kāi)發(fā)新的環(huán)境,包括測(cè)試和產(chǎn)品環(huán)境,培養(yǎng)周期會(huì)很長(zhǎng)。針對(duì)以上難題,ThoughtWorks制定了如何在團(tuán)隊(duì)中對(duì)系統(tǒng)進(jìn)行改造從而滿足業(yè)務(wù)需求的策略。

將現(xiàn)有的系統(tǒng)保護(hù)起來(lái),把所有開(kāi)發(fā)新功能的優(yōu)先級(jí)都降下來(lái),只需對(duì)系統(tǒng)做最緊急的修改,其他和部門進(jìn)行協(xié)商,讓團(tuán)隊(duì)保持新的精力和時(shí)間在重要的業(yè)務(wù)上。

功能剝離。通過(guò)定義新服務(wù),在前端用一些代碼的機(jī)制讓用戶逐漸訪問(wèn)新服務(wù),可以達(dá)到從原有系統(tǒng)抽出小功能,讓客戶訪問(wèn)小功能。

數(shù)據(jù)解耦。對(duì)于龐大的系統(tǒng),因?yàn)闊o(wú)法很快將所有系統(tǒng)換掉,所以為了保證系統(tǒng)仍然可用,要啟用數(shù)據(jù)同步機(jī)制,讓服務(wù)里的數(shù)據(jù)同步到原有數(shù)據(jù)庫(kù)。

漸進(jìn)替換。通過(guò)不斷地運(yùn)行以上策略,將原有系統(tǒng)的復(fù)雜功能抽離出來(lái)用新的方式來(lái)做。

目前,每簽一個(gè)10萬(wàn)的合同所耗費(fèi)的成本由3.5天變?yōu)?天,持續(xù)集成構(gòu)建從50鐘降低到18分鐘,團(tuán)隊(duì)成員從10人降到7人,部署周期由3天降到2小時(shí)。

對(duì)于每個(gè)應(yīng)用程序,可能有一組小的服務(wù)組成,每個(gè)服務(wù)運(yùn)行在自己的進(jìn)程中,服務(wù)與服務(wù)之間通過(guò)輕量級(jí)的機(jī)制進(jìn)行交互。那么,如何使用微服務(wù)做系統(tǒng)改造呢?

為每個(gè)服務(wù)建立獨(dú)立的環(huán)境,包括基礎(chǔ)設(shè)施、持續(xù)集成環(huán)境、運(yùn)維、監(jiān)控、日志聚合、報(bào)警。

不斷演進(jìn)的微服務(wù)開(kāi)發(fā)模板,發(fā)現(xiàn)問(wèn)題及時(shí)修改,讓模板更高效。

輕量級(jí)的通信協(xié)議。

消費(fèi)者的契約測(cè)試,解決隨著服務(wù)增多帶來(lái)集成測(cè)試效率低的問(wèn)題。

基礎(chǔ)設(shè)施自管理,幫助管理自己需要的資源。

Container為微服務(wù)帶來(lái)了什么?

七牛云CTO 韓拓從服務(wù)端的架構(gòu)和運(yùn)維兩個(gè)方面介紹了Container和微服務(wù)帶來(lái)的價(jià)值。他認(rèn)為Container是基于內(nèi)核的空間。一個(gè)操作系統(tǒng)的內(nèi)核主要管理資源,把服務(wù)器交給操作系統(tǒng)的內(nèi)核,它把內(nèi)存、CPU和硬盤等資源管理起來(lái)。Container進(jìn)一步做隔離,這個(gè)隔離以進(jìn)程為單位,讓一個(gè)進(jìn)程只能看到這個(gè)網(wǎng)卡收發(fā)的數(shù)據(jù),但是看不到其他的網(wǎng)卡。

Container有以下幾個(gè)名字空間。

網(wǎng)絡(luò)的空間,它隔離了和網(wǎng)絡(luò)相關(guān)的資源,如服務(wù)器上的網(wǎng)卡、IP地址、服務(wù)表等,之后這個(gè)進(jìn)程在某個(gè)網(wǎng)絡(luò)的空間內(nèi)運(yùn)行就看不到其他空間相關(guān)的網(wǎng)絡(luò)資源。

文件系統(tǒng),這個(gè)名字空間把這類資源也進(jìn)行了隔離。一個(gè)進(jìn)程運(yùn)行時(shí)看到的根目錄可能不是操作系統(tǒng)原生的根目錄,看到的塊設(shè)備也不是原來(lái)的塊設(shè)備。

PID,每運(yùn)行一個(gè)進(jìn)程都有一個(gè)PID,現(xiàn)在內(nèi)核里的名字空間,PID的資源也被隔離起來(lái)。

Container對(duì)系統(tǒng)調(diào)用做了權(quán)限的控制。例如一個(gè)進(jìn)程啟動(dòng)的時(shí)候限制它的權(quán)限,讓很多系統(tǒng)調(diào)用做不了。Container的作用包括鏡像管理和運(yùn)行實(shí)例的管理,還有輸入輸出的管理。

那么,Container對(duì)服務(wù)端架構(gòu)有什么影響呢?

七牛CTO韓拓認(rèn)為不管做什么架構(gòu),很重要的工作是換模塊,去定義這個(gè)模塊的邊界,怎么工作、怎么測(cè)試及在生產(chǎn)環(huán)境如何部署。因此,從組件的角度看微服務(wù)化主要有以下三點(diǎn)。

組件劃分的方式,Container以功能為單位來(lái)劃分組件的邊界。

組件物理邊界,以前的邊界有靜態(tài)或動(dòng)態(tài)的庫(kù),模塊間的邊界通常是函數(shù)調(diào)用。而微服務(wù)組件的物理邊界是網(wǎng)絡(luò),這些組件都是獨(dú)立的、可編譯的進(jìn)程(即每個(gè)單獨(dú)的服務(wù)實(shí)例),這些服務(wù)實(shí)例之間通過(guò)網(wǎng)絡(luò)來(lái)溝通。

組件的依賴方式,以前是在編譯期考慮怎么才能把ESC可執(zhí)行程序編譯出來(lái),只要編譯出來(lái),就能肯定依賴關(guān)系肯定被解決了。當(dāng)微服務(wù)化之后,依賴方式的處理被延后了,延后到運(yùn)行的時(shí)候,因此錯(cuò)誤被延后了,組件間的依賴方式變復(fù)雜了。Container中組件間的依賴可通過(guò)渲染文件和環(huán)境變量等實(shí)現(xiàn)。

關(guān)于Container對(duì)運(yùn)維的影響,主要是告別DevOps。作為勇敢的DevOps實(shí)踐者,七牛認(rèn)為,DevOps的核心是試圖尋找一個(gè)合理的開(kāi)發(fā)和運(yùn)維的邊界。有很多方法論尋找這個(gè)邊界,DevOps是其中一種,主要將運(yùn)維平臺(tái)化,做監(jiān)控平臺(tái)、日志平臺(tái)等。

在持續(xù)集成方面,以前的任何一行代碼做了更變都要把整個(gè)業(yè)務(wù)重新做一遍,需要很長(zhǎng)時(shí)間。微服務(wù)化之后,每個(gè)模塊獨(dú)立編譯、獨(dú)立打包、獨(dú)立測(cè)試,其邊界也很明確,代碼的變更影響的是一個(gè)組件和服務(wù),單獨(dú)進(jìn)行編譯和測(cè)試的動(dòng)作會(huì)很快。

部署和升級(jí)方面變得簡(jiǎn)單,可以獨(dú)立地部署和升級(jí)。

資源規(guī)劃方面,按峰值申請(qǐng)資源會(huì)存在資源浪費(fèi)。微服務(wù)化后,可以按模塊去擴(kuò)容。對(duì)資源的規(guī)劃更靈活和合理。尤其再結(jié)合Container,因?yàn)镃ontainer以進(jìn)程為單位,它對(duì)資源的使用是競(jìng)爭(zhēng)的,不需要提前規(guī)劃。

網(wǎng)絡(luò)方面,Container一般通過(guò)端口映射的方式做網(wǎng)絡(luò)。

監(jiān)控方面,業(yè)務(wù)的運(yùn)行狀態(tài)對(duì)運(yùn)維來(lái)講更透明,小的服務(wù)可以單獨(dú)監(jiān)控,一些問(wèn)題出來(lái)之后可以做報(bào)警。但監(jiān)控變多了,需要監(jiān)控系統(tǒng)更智能。

***在高可用方面,傳統(tǒng)的架構(gòu)會(huì)做成透明的?,F(xiàn)在,高可用由外部的框架完成,例如在做服務(wù)間依賴時(shí)就可以做高可用,不僅屏蔽了服務(wù)在哪里,服務(wù)了多少人,而且還可以把服務(wù)是死是活的細(xì)節(jié)屏蔽掉。

Micro Service,Continuous Delivery and Docker

DaoCloud聯(lián)合創(chuàng)始人&研發(fā)副總裁郭峰認(rèn)為容器技術(shù)解決了原來(lái)PaaS技術(shù)不能解決的問(wèn)題。于是他給大家展示了微服務(wù)帶來(lái)的挑戰(zhàn),即如果將一個(gè)應(yīng)用微服務(wù)化,那么很容易導(dǎo)致一臺(tái)機(jī)器上跑很多程序。因?yàn)榉?wù)糾纏在一起,所以微服務(wù)需要運(yùn)用自包含。DaoCloud的容器技術(shù)是把最古老的幾個(gè)技術(shù)融合在一起,用了一個(gè)很方便的腳本化的工具,讓大家都可以用起來(lái)。它提供了標(biāo)準(zhǔn)化的鏡像,不僅方便地用容器,而且可以方便地發(fā)布容器。

容器和虛擬機(jī)是什么關(guān)系呢?虛擬機(jī)有物理環(huán)境、有操作系統(tǒng),但容器下面是server,上面跑應(yīng)用程序和庫(kù),這樣的架構(gòu)使得容器的性能比虛擬機(jī)好很多。首先沒(méi)有虛擬機(jī)的虛擬化過(guò)程,直接把跑內(nèi)核的進(jìn)程跑到OS上。別人想發(fā)一個(gè)微服務(wù),可以利用在鏡像上面加一層,即使有很多鏡像,有時(shí)多個(gè)鏡像會(huì)一起依賴,會(huì)省資源和容量。那么,為什么容器是輕量級(jí)的?因?yàn)樗挥袘?yīng)用和應(yīng)用的依賴所打成的包,如果應(yīng)用做了一點(diǎn)點(diǎn)修改,不需要完全打一個(gè),在原有的運(yùn)用上打一個(gè)補(bǔ)丁,把修改記下來(lái)即可。

 

 

上圖是Docker的流程圖, Dockerfile這個(gè)鏡像可以運(yùn)行在本機(jī)。在上面運(yùn)行容器,等容器開(kāi)發(fā)好并且測(cè)試通過(guò)了再把這個(gè)容器push到鏡像倉(cāng)庫(kù)上。任何一個(gè)人都可以從鏡像倉(cāng)庫(kù)上下載,下載后,Docker運(yùn)行一套命令讓行為一致。重要的是,Docker官方維護(hù)了DockerHA,所以Docker允許以鏡像的方式發(fā)布Container,發(fā)布的Container像未來(lái)的VM,這個(gè)VM很輕量,大家可以把它pull下來(lái),不管用什么物理硬件資源,都可以讓Docker運(yùn)行起來(lái),而且運(yùn)行結(jié)果和其他沒(méi)有差別。Docker是如何做到自包含的呢? Docker的自包含是它容器的本身包括了OS的版本,以及依賴的環(huán)境和客戶,所有的都描述成Dockerfile。Docker可以幫助兩類人——開(kāi)發(fā)人員和運(yùn)維人員,它跨越了開(kāi)發(fā)和運(yùn)維間的那道鴻溝。

僅僅自包含就做微服務(wù)是不夠的,微服務(wù)要求把之前大系統(tǒng)的問(wèn)題分解為很多簡(jiǎn)單的小問(wèn)題,然后將每個(gè)簡(jiǎn)單的小問(wèn)題用最合適的技術(shù)實(shí)現(xiàn)。但這導(dǎo)致現(xiàn)在有很多小應(yīng)用,原來(lái)靠人工可以解決的事現(xiàn)在解決不了,比如做CI(持續(xù)集成)/CD(持續(xù)交付)。微服務(wù)化以后,會(huì)導(dǎo)致一個(gè)企業(yè)的應(yīng)用CI很難做。

此外,他還向大家介紹了Docker的三件法寶。***個(gè)是Docker Compose,如果應(yīng)用不是單應(yīng)用可以用同一方法描述應(yīng)用和應(yīng)用的依賴,然后上線。第二個(gè)是Volumes,可以共享文件。***一個(gè)是環(huán)境變量,不管是微服務(wù)和微服務(wù)之間的依賴以及微服務(wù)運(yùn)行時(shí)的依賴的環(huán)境變量也好,還是端口也好,都描述清楚,定義好后給運(yùn)維人員。這是可復(fù)制的迭加過(guò)程,不僅把代碼和運(yùn)行做自包含變成一個(gè)鏡像,而且鏡像用運(yùn)行的方式提供出來(lái)。運(yùn)維人員不需要關(guān)心應(yīng)用內(nèi)部的邏輯,只需要關(guān)心模塊的鏡像以及如何將鏡像運(yùn)行起來(lái),這樣可以大大地減少運(yùn)維成本。

Docker的應(yīng)用與實(shí)踐

來(lái)自京東的資深架構(gòu)師季錫強(qiáng)分享了Docker的應(yīng)用與實(shí)踐。主要講了Docker的系統(tǒng)整體架構(gòu)及其技術(shù)實(shí)現(xiàn)、鏡像存儲(chǔ)部分、Container啟動(dòng)流程,還介紹了制作鏡像命令的原理以及volume掛載的原理。

他為大家介紹了Docker的組件,Docker真正的實(shí)現(xiàn)主要是幾個(gè)組件組成,***層是鏡像存儲(chǔ)的模塊,實(shí)現(xiàn)有很多種,比如device mapper、aufs以及btrfs。第二層是exec driver,主要是libcontainer及l(fā)xc。第三層是network driver,主要是主機(jī)以及網(wǎng)絡(luò)命名空間,而Namespace支持ipc、mnt、pid、net、uts及user。組件CGroup主要做資源控制,涉及的方面有CPU、IO,IO可以不依賴于Namespace單獨(dú)使用,和操作文件一樣改一下值就可以。CGroup的限制主要是通過(guò)子系統(tǒng)來(lái)實(shí)現(xiàn),相應(yīng)的模塊有IO、CPU等。而組件Device Mapper的實(shí)現(xiàn)有DM – thin provision。

 

 

上圖是啟動(dòng)容器的流程。啟動(dòng)的命令請(qǐng)求首先會(huì)把設(shè)備mount到指定的掛載點(diǎn)上訪問(wèn)。啟動(dòng)go monitor會(huì)帶著參數(shù)啟動(dòng)里面的命令,接下來(lái)會(huì)用Dockerinit做初始化,最終命令會(huì)進(jìn)行系統(tǒng)調(diào)用,再exec執(zhí)行。停止容器則比較粗暴,相當(dāng)于Docker根據(jù)PID直接將容器中的進(jìn)程殺掉,再做一些資源的釋放,這樣就完成了停止容器的流程。Docker啟動(dòng)的時(shí)候,如果Docker是意外死掉的(人為或者程序的破壞),那么之前的程序不會(huì)消失,這時(shí)候Docker會(huì)把所有的容器kill掉,會(huì)把之前容器創(chuàng)建的操作信息保存在Docker的目錄下。Docker將所有的容器都kill掉后,資源會(huì)被釋放,這個(gè)時(shí)候就會(huì)觸發(fā)一個(gè)***性的bug。因?yàn)楫?dāng)容器重啟的時(shí)候,會(huì)檢查mount count,這個(gè)初始化的值是0,而Docker死掉后重啟則會(huì)發(fā)現(xiàn)mount count不為0,所以會(huì)導(dǎo)致mount失敗,導(dǎo)致出錯(cuò);這個(gè)時(shí)候我們想啟動(dòng)容器的話,關(guān)鍵的動(dòng)作是把設(shè)備釋放并重新掛載到mount下。因此,告誡大家,如果Docker異常死掉了,要及時(shí)清理資源。

關(guān)于制作鏡像的原理,你可以建立一個(gè)鏡像生成一個(gè)容器,這個(gè)鏡像可以分到某一個(gè)文件目錄下,可以做一些直接的操作。首先mount上去,鏡像原來(lái)的版本也會(huì)mount上去,遍歷所有的文件看兩者之間的狀態(tài)是否有變化,然后打包,產(chǎn)生diff。這時(shí)要?jiǎng)?chuàng)建新的容器,因?yàn)橐呀?jīng)獲得了diff,接下來(lái)要?jiǎng)?chuàng)建一個(gè)新的鏡像。創(chuàng)建新的鏡像之前要拿到Container的基本鏡像,這時(shí)要把這個(gè)鏡像mount,就可以看到所有的文件。***的操作是解壓一個(gè)文件到一個(gè)新的snapshot,就相當(dāng)于有一個(gè)新的鏡像了。

***,他對(duì)Docker做了一些總結(jié),Docker主要用到CGroup的一部分子系統(tǒng);Docker啟動(dòng)和停止之間有一個(gè)大Bug需要及時(shí)關(guān)注;commit要打包、解壓文件,機(jī)器磁盤很高的時(shí)候commit會(huì)相當(dāng)耗時(shí)。

以上是牛小七對(duì)本期開(kāi)發(fā)者***實(shí)踐日內(nèi)容的概括性介紹,如需獲取詳細(xì)的演講信息和往期內(nèi)容回顧,可以訪問(wèn)活動(dòng)專題。

「開(kāi)發(fā)者***實(shí)踐日」是由七牛云存儲(chǔ)發(fā)起并聯(lián)合各方小伙伴為開(kāi)發(fā)者舉辦的系列技術(shù)沙龍,關(guān)注開(kāi)發(fā)者在實(shí)際應(yīng)用中可能遇到的技術(shù)問(wèn)題。致力于為勇于創(chuàng)新的開(kāi)發(fā)者們提供行業(yè)內(nèi)最前沿最熱門的技術(shù)干貨,以技術(shù)驅(qū)動(dòng)應(yīng)用創(chuàng)新,讓更多的開(kāi)發(fā)者享受技術(shù)帶來(lái)的生活樂(lè)趣。

責(zé)任編輯:老門
相關(guān)推薦

2016-07-29 15:49:58

DockerKubernetesMongoDB

2023-12-05 16:01:12

模板方法設(shè)計(jì)模式算法結(jié)構(gòu)

2022-08-12 07:39:30

數(shù)字化集成微服務(wù)

2023-09-26 07:34:24

Docker部署依賴包

2016-06-03 09:59:43

微服務(wù)架構(gòu)敏捷

2025-02-12 08:52:44

2016-07-12 17:29:40

Docker阿里云技術(shù)峰會(huì)

2018-01-25 11:31:29

IBM微服務(wù)架構(gòu)

2020-07-20 18:30:44

Fedora 32DockerLinux

2010-01-26 20:01:47

運(yùn)維管理網(wǎng)絡(luò)危機(jī)摩卡軟件

2025-04-23 08:55:00

函數(shù)編程JavaScript

2017-02-16 10:15:43

Windows7docker變量

2022-08-09 12:27:37

API集成微服務(wù)

2021-06-22 18:00:09

微服務(wù)架構(gòu)系統(tǒng)

2020-04-21 15:20:12

微服務(wù)架構(gòu)實(shí)踐

2020-08-12 10:48:44

開(kāi)發(fā)

2017-05-25 10:32:41

Docker微服務(wù)容器

2019-07-12 14:41:31

微服務(wù)Kubernetes容器

2018-04-20 10:38:25

2021-02-02 14:39:03

微服務(wù)架構(gòu)數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)