1. 程式人生 > >關於Spring Cloud微服務架構

關於Spring Cloud微服務架構

spring boot

微服務架構

Spring Cloud解決的第一個問題就是:服務與服務之間的解耦。很多公司在業務高速發展的時候,服務組件也會相應的不斷增加。服務和服務之間有著復雜的相互調用關系,經常有服務A調用服務B,服務B調用服務C和服務D ...,隨著服務化組件的不斷增多,服務之間的調用關系成指數級別的增長,這樣最容易導致的情況就是牽一發而動全身。經常出現由於某個服務更新而沒有通知到其它服務,導致上線後慘案頻發。這時候就應該進行服務治理,將服務之間的直接依賴轉化為服務對服務中心的依賴。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. 監控的效果圖如下:


技術分享


配置中心
隨著微服務不斷的增多,每個微服務都有自己對應的配置文件。在研發過程中有測試環境、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框架的朋友,希望可以幫助更多的好學者。大家來一起探討spring cloud架構的搭建過程及如何運用於企業項目。源碼來源

關於Spring Cloud微服務架構