微服務(wù)架構(gòu)通過(guò)將單體應(yīng)用分解為一組高內(nèi)聚低藕合的微服務(wù)應(yīng)用彌補(bǔ)了單體架構(gòu)在伸縮性、技術(shù)異構(gòu)性、中心化、可靠性等方面的缺陷。近來(lái)國(guó)內(nèi)以微服務(wù)為基礎(chǔ)的服務(wù)也有了一些落地,通過(guò)使用去中心化的服務(wù),用戶(hù)能夠快速的構(gòu)建一套屬于自己的獨(dú)立運(yùn)營(yíng)的應(yīng)用。
由于很多公司業(yè)務(wù)不斷擴(kuò)展,其原來(lái)基于單體架構(gòu)的軟件的擴(kuò)展變得越來(lái)越復(fù)雜。由于單體架構(gòu)往往是將功能、業(yè)務(wù)集中在一個(gè)發(fā)布包里并部署運(yùn)行在同一進(jìn)程中,所以往往一個(gè)業(yè)務(wù)上的不大的改動(dòng)將涉及整個(gè)系統(tǒng)改動(dòng)和測(cè)試。對(duì)人力要求越來(lái)越高。隨著微服務(wù)技術(shù)及產(chǎn)品的日趨成熟,越來(lái)越多的公司使用微服務(wù)架構(gòu)構(gòu)建的軟件支撐其業(yè)務(wù)。上面兩種架構(gòu)的示例如下圖所示。其中左邊為單體架構(gòu)示例,右邊為微服務(wù)示例。

在具體實(shí)踐中微服務(wù)常與Docker技術(shù)一起使用??梢哉f(shuō)在Docker出現(xiàn)之前微服務(wù)架構(gòu)是很難落地的。這是因?yàn)槲⒎?wù)需要在一套足夠"微小"的相互獨(dú)立環(huán)境中執(zhí)行。并且微服務(wù)可以被快速的構(gòu)建、銷(xiāo)毀、組合與重建。而這些都不是物理機(jī)與虛擬機(jī)所具備的。Docker技術(shù)中對(duì)容器的實(shí)現(xiàn)正好滿(mǎn)足了微服務(wù)架構(gòu)的實(shí)現(xiàn)環(huán)境。Docker技術(shù)通過(guò)實(shí)現(xiàn)虛擬化技術(shù)的容器工具將軟件分解為一系列微小的容器。每個(gè)容器承載一個(gè)服務(wù)。一臺(tái)計(jì)算機(jī)同時(shí)運(yùn)行多個(gè)容器,從而就能很輕松地模擬出復(fù)雜的微服務(wù)架構(gòu)。
什么是Docker?
Docker是docker.inc公司開(kāi)源基于LXC技術(shù)的開(kāi)源虛擬容器技術(shù)。盡管Docker常和容器聯(lián)系在一起。但Docker涉及實(shí)現(xiàn)虛擬化容器技術(shù)的一系列技術(shù),而容器(container)只是其中的一個(gè)組件。而容器這個(gè)概念在軟件設(shè)計(jì)與架構(gòu)中無(wú)處不在。小到數(shù)據(jù)結(jié)構(gòu)中的list、map、queue、array到web應(yīng)用的ejb container、java servlet container到Docker等都涉及容器的應(yīng)用。
Docker架構(gòu)
Docker的產(chǎn)品架構(gòu)如下圖所示:

Docker采用CS架構(gòu)(客戶(hù)端 - 服務(wù)器)。其客戶(hù)端與服務(wù)器端可位于同一臺(tái)物理機(jī)與虛擬機(jī)上)。也可以部署在不同的物理機(jī)或虛擬機(jī)上??蛻?hù)端與服務(wù)器端可通過(guò)socket和rest api進(jìn)行通信。Docker包含以下組件:
1) Docker daemon( Docker守護(hù)進(jìn)程)
Docker daemon是一個(gè)運(yùn)行在宿主機(jī)( DOCKER-HOST)的后臺(tái)進(jìn)程??赏ㄟ^(guò) Docker客戶(hù)端與之通信。
2) Client( Docker客戶(hù)端)
Docker客戶(hù)端是 Docker的用戶(hù)界面,它可以接受用戶(hù)命令和配置標(biāo)識(shí),并與 Docker daemon通信。圖中, docker build等都是 Docker的相關(guān)命令。
3) Images( Docker鏡像)
Docker鏡像是一個(gè)只讀模板,它包含創(chuàng)建 Docker容器的說(shuō)明。它和系統(tǒng)安裝光盤(pán)有點(diǎn)像,使用系統(tǒng)安裝光盤(pán)可以安裝系統(tǒng),同理,使用Docker鏡像可以運(yùn)行 Docker鏡像中的程序。
4) Container(容器)
容器是鏡像的可運(yùn)行實(shí)例。鏡像和容器的關(guān)系有點(diǎn)類(lèi)似于面向?qū)ο笾?,?lèi)和對(duì)象的關(guān)系。可通過(guò) Docker API或者 CLI命令來(lái)啟停、移動(dòng)、刪除容器。
5) Registry
Docker Registry是一個(gè)集中存儲(chǔ)與分發(fā)鏡像的服務(wù)。構(gòu)建完 Docker鏡像后,就可在當(dāng)前宿主機(jī)上運(yùn)行。但如果想要在其他機(jī)器上運(yùn)行這個(gè)鏡像,就需要手動(dòng)復(fù)制。此時(shí)可借助 Docker Registry來(lái)避免鏡像的手動(dòng)復(fù)制。
一個(gè) Docker Registry可包含多個(gè) Docker倉(cāng)庫(kù),每個(gè)倉(cāng)庫(kù)可包含多個(gè)鏡像標(biāo)簽,每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè) Docker鏡像。這跟 Maven的倉(cāng)庫(kù)有點(diǎn)類(lèi)似,如果把 Docker Registry比作 Maven倉(cāng)庫(kù)的話(huà),那么 Docker倉(cāng)庫(kù)就可理解為某jar包的路徑,而鏡像標(biāo)簽則可理解為jar包的版本號(hào)。
(未完。 持續(xù)更新中……)