springcloud學習

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規範的誕生,有效推進服務端軟件系統技術水平的進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章