在詳細的了解SpringCloud中所使用的各個元件之前,我們先了解下微服務架構的前世今生。
單體架構
在網站開發的前期,項目面臨的流量相對較少,單一應用可以實作我們所需要的功能,進而減少開發、部署和維護的難度。這種用于簡單的增删改查的資料通路架構(ORM)十分的重要。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMyYTMvw1dvwlMvwlM3VWaWV2Zh1Wa-cmbw5CciBzbshjbtRXcvwVM3gzN1AjMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
垂直應用架構
當使用者通路量不斷的提升,單一應用需要不斷的增加伺服器來應對,同時将單一的應用拆分成多個應用用來處理提升效率。這種用于加速Web前端加載的Web架構(MVC)起到了關鍵性的作用。
在這一階段往往會将系統分為不同的層級,每個層級有對應的職責,UI層負責和使用者進行互動、業務邏輯層負責具體的業務功能、資料庫層負責和上層進行資料交換和存儲。
在這一階段我們最常使用到的開發架構就是Spring(業務邏輯層管理POJO)+Struts(web層前置服務控制)+Hibernate(資料庫層持久化)。
服務化架構
伴随着企業服務量的不斷提升,MVC架構的部署導緻系統的負重越來越多,無法滿足并發的要求,系統間資料、封包的傳輸會出現頻繁的丢失。這時候我們需要考慮服務化的架構(SOA)。SOA表示面向服務的架構。将應用根據不同的職責劃分成不同的子產品(類似于企業劃分不同的事業部),不同的子產品使用特定的調用協定(RPC)和接口進行互動。
這樣使整個系統切分成很多單個元件服務來完成請求,當流量過大時通過水準擴充相應的元件來支撐,所有的元件通過互動來滿足整體的業務需求。
SOA服務化的優點是,它可以根據需求通過網絡對松散耦合的粗粒度應用元件進行分布式部署、組合和使用。
服務層是SOA的基礎,可以直接被應用調用,進而有效控制系統中與軟體代理互動的人為依賴性。
服務化架構是一套松耦合的架構,服務的拆分原則是服務内部高内聚,服務之間低耦合。
在這個階段可以使用WebService或者dubbo來服務治理。
微服務架構
微服務架構算是SOA架構的一種拓展,主要關注的是服務個體的獨立性、拆分粒度更小。相對于SOA架構來說,微服務擁有以下優勢:
微服務強調更深層次的元件化和服務化,每個微服務都可以擁有獨立的運作空間,確定每一個服務元件可以作為單獨的産品進行釋出。
微服務抛棄了傳統SOA笨重的企業服務總線,對外釋出強調使用HTTP REST API的接口釋出形式。
微服務的切分粒度大。
了解了架構的發展過程,我們來認識一下Spring Cloud。
Spring Cloud來源于Spring,利用Spring Boot進行快捷開發。由于目前Spring Cloud社群的維護和支援的人員數量衆多,相信Spring Cloud會有很好的發展。而且Spring Cloud基本上都是使用了現有的開源架構進行的內建,學習的難度和部署的門檻就比較低,對于中小型企業來說,更易于使用和落地。
Spring Cloud主要解決了什麼問題?
1、對于企業級的SOA架構來說,服務與服務間的解耦是一項巨大的難題,随着功能服務的不斷增加,多服務間的互相調用頻繁,調用過程就像一個雜亂無章的毛線球,很容易導緻牽一發而動全身的情況,經常會由于在服務更新的過程中,沒有合理通信,導緻資料的丢失。
這時候就應該進行服務治理,将服務之間的直接依賴轉化為服務對服務中心的依賴。Spring Cloud 核心元件Eureka就是解決這類問題。
Eureka
Eureka是Netflix開源的一款提供服務注冊和發現的産品,它提供了完整的Service Registry和Service Discovery實作。也是Spring Cloud體系中最重要最核心的元件之一。
用大白話講,Eureka就是一個服務中心,将所有的可以提供的服務都注冊到它這裡來管理,其它各調用者需要的時候去注冊中心擷取,然後再進行調用,避免了服務之間的直接調用,友善後續的水準擴充、故障轉移等。如下圖:
當然服務中心這麼重要的元件一但挂掉将會影響全部服務,是以需要搭建Eureka叢集來保持高可用性,生産中建議最少兩台。
随着系統的流量不斷增加,需要根據情況來擴充某個服務,Eureka内部已經提供均衡負載的功能,隻需要增加相應的服務端執行個體既可。
那麼在系統的運作期間某個執行個體挂了怎麼辦?Eureka内容有一個心跳檢測機制,如果某個執行個體在規定的時間内沒有進行通訊則會自動被剔除掉,避免了某個執行個體挂掉而影響服務。
是以使用了Eureka就自動具有了注冊中心、負載均衡、故障轉移的功能。
Hystrix
在微服務架構中通常會有多個服務層調用,基礎服務的故障可能會導緻級聯故障,進而造成整個系統不可用的情況,這種現象被稱為服務雪崩效應。
服務雪崩效應是一種因“服務提供者”的不可用導緻“服務消費者”的不可用,并将不可用逐漸放大的過程。
如下圖所示:A作為服務提供者,B為A的服務消費者,C和D是B的服務消費者。A不可用引起了B的不可用,并将不可用像滾雪球一樣放大到C和D時,雪崩效應就形成了。
在這種情況下就需要整個服務機構具有故障隔離的功能,避免某一個服務挂掉影響全局。在Spring Cloud 中Hystrix元件就扮演這個角色。
Hystrix會在某個服務連續調用N次不響應的情況下,立即通知調用端調用失敗,避免調用端持續等待而影響了整體服務。Hystrix間隔時間會再次檢查此服務,如果服務恢複将繼續提供服務。
Hystrix Dashboard和Turbine
當熔斷發生的時候需要迅速的響應來解決問題,避免故障進一步擴散,那麼對熔斷的監控就變得非常重要。
熔斷的監控現在有兩款工具:Hystrix-dashboard和Turbine
Hystrix-dashboard是一款針對Hystrix進行實時監控的工具,通過Hystrix Dashboard我們可以直覺地看到各Hystrix Command的請求響應時間, 請求成功率等資料。
但是隻使用Hystrix Dashboard的話, 你隻能看到單個應用内的服務資訊, 這明顯不夠。
我們需要一個工具能讓我們彙總系統内多個服務的資料并顯示到Hystrix Dashboard上, 這個工具就是Turbine。
監控的效果圖如下:
想了解具體都監控了哪些名額,以及如何監控可以參考這篇文章:熔斷監控Hystrix Dashboard和Turbine
配置中心
随着微服務不斷的增多,每個微服務都有自己對應的配置檔案。在研發過程中有測試環境、UAT環境、生産環境,是以每個微服務又對應至少三個不同環境的配置檔案。
這麼多的配置檔案,如果需要修改某個公共服務的配置資訊,如:緩存、資料庫等,難免會産生混亂,這個時候就需要引入Spring Cloud另外一個元件:Spring Cloud Config。
Spring Cloud Config
Spring Cloud Config是一個解決分布式系統的配置管理方案。它包含了Client和Server兩個部分,Server提供配置檔案的存儲、以接口的形式将配置檔案的内容提供出去,Client通過接口擷取資料、并依據此資料初始化自己的應用。
其實就是Server端将所有的配置檔案服務化,需要配置檔案的服務執行個體去Config Server擷取對應的資料。将所有的配置檔案統一整理,避免了配置檔案碎片化。
如果服務運作期間改變配置檔案,服務是不會得到最新的配置資訊,需要解決這個問題就需要引入Refresh。它可以在服務的運作期間重新加載配置檔案。
當所有的配置檔案都存儲在配置中心的時候,配置中心就成為了一個非常重要的元件。
如果配置中心出現問題将會導緻災難性的後果,是以在生産中建議對配置中心做叢集,來支援配置中心高可用性。
Spring Cloud Bus
上面的 Refresh 方案雖然可以解決單個微服務運作期間重載配置資訊的問題,但是在真正的實踐生産中,可能會有 N 多的服務需要更新配置。
如果每次依靠手動 Refresh 将是一個巨大的工作量,這時候 Spring Cloud 提出了另外一個解決方案:Spring Cloud Bus。
Spring Cloud Bus 通過輕量消息代理連接配接各個分布的節點。這會用在廣播狀态的變化(例如配置變化)或者其它的消息指令中。
Spring Cloud Bus 的一個核心思想是通過分布式的啟動器對 Spring Boot 應用進行擴充,也可以用來建立一個或多個應用之間的通信頻道。目前唯一實作的方式是用 AMQP 消息代理作為通道。
Spring Cloud Bus 是輕量級的通訊元件,也可以用在其它類似的場景中。有了 Spring Cloud Bus 之後,當我們改變配置檔案送出到版本庫中時,會自動的觸發對應執行個體的Refresh,具體的工作流程如下:
服務網關
在微服務架構模式下,後端服務的執行個體數一般是動态的,對于用戶端而言很難發現動态改變的服務執行個體的通路位址資訊。
是以在基于微服務的項目中為了簡化前端的調用邏輯,通常會引入API Gateway作為輕量級網關,同時API Gateway中也會實作相關的認證邏輯進而簡化内部服務之間互相調用的複雜度。
Spring Cloud體系中支援API Gateway落地的技術就是Zuul。Spring Cloud Zuul路由是微服務架構中不可或缺的一部分,提供動态路由,監控,彈性,安全等的邊緣服務。
Zuul是Netflix出品的一個基于JVM路由和服務端的負載均衡器。
它的具體作用就是服務轉發,接收并轉發所有内外部的用戶端調用。使用Zuul可以作為資源的統一通路入口,同時也可以在網關做一些權限校驗等類似的功能。
鍊路跟蹤
随着服務的越來越多,對調用鍊的分析會越來越複雜,如服務之間的調用關系、某個請求對應的調用鍊、調用之間消費的時間等,對這些資訊進行監控就成為一個問題。
在實際的使用中我們需要監控服務和服務之間通訊的各項名額,這些資料将是我們改進系統架構的主要依據。
是以分布式的鍊路跟蹤就變的非常重要,Spring Cloud 也給出了具體的解決方案:Spring Cloud Sleuth和 Zipkin。
Spring Cloud Sleuth為服務之間調用提供鍊路追蹤。通過Sleuth可以很清楚的了解到一個服務請求經過了哪些服務,每個服務處理花費了多長時間。進而讓我們可以很友善的理清各微服務間的調用關系。
Zipkin是Twitter的一個開源項目,允許開發者收集Twitter 各個服務上的監控資料,并提供查詢接口。
總結
我們從整體上來看一下Spring Cloud各個元件如何來配套使用:
從上圖可以看出Spring Cloud各個元件互相配合,合作支援了一套完整的微服務架構。
其中Eureka負責服務的注冊與發現,很好将各服務連接配接起來
Hystrix 負責監控服務之間的調用情況,連續多次失敗進行熔斷保護。
Hystrix dashboard,Turbine 負責監控 Hystrix的熔斷情況,并給予圖形化的展示
Spring Cloud Config 提供了統一的配置中心服務
當配置檔案發生變化的時候,Spring Cloud Bus 負責通知各服務去擷取最新的配置資訊
所有對外的請求和服務,我們都通過Zuul來進行轉發,起到API網關的作用
最後我們使用Sleuth+Zipkin将所有的請求資料記錄下來,友善我們進行後續分析
Spring Cloud從設計之初就考慮了絕大多數網際網路公司架構演化所需的功能,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、資料監控等。
這些功能都是以插拔的形式提供出來,友善我們系統架構演進的過程中,可以合理的選擇需要的元件進行內建,進而在架構演進的過程中會更加平滑、順利。
微服務架構是一種趨勢,Spring Cloud提供了标準化的、全站式的技術方案,意義可能會堪比目前Servlet規範的誕生,有效推進服務端軟體系統技術水準的進步。