與托管在傳統(tǒng)服務(wù)器或虛擬機(jī)上的應(yīng)用程序相比,無服務(wù)器計(jì)算和容器都使開發(fā)人員能夠以更少的開銷和更大的靈活性構(gòu)建應(yīng)用程序。開發(fā)人員應(yīng)該使用哪種架構(gòu)風(fēng)格取決于應(yīng)用程序的需求,但無服務(wù)器應(yīng)用程序更具可擴(kuò)展性并且通常更具成本效益。
什么是容器?
容器“包含”應(yīng)用程序和應(yīng)用程序正常運(yùn)行所需的所有元素,包括系統(tǒng)庫(kù)、系統(tǒng)設(shè)置和其他依賴項(xiàng)。就像“只需加水”的煎餅混合物一樣,容器只需要一件事——托管和運(yùn)行——就可以執(zhí)行它們的功能。
任何類型的應(yīng)用程序都可以在容器中運(yùn)行。無論托管在哪里,容器化應(yīng)用程序都將以相同的方式運(yùn)行。集裝箱可以很容易地在任何需要的地方移動(dòng)和部署,就像物理運(yùn)輸集裝箱一樣,它是標(biāo)準(zhǔn)尺寸的,因此可以通過各種運(yùn)輸工具(輪船、卡車、火車等)運(yùn)輸?shù)饺魏蔚胤剑瑹o論其內(nèi)容如何。
用技術(shù)術(shù)語來說,容器是一種將機(jī)器或服務(wù)器劃分為單獨(dú)的用戶空間環(huán)境的方法,這樣每個(gè)環(huán)境只運(yùn)行一個(gè)應(yīng)用程序,并且不與機(jī)器上的任何其他分區(qū)部分進(jìn)行交互。每個(gè)容器與其他容器共享機(jī)器的內(nèi)核(內(nèi)核是操作系統(tǒng)的基礎(chǔ),它與計(jì)算機(jī)的硬件交互),但它就像機(jī)器上唯一的系統(tǒng)一樣運(yùn)行。
容器與虛擬機(jī)
甲虛擬機(jī)是一個(gè)軟件模仿一個(gè)完整的計(jì)算機(jī)系統(tǒng)。它與托管它的機(jī)器的其余部分隔離,并且表現(xiàn)得好像它是其上唯一的操作系統(tǒng),包括擁有自己的內(nèi)核。虛擬機(jī)是在一臺(tái)服務(wù)器上托管多個(gè)環(huán)境的另一種常見方式,但它們比容器使用更多的處理能力。
什么是無服務(wù)器計(jì)算?
無服務(wù)器應(yīng)用程序被分解為功能,并由第三方供應(yīng)商托管,該供應(yīng)商僅根據(jù)每個(gè)功能運(yùn)行的時(shí)間量向應(yīng)用程序開發(fā)人員收費(fèi)。有關(guān)無服務(wù)器計(jì)算的更多信息,請(qǐng)參閱什么是無服務(wù)器計(jì)算?
無服務(wù)器計(jì)算和容器之間的主要區(qū)別是什么?
物理機(jī)器
“無服務(wù)器”計(jì)算實(shí)際上在服務(wù)器上運(yùn)行,但由無服務(wù)器供應(yīng)商根據(jù)應(yīng)用程序的需要來提供服務(wù)器空間;沒有為給定的功能或應(yīng)用程序分配特定的機(jī)器。另一方面,每個(gè)容器一次都存在于一臺(tái)機(jī)器上并使用該機(jī)器的操作系統(tǒng),但如果需要,它們可以很容易地移動(dòng)到不同的機(jī)器上。
可擴(kuò)展性
在基于容器的架構(gòu)中,部署的容器數(shù)量是由開發(fā)人員預(yù)先確定的。相比之下,在無服務(wù)器架構(gòu)中,后端會(huì)自動(dòng)擴(kuò)展以滿足需求。
繼續(xù)海運(yùn)集裝箱的比喻,一家航運(yùn)公司可以嘗試預(yù)測(cè)對(duì)某種產(chǎn)品的需求增加,然后將更多的集裝箱運(yùn)送到目的地以滿足該需求,但如果有需求,它就無法打響指并生產(chǎn)更多裝滿貨物的集裝箱超出預(yù)期。
無服務(wù)器架構(gòu)正是實(shí)現(xiàn)這一目標(biāo)的一種方式。在計(jì)算能力方面,無服務(wù)器計(jì)算就像現(xiàn)代家庭的供水系統(tǒng):通過打開水龍頭,消費(fèi)者可以隨時(shí)獲取和使用所需的水量,并且只需為所用的水量付費(fèi)。這比嘗試一次購(gòu)買一個(gè)桶或一個(gè)集裝箱的水更具可擴(kuò)展性。
成本
容器不斷運(yùn)行,因此即使當(dāng)時(shí)沒有人使用該應(yīng)用程序,云提供商也必須對(duì)服務(wù)器空間收費(fèi)。
無服務(wù)器架構(gòu)中沒有持續(xù)的費(fèi)用,因?yàn)槌钦{(diào)用應(yīng)用程序代碼,否則它不會(huì)運(yùn)行。相反,開發(fā)人員只需為其應(yīng)用程序?qū)嶋H使用的服務(wù)器容量付費(fèi)。
維護(hù)
容器托管在云中,但云提供商不會(huì)更新或維護(hù)它們。開發(fā)人員必須管理和更新他們部署的每個(gè)容器。
從開發(fā)人員的角度來看,無服務(wù)器架構(gòu)無需管理后端。供應(yīng)商負(fù)責(zé)運(yùn)行代碼的服務(wù)器的所有管理和軟件更新。
部署時(shí)間
與無服務(wù)器功能相比,容器的初始設(shè)置時(shí)間更長(zhǎng),因?yàn)樾枰渲孟到y(tǒng)設(shè)置、庫(kù)等。配置完成后,容器只需幾秒鐘即可部署。但由于無服務(wù)器功能比容器微服務(wù)小,并且不捆綁系統(tǒng)依賴項(xiàng),因此它們只需幾毫秒即可部署。上傳代碼后,無服務(wù)器應(yīng)用程序就可以上線。
測(cè)試
很難測(cè)試無服務(wù)器 Web 應(yīng)用程序,因?yàn)楹蠖谁h(huán)境很難在本地環(huán)境中復(fù)制。相比之下,容器無論部署在哪里都運(yùn)行相同,這使得在將基于容器的應(yīng)用程序部署到生產(chǎn)環(huán)境之前對(duì)其進(jìn)行測(cè)試相對(duì)簡(jiǎn)單。
無服務(wù)器計(jì)算和容器有何相似之處?
兩者都是基于云的,并且都大大降低了基礎(chǔ)設(shè)施開銷——無服務(wù)器計(jì)算比容器更重要。在這兩種架構(gòu)中,應(yīng)用程序都被分解并部署為更小的組件。在基于容器的架構(gòu)中,每個(gè)容器將運(yùn)行一個(gè)微服務(wù)。
什么是微服務(wù)?
微服務(wù)是應(yīng)用程序的一部分。每個(gè)微服務(wù)執(zhí)行一項(xiàng)服務(wù),多個(gè)集成的微服務(wù)組合起來組成應(yīng)用程序。雖然這個(gè)名字似乎暗示微服務(wù)很小,但它們不一定是。
將應(yīng)用程序構(gòu)建為一組微服務(wù)的優(yōu)點(diǎn)之一是開發(fā)人員可以一次更新一個(gè)微服務(wù),而不是在需要進(jìn)行更改時(shí)更新整個(gè)應(yīng)用程序。將應(yīng)用程序構(gòu)建為功能的集合,就像在無服務(wù)器架構(gòu)中一樣,提供了相同的好處,但在更細(xì)粒度的級(jí)別上。
開發(fā)人員應(yīng)該如何在無服務(wù)器架構(gòu)和容器之間做出選擇?
選擇無服務(wù)器架構(gòu)的開發(fā)人員將能夠快速發(fā)布和迭代新應(yīng)用程序,而不必?fù)?dān)心應(yīng)用程序是否可以擴(kuò)展。此外,如果應(yīng)用程序沒有看到一致的流量或使用情況,無服務(wù)器計(jì)算將比容器更具成本效益,因?yàn)榇a不需要不斷運(yùn)行。
容器讓開發(fā)人員可以更好地控制應(yīng)用程序運(yùn)行的環(huán)境(盡管這也需要更多的維護(hù))以及使用的語言和庫(kù)。正因?yàn)槿绱耍萜鲗?duì)于將遺留應(yīng)用程序遷移到云非常有用,因?yàn)樗梢愿咏貜?fù)制應(yīng)用程序的原始運(yùn)行環(huán)境。
最后,可以使用混合架構(gòu),其中一些無服務(wù)器功能和一些部署在容器中的功能。例如,如果一個(gè)應(yīng)用程序功能需要的內(nèi)存比無服務(wù)器供應(yīng)商分配的更多,如果一個(gè)功能太大,或者如果某些功能而不是其他功能需要長(zhǎng)時(shí)間運(yùn)行,則混合架構(gòu)使開發(fā)人員能夠獲得無服務(wù)器的好處,同時(shí)仍然使用容器來實(shí)現(xiàn)無服務(wù)器無法支持的功能。