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

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

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

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