微服務(wù)架構(gòu)開發(fā)實(shí)戰(zhàn):如何實(shí)現(xiàn)微服務(wù)的自動(dòng)擴(kuò)展?
如何實(shí)現(xiàn)微服務(wù)的自動(dòng)擴(kuò)展
前面講了一些關(guān)于自動(dòng)擴(kuò)展的理論知識(shí),但如何實(shí)現(xiàn)自動(dòng)擴(kuò)展,并不是三言兩語就能夠說得清楚的。特別是為了實(shí)現(xiàn)前面提到的那些自動(dòng)擴(kuò)展的模式及策略,在操作系統(tǒng)級別方面會(huì)需要大量的執(zhí)行腳本。在自動(dòng)擴(kuò)展方面,SpringCloud框架也并沒有給出確切的答案。
隨著微服務(wù)架構(gòu)的流行,以Docker等為首的容器技術(shù)開始火熱發(fā)展。Docker 是實(shí)現(xiàn)自動(dòng)擴(kuò)展非常好的基礎(chǔ),因?yàn)樗峁┝艘粋€(gè)統(tǒng)一-的容 器處理方式,而不管微服務(wù)所使用的技術(shù)如何。它還幫助用戶隔離微服務(wù),以避免相鄰的服務(wù)之間產(chǎn)生資源的競爭。
但是,Docker 和腳本只能部分解決問題。在大規(guī)模Docker部署的情況下,仍然需要回答如下問題。
●如何管理數(shù)千個(gè)容器?
●如何監(jiān)控他們?
●在部署工件時(shí),如何應(yīng)用規(guī)則和約束?
●如何確保能夠正確地利用容器來獲得資源效率?
●如何確保至少有一定數(shù)量的最小實(shí)例正在運(yùn)行?
如何確保依賴服務(wù)正常運(yùn)行?
●如何進(jìn)行滾動(dòng)升級和優(yōu)雅的遷移?
●如何回滾錯(cuò)誤的部署?
所有這些問題都指出需要有一個(gè)解決方案來解決以下兩個(gè)關(guān)鍵功能。
●一個(gè)容器抽象層,在許多物理或虛擬機(jī)上提供統(tǒng)一的抽象 。
●容器編排和初始化系統(tǒng)在集群抽象之上智能管理部署。
本節(jié)將會(huì)重點(diǎn)討論這兩點(diǎn)。

容器編排
容器編排工具為開發(fā)人員和基礎(chǔ)架構(gòu)團(tuán)隊(duì)提供了一個(gè)抽象層來處理大規(guī)模的集裝箱部署。容器編排工具提供的功能因供應(yīng)商而異。然而,他們都提供了共同的功能,其中包括發(fā)現(xiàn)、資源管理、監(jiān)控和部署。
1.容器編排的重要性
編排很重要,是因?yàn)樵谖⒎?wù)的架構(gòu)里面,應(yīng)用程序被拆分成不同的微服務(wù)應(yīng)用,因此需要更多的服務(wù)器節(jié)點(diǎn)進(jìn)行部署。為了正確管理微服務(wù),開發(fā)人員傾向于為每個(gè)虛擬機(jī)部署一個(gè)微服務(wù) ,這在一定程度上:降低了資源利用率。在很多情況下,這會(huì)導(dǎo)致CPU和內(nèi)存的過度分配。
在大型系統(tǒng)的部署中,微服務(wù)的高可用性要求迫使運(yùn)維人員會(huì)添加越來越多的服務(wù)實(shí)例以實(shí)現(xiàn)冗余。實(shí)際上,雖然它提供了所需的高可用性,但這會(huì)導(dǎo)致未充分利用的服務(wù)器實(shí)例。一般來說,與單一應(yīng)用程序部署相比,微服務(wù)部署需要更多的基礎(chǔ)設(shè)施。由于基礎(chǔ)設(shè)施成本的增加,反而令許多組織看不到微服務(wù)的價(jià)值。如圖14-9 所示,為了實(shí)現(xiàn)系統(tǒng)的高可用性,每個(gè)微服務(wù)都會(huì)部署多個(gè)實(shí)例。

