微服務(wù)的高級主題一自動擴(kuò)展
Spring Cloud 提供了大規(guī)模部署微服務(wù)所必需的支持。為了獲得像云服務(wù)環(huán)境一樣的能力, 微服務(wù)實例也應(yīng)該能夠根據(jù)流量的規(guī)模來自動擴(kuò)展,也稱自動縮放( Auto-scaling)。

自我注冊和自我發(fā)現(xiàn)
Spring Cloud有兩個重要的概念,稱為自我注冊( self-registration )和自我發(fā)現(xiàn)( self-discovery )。
這兩個功能支持自動化的微服務(wù)部署。通過自我注冊,只要微服務(wù)實例做好準(zhǔn)備,微服務(wù)就可以通過向中央服務(wù)注冊中心( 服務(wù)注冊表)注冊服務(wù)元數(shù)據(jù)來自動發(fā)布該服務(wù),并確保其可用。一旦微服務(wù)被注冊,消費者就可以通過使用注冊服務(wù)來發(fā)現(xiàn)新注冊服務(wù)實例,接著就能消費這些服務(wù)。其中,服務(wù)注冊表是這種自動化的核心。
Spring Cloud與傳統(tǒng)的JAVA EE應(yīng)用服務(wù)器采用的傳統(tǒng)的集群方法完全不同。在Java EE應(yīng)用程序服務(wù)器部署的過程中,服務(wù)器實例的IP地址或多或少地需要在負(fù)載均衡器中靜態(tài)配置。因此,集群方法并不是在互聯(lián)網(wǎng)大規(guī)模部署中進(jìn)行自動擴(kuò)展的最佳解決方案。此外,集群還會帶來其他挑戰(zhàn),例如,它們必須在所有集群節(jié)點上具有完全相同的二進(jìn)制文件版本。由于集群中的節(jié)點之間緊密的依賴關(guān)系,一個集群節(jié)點的故障也可能會使其他節(jié)點不可用。
在Spring Cloud中,服務(wù)注冊表會將服務(wù)實例解耦。它還消除了在負(fù)載平衡器中手動維護(hù)服務(wù)地址或配置虛擬IP的煩瑣過程。
在圖14-1所示的Spring Cloud的服務(wù)注冊和發(fā)現(xiàn)架構(gòu)示意圖中,自動化微服務(wù)部署主要由三個關(guān)鍵組件組成。

●服務(wù)注冊表:主要由Eureka Server來實現(xiàn),是微服務(wù)注冊和發(fā)現(xiàn)的中心注冊組件。服務(wù)的消費者和提供者都可以通過RESTAPI來訪問注冊表。注冊表還包含服務(wù)元數(shù)據(jù),如服務(wù)標(biāo)識、主機(jī)、端口、健康狀態(tài)等信息。
●客戶端:主要由Eureka Client來實現(xiàn),結(jié)合Ribbon客戶端一 起提供了客戶端動態(tài)負(fù)載平衡。
消費者使用Eureka Client查找Eureka Server, 從而識別出目標(biāo)服務(wù)的可用實例列表。Ribbon客戶端使用此服務(wù)器列表在可用的微服務(wù)實例之間進(jìn)行負(fù)載平衡。同樣的,如果服務(wù)實例退出服務(wù),這些實例將被從Eureka注冊表中取出。負(fù)載均衡器會自動對這些動態(tài)的更改做出反應(yīng)。
●微服務(wù)實例:該組件是基于Spring Boot開發(fā)的微服務(wù)實例。
以上便是前面已經(jīng)實踐過的部署方案。但是,這種方案存在一個缺陷,那就是當(dāng)需要額外的微服務(wù)實例時,需要執(zhí)行手動任務(wù)來啟動新的實例。在理想情況下,微服務(wù)實例的啟動和停止最好也能夠自動化,從而解放手動操作。
例如,當(dāng)需要添加另--個城市數(shù)據(jù)API微服務(wù)實例來處理流量增長或負(fù)載突發(fā)情況時,運維人員不得不手動去啟動一個新實例。此外,城市數(shù)據(jù)API微服務(wù)實例空閑一段時間時,運維人員需要手動停止服務(wù)以獲得最佳的基礎(chǔ)設(shè)施使用率。特別是當(dāng)服務(wù)使用的是按使用付費的云環(huán)境時,這對于節(jié)約成本尤其重要。
自動擴(kuò)展的核心概念
自動擴(kuò)展是一種基于資源使用情況自動擴(kuò)展實例的方法,通過復(fù)制要縮放的服務(wù)來滿足SLA( Service Level Agreement,服務(wù)等級協(xié)議)。
具備自動擴(kuò)展能力的系統(tǒng),會自動檢測到流量的增加或減少。如果是流量增加,則會增加服務(wù)實例,從而能夠使其可用于流量處理。同樣的,當(dāng)流量下降時,系統(tǒng)會通過從服務(wù)中取回活動實例來減少服務(wù)實例的數(shù)量。
如圖14-2所示,微服務(wù)通常會使用一-組備用機(jī)器完成自動擴(kuò)展。