為了解決圖14-9 中所述的問題,首先需要一個(gè)能夠執(zhí)行以 下操作的工具。
●自動(dòng)執(zhí)行一些活動(dòng)。例如,高效地將容器分配給基礎(chǔ)設(shè)施,這對開發(fā)人員和管理員來說是透明的。
●為開發(fā)人員提供一個(gè)抽象層,以便他們可以將其應(yīng)用程序部署到數(shù)據(jù)中心,而無須關(guān)心到底應(yīng)用是要使用哪臺(tái)機(jī)器。
可以是最少的人為交互。
●通過最大限度地利用可用資源來高效構(gòu)建、部署和管理應(yīng)用程序。
容器正是能夠勝任上述工作的有力工具。使用容器,就可以以統(tǒng)一的方式來處理應(yīng)用程序, 而無須關(guān)心微服務(wù)具體是使用了哪種技術(shù)。
2.容器編排的工作職責(zé)
典型的容器編排工具有助于虛擬化- -組計(jì)算機(jī)并將其作為- -個(gè)集群進(jìn)行管理。容器協(xié)調(diào)工具還有助于將工作負(fù)載或容器移動(dòng)到對用戶透明的機(jī)器上。
對于容器編排,業(yè)界并沒有統(tǒng)-的術(shù)語,常見的稱呼有容器編排、集群管理、數(shù)據(jù)中心虛擬化、容器調(diào)度、容器生命周期管理、數(shù)據(jù)中心操作系統(tǒng)等。
容器編排工具是為了幫助自助服務(wù)和配置基礎(chǔ)設(shè)施,而不是要求基礎(chǔ)設(shè)施團(tuán)隊(duì)按照預(yù)定義的規(guī)格分配所需的機(jī)器。在這種自動(dòng)化的容器編排方法中,機(jī)器不再是預(yù)配置并預(yù)先分配給應(yīng)用程序。
一些容器編排工具還可以幫助跨多個(gè)異構(gòu)機(jī)器,甚至可以跨多個(gè)虛擬化數(shù)據(jù)中心,并創(chuàng)建-一個(gè)彈性的私有云式基礎(chǔ)架構(gòu)。
容器編排工具目前沒有標(biāo)準(zhǔn)的參考模型。因此,不同的供應(yīng)商可能實(shí)現(xiàn)的功能各不相同。
容器編排軟件一般都會(huì)具備以下關(guān)鍵功能。
●集群管理:將一個(gè)虛擬機(jī)和物理機(jī)集群作為- -臺(tái)大型機(jī)器進(jìn)行管理。這些機(jī)器在資源能力方面可能是異構(gòu)的,但基本上還是以Linux 為主要操作系統(tǒng)的機(jī)器。這些虛擬集群可以在云端,也可以是在本地,或者是兩者的組合。
●自動(dòng)部署:它支持應(yīng)用程序容器的多個(gè)版本,并支持在大量集群機(jī)器上進(jìn)行滾動(dòng)升級。這些工具也能夠處理錯(cuò)誤,并且可以回滾到可用的版本。
●可伸縮性:這樣可以根據(jù)需要處理應(yīng)用程序?qū)嵗淖詣?dòng)和手動(dòng)可伸縮性,并將其作為主要目標(biāo)進(jìn)行優(yōu)化利用。
● 運(yùn)行狀況監(jiān)控:適用于管理集群、節(jié)點(diǎn)和應(yīng)用程序的運(yùn)行狀況。它可以從集群中刪除有故障的機(jī)器和應(yīng)用程序?qū)嵗?/p>
●基礎(chǔ)架構(gòu)抽象:開發(fā)者不用擔(dān)心關(guān)于機(jī)器、容量等。這完全是容器編排軟件來決定如何計(jì)劃和運(yùn)行應(yīng)用。這些工具還從開發(fā)者中抽象出機(jī)器的細(xì)節(jié),如容量、利用率和位置等。對于應(yīng)用程序所有者來說,這相當(dāng)于- - 臺(tái)幾乎可以無限容量的大型機(jī)器。
● 資源優(yōu)化:這些工具的固有行為是以高效的方式在一組可用機(jī)器上分配容器工作負(fù)載,從而降低成本,并提高機(jī)器的利用率。
●資源分配:根據(jù)應(yīng)用程序開發(fā)人員設(shè)置的資源可用性和約束來分配服務(wù)器。資源分配將基于這些約束(如關(guān)聯(lián)性規(guī)則、端口要求、應(yīng)用程序依賴性、運(yùn)行狀況等)。
●服務(wù)可用性:確保服務(wù)在集群中的某處運(yùn)行。在發(fā)生機(jī)器故障的情況下,容器編排通過在集群中的某個(gè)其他機(jī)器上重新啟動(dòng)這些服務(wù)來自動(dòng)處理故障。
●敏捷性:敏捷性工具能夠快速將工作負(fù)載分配給可用資源,或者在資源需求發(fā)生變化時(shí)將工作負(fù)載移至機(jī)器上。此外,還可以根據(jù)業(yè)務(wù)關(guān)鍵性、業(yè)務(wù)優(yōu)先級等設(shè)置約束來重新調(diào)整資源。
●隔離:這些工具中有一些提供了開箱即用的資源隔離功能。因此,即使應(yīng)用程序沒有進(jìn)行容器化,也可以實(shí)現(xiàn)資源的隔離。
3.資源分配的常用算法
從簡單算法到具有機(jī)器學(xué)習(xí)和人工智能的復(fù)雜算法,在容器編排中,資源分配會(huì)使用各種算法。
比較常用的算法有傳播( Spread)、裝箱( Bin Packing )和隨機(jī)( Random)。針對應(yīng)用程序設(shè)置的約束,來設(shè)置基于資源可用性的默認(rèn)算法。
圖14-10~圖14-12 顯示了這些算法是如何用部署填充到可用的機(jī)器上的。在這種情況下,這里用兩臺(tái)機(jī)器進(jìn)行演示。

資源分配的3種常用策略解釋如下。
●傳播:這將工作負(fù)載平均分配到可用的機(jī)器上,如圖14-10所示。
●裝箱: 這將試圖通過機(jī)器填充機(jī)器,并確保機(jī)器的最大利用率。在按需付費(fèi)的云服務(wù)中,裝箱算法是特別好的。
隨機(jī):隨機(jī)選擇機(jī)器并在隨機(jī)選擇的機(jī)器上部署容器,如圖14-12所示。

隨著科技的發(fā)展,機(jī)器學(xué)習(xí)和協(xié)作過濾等手段可以更好地提高效率。例如,可以將未分配的資源分配給高優(yōu)先級的任務(wù)( 這些任務(wù)意味著有更高的收益),以便充分利用現(xiàn)有資源,提高創(chuàng)收。
4.與微服務(wù)的關(guān)系
微服務(wù)的基礎(chǔ)設(shè)施(如果配置不當(dāng))很容易導(dǎo)致基礎(chǔ)設(shè)施過大,本質(zhì)上導(dǎo)致成本的增加。正如前面部分所討論的那樣,在處理大規(guī)模微服務(wù)架構(gòu)系統(tǒng)時(shí),具有容器編排工具的類似云的環(huán)境對于實(shí)現(xiàn)成本效益至關(guān)重要。
在Spring Cloud 項(xiàng)目中利用Spring Boot來構(gòu)建微服務(wù),是利用容器編排技術(shù)的理想工具。由于基于Spring Cloud的微服務(wù)并不關(guān)心具體的位置,因此可以將這些服務(wù)部署到集群中的任何位置。
每當(dāng)出現(xiàn)服務(wù)時(shí),它都會(huì)自動(dòng)注冊到服務(wù)注冊中心并通告其可用性。另外,消費(fèi)者總是尋找服務(wù)注冊表來發(fā)現(xiàn)可用的服務(wù)實(shí)例。這樣,應(yīng)用程序就可以支持完整的流體結(jié)構(gòu),而無須預(yù)先部署拓?fù)浣Y(jié)構(gòu)。使用Docker能夠在抽象運(yùn)行時(shí),以便服務(wù)可以在任何基于Linux的環(huán)境中運(yùn)行。
5.與虛擬化技術(shù)的關(guān)系
容器編排解決方案在許多方面與傳統(tǒng)的服務(wù)器虛擬化解決方案有著比較大的差異。容器編排解決方案作為應(yīng)用程序組件,運(yùn)行在虛擬機(jī)或物理機(jī)器之上。
常用的容器編排技術(shù)
1. Docker Swarm
Docker Swarm是Docker的本地容器編排解決方案。Swarm 提供與Docker的本地和更深層次的集成,并有著與Docker的遠(yuǎn)程API兼容的API。它在邏輯上將- -組 Docker主機(jī)分組,并將它們作為一個(gè)大型的Docker虛擬主機(jī)進(jìn)行管理。應(yīng)用程序管理員和開發(fā)人員無須決定容器是在哪個(gè)主機(jī)上部署,這個(gè)決策將被委托給Docker Swarm。它將根據(jù)分組打包和擴(kuò)展算法決定使用哪個(gè)主機(jī)。
由于Docker Swarm基于Docker的遠(yuǎn)程API,現(xiàn)有Docker用戶的學(xué)習(xí)曲線與其他任何容器業(yè)務(wù)流程工具相比要少得多。然而,Docker Swarm是市場上較新的產(chǎn)品,僅支持Docker容器。
Docker Swarm使用管理器( manager)和節(jié)點(diǎn)( node)的概念。管理員通過管理器來與Docker容器進(jìn)行交互和調(diào)度。節(jié)點(diǎn)則是Docker容器部署和運(yùn)行的地方。
2. Kubernetes
Kubermetes ( k8s )來自Google 的工程設(shè)計(jì),使用Go語言編寫,并正在Google進(jìn)行大規(guī)模部署的測試。與Swarm類似,Kubernetes幫助管理跨集群節(jié)點(diǎn)的容器化應(yīng)用程序。它有助于自動(dòng)化容器部署和容器的調(diào)度與可伸縮性。它支持許多有用的開箱即用功能,如自動(dòng)逐步展開、版本化部署和容器彈性管理等。
Kubermetes 體系結(jié)構(gòu)具有主節(jié)點(diǎn)( master)、節(jié)點(diǎn)(node)和pod等概念。主節(jié)點(diǎn)和節(jié)點(diǎn)一起被稱為Kubernetes集群。主節(jié)點(diǎn)負(fù)責(zé)跨多個(gè)節(jié)點(diǎn)分配和管理工作負(fù)載,節(jié)點(diǎn)就是虛擬機(jī)或物理機(jī)器。
節(jié)點(diǎn)既可以被進(jìn)一-步分割成pod,也可以托管多個(gè)pod。一個(gè)或多個(gè)容器在一個(gè)pod內(nèi)分組并執(zhí)行。
pod還有助于管理和部署共存服務(wù)以提高效率。Kubernetes 也支持標(biāo)簽的概念作為鍵值對,以便查詢和查找容器。標(biāo)簽是用戶定義的參數(shù),用于標(biāo)記執(zhí)行常見類型工作負(fù)載的某些類型的節(jié)點(diǎn),如前端Web服務(wù)器等。
部署在集群上的服務(wù)將獲得- - 個(gè)IP/DNS用來訪問該服務(wù)。Kubernetes 對Docker有開箱即用的支持。然而,Kubernetes 的學(xué)習(xí)曲線會(huì)比Docker Swarm更多。作為OpenShift 平臺(tái)的一部分, RedHat為Kubernetes提供商業(yè)支持。
3. Apache Mesos
有關(guān)ApacheMesos的介紹,最早可追溯到BenjaminHindman等所寫的技術(shù)白皮書Mesos:APlatform for Fine-Grained Resource Sharing in the Data Center (可以在線查看該文章
htp://mesos.berkeley.edu/mesos_ tech_ reportpdf )。后來Benjamin Hindman加入了Twitter, 負(fù)責(zé)開發(fā)和部署Mesos。再后來Benjamin Hindman離開Twitter而去了Mesosphere, 著手建設(shè)并商業(yè)化以Mesos為核心的DC/OS (數(shù)據(jù)中心操作系統(tǒng))。
Mesos是Apache下的開源分布式資源管理框架,它被稱為是分布式系統(tǒng)的內(nèi)核,使用內(nèi)置Linux內(nèi)核相同的原理,只是在不同的抽象層次。該Mesos內(nèi)核運(yùn)行在每個(gè)機(jī)器上,在整個(gè)數(shù)據(jù)中心和云環(huán)境內(nèi)向應(yīng)用程序(如Hadoop、Spark、 Kafka、 Elasticsearch 等)提供資源管理和資源負(fù)載的API接口。
Apache Mesos具備以下特性。
● 線性可擴(kuò)展性:業(yè)界認(rèn)可的可擴(kuò)展到10000個(gè)節(jié)點(diǎn)。
●高可用性:使用ZooKeeper實(shí)現(xiàn)master和agent的容錯(cuò),且實(shí)現(xiàn)了無中斷的升級。
支持容器:原生支持Docker容器和AppC鏡像。
●可拔插的隔離:對CPU、內(nèi)存、磁盤、端口、GPU和模塊實(shí)現(xiàn)自定義資源的一-等( first class )隔離支持。
●二級調(diào)度:支持使用可插拔調(diào)度策略來在相同集群中運(yùn)行云原生和遺留的應(yīng)用程序。
API: 提供HTTP API在操作集群、監(jiān)控等方面開發(fā)新的分布式應(yīng)用程序。
Web界面:內(nèi)置Web界面查看集群的狀態(tài),并可以導(dǎo)航containersandbox(容器沙箱)
跨平臺(tái):可以在Linux、OSX和Windows 上運(yùn)行,并且與云服務(wù)提供商無關(guān)。
Mesos與以往的解決方案稍有不同。它更多的是依靠其他框架來管理工作負(fù)載執(zhí)行的資源管理器。它位于操作系統(tǒng)和應(yīng)用程序之間,提供了- -個(gè)邏輯的機(jī)器集群。
Mesos是一個(gè)分布式系統(tǒng)內(nèi)核,將多臺(tái)計(jì)算機(jī)邏輯分組并將其虛擬化為一臺(tái) 大型機(jī)器。它能夠?qū)⒃S多異構(gòu)資源分組到一個(gè)統(tǒng)一資源集群 上,在這個(gè)集群上可以部署應(yīng)用程序?;谶@些原因,Mesos也被稱為在數(shù)據(jù)中心建立私有云的工具。
Mesos具有主節(jié)點(diǎn)和從節(jié)點(diǎn)的概念。與早期的解決方案類似,主節(jié)點(diǎn)負(fù)責(zé)管理集群,而從節(jié)點(diǎn)負(fù)責(zé)運(yùn)行工作負(fù)載。它在內(nèi)部使用ZooKeeper進(jìn)行集群協(xié)調(diào)和存儲(chǔ),也支持框架的概念。這些框架負(fù)責(zé)調(diào)度和運(yùn)行非集裝箱應(yīng)用程序和容器。Marathon、 Chronos 和Aurora是應(yīng)用程序調(diào)度和執(zhí)行的流行框架。Netflix 的Fenzo是另一個(gè)開源的Mesos框架。有趣的是,Kubernetes 也可以用作Mesos框架。
Marathon支持Docker容器,以及非容器化的應(yīng)用程序。Spring Boot可以直接配置在Marathon中。Marathon提供了許多開箱即用的功能,如支持應(yīng)用程序依賴項(xiàng)用于擴(kuò)展和升級服務(wù)的應(yīng)用程序分組、實(shí)例的啟動(dòng)和關(guān)閉、滾動(dòng)升級、回滾失敗升級等。
Mesosphere作為DC/OS平臺(tái)的一部分, 為Mesos和Marathon提供商業(yè)支持。
總結(jié)
Spring Cloud并沒有提供現(xiàn)成的處理自動(dòng)擴(kuò)展的方案,但結(jié)合目前市面上常用的容器編排技術(shù)(如上文提到的Docker Swarm、Kubermetes、Apache Mesos等),能夠方便地實(shí)現(xiàn)服務(wù)的自動(dòng)擴(kuò)展。
自動(dòng)擴(kuò)展在微服務(wù)架構(gòu)中是一個(gè)相對復(fù)雜的問題,學(xué)習(xí)成本相對也比較高。由于自動(dòng)擴(kuò)展并非是Spring Cloud的核心話題,因此本文也只是給出了一些基本的概念和思路,不做深入的探討。如果讀者對這方面感興趣,也可以自行查閱相關(guān)資料。以下是一些常用的學(xué)習(xí)鏈接地址。
Docker Swarm: htps://cs.docker.com/swarm
● Kubernetes : htps://kubermetes.io/docs/home/.
●Apache Mesos: htp:/m/esos.apache .org/documentation/latest。
本篇文章內(nèi)容給大家講解的是如何實(shí)現(xiàn)微服務(wù)的自動(dòng)擴(kuò)展
下篇文章給大家講解的是微服務(wù)的高級主題一 熔斷機(jī)制;
覺得文章不錯(cuò)的朋友可以轉(zhuǎn)發(fā)此文關(guān)注小編;
感謝大家的支持!
本文就是愿天堂沒有BUG給大家分享的內(nèi)容,大家有收獲的話可以分享下,想學(xué)習(xí)更多的話可以到微信公眾號(hào)里找我,我等你哦。