由于云環(huán)境都是基于“即用即付”的模式,因此這是定位云部署的關(guān)鍵功能。這種方法通常稱為彈性,也稱為動態(tài)資源提供和取消。自動擴(kuò)展是一-種有 效的方法,專門針對具有不同流量模式的微服務(wù)。例如,購物網(wǎng)站通常會在“雙十一”的時候迎來服務(wù)的最高流量,服務(wù)實例當(dāng)然也是最多的。如果平時也配置那么多的服務(wù)實例,顯然就是浪費。Amazon就是這樣一- 個很好的實例,Ama-zon總是會在某個時間段迎來流量的高峰,此時,就會配置比較多的服務(wù)實例來應(yīng)對高訪問量。而在平時流量比較小的情況下,Amazon 就會將閑置的主機(jī)出租出去,用來收回成本。正是擁有這種強(qiáng)大的自動擴(kuò)展的實踐能力,造就了Amazon從一個網(wǎng)上書店成為世界云計算巨頭。
在自動擴(kuò)展的方法中,通常會有- -個資源池和多個備用實例。根據(jù)需求,將實例從資源池移到活動狀態(tài)以滿足剩余需求。在一-些高級部署場景中,這些實例并不會針對特定的微服務(wù)來預(yù)先打包成微服務(wù)的二進(jìn)制文件,而是從資源庫(如Nexus)中進(jìn)行下載。
自動擴(kuò)展的意義
實現(xiàn)自動擴(kuò)展機(jī)制有很多好處。在傳統(tǒng)部署中,運維人員會針對每個應(yīng)用程序預(yù)留一-組服務(wù) 器。
通過自動擴(kuò)展,這個預(yù)分配將不再需要。因為這些預(yù)分配的服務(wù)器,可能會導(dǎo)致在很長一段實間內(nèi)未充分得到利用,從而演變成為一種浪費。在這種情況下,即使鄰近的服務(wù)需要爭取更多的資源,這些空閑的服務(wù)器也不能使用。通過數(shù)百個微服務(wù)實例,為每個微服務(wù)預(yù)分配固定數(shù)量的服務(wù)器并不符合成本效益。更好的方法是為-組微服務(wù)預(yù)留一-些服務(wù) 器實例,而不用預(yù)先分配。這樣,根據(jù)需求,一組服務(wù)可以共享- -組可用的資源。這樣做可以通過優(yōu)化使用資源,將微服務(wù)動態(tài)移動到可用的服務(wù)器實例中。
例如,MI微服務(wù)有三個實例,M2微服務(wù)有一一個實例,M3微服務(wù)有一個實例,這些實例都是正在運行的。還有另一臺服務(wù)器保持未分配。根據(jù)需求,未分配的服務(wù)器可用于任何微服務(wù):MI、M2或M3。如果MI有更多的服務(wù)請求,那么未分配的實例將用于M1。當(dāng)服務(wù)使用率下降時,服務(wù)器實例將被釋放并移回到池中。之后,如果M2需求增加,則可以使用M2激活相同的服務(wù)器實例。
總結(jié)起來,使用自動擴(kuò)展有以下好處。
1.提高了可用性和容錯能力
由于服務(wù)是存在多個實例的,即使其中-一個實例失敗,另一個實例也可以接管并繼續(xù)為客戶提供服務(wù)。這種故障轉(zhuǎn)移對消費者來說是透明的。如果此服務(wù)的其他實例不可用,則自動擴(kuò)展服務(wù)將會識別到該情況,并調(diào)用具有該服務(wù)實例的另一個服務(wù)器。隨著整個實例的自動化,整個服務(wù)的可用性將高于沒有自動擴(kuò)展的系統(tǒng)。沒有自動擴(kuò)展的系統(tǒng)需要手動來進(jìn)行添加或刪除服務(wù)實例,這將在大型部署中難以管理。
例如,假定M1服務(wù)的兩個實例正在運行。如果流量增加,在正常情況下,現(xiàn)有實例可能會過載。在大多數(shù)情況下,整套服務(wù)將被堵塞,導(dǎo)致服務(wù)不可用。而在自動擴(kuò)展的情況下,可以快速創(chuàng)建一個新的M1服務(wù)實例。這將會平衡負(fù)載并確保服務(wù)可用性。
2.增加了可伸縮性
自動擴(kuò)展的關(guān)鍵優(yōu)勢之一是水平擴(kuò) 展性。自動擴(kuò)展允許用戶根據(jù)流量模式自動選擇放大或縮小服務(wù)。
3.具有最佳使用率,并節(jié)約成本
在即付即用模式中,計費基于實際的資源利用率。通過自動擴(kuò)展方式,實例將根據(jù)需求啟動和關(guān)閉。因此,資源得到最佳利用,從而節(jié)省成本。
4.優(yōu)先考慮某些服務(wù)或服務(wù)組
使用自動擴(kuò)展可以考慮不同服務(wù)的優(yōu)先級。這將通過從低優(yōu)先級的服務(wù)中移除實例并將其重新分配給高優(yōu)先級的服務(wù)來完成。這也將消除高優(yōu)先級服務(wù)因資源緊張而得不到執(zhí)行,而低優(yōu)先級服務(wù)大量使用資源的情況。
