用SpringCloud進行微服務架構演進

2022-03-02 14:12:04 字數 4123 閱讀 3714

在《架構師必須要知道的阿里的中颱戰略與微服務》 中已經闡明選擇springcloud進行微服務架構實現中臺戰略,因此下面介紹springcloud的一些內容,springcloud已經出來了很多年,網上資料一大堆,這裡推薦 程式猿dd 的部落格  關於springcloud微服務各元件內容等做了非常詳細的介紹,適合入門的來學習。

spring cloud是基於spring boot的,因此還在使用springmvc的同學要先了解spring boot。先上一段官話,spring cloud是乙個基於spring boot實現的雲應用開發工具,它為基於jvm的雲應用開發中涉及的配置管理、服務發現、斷路器、智慧型路由、微**、控制匯流排、全域性鎖、決策競選、分布式會話和集群狀態管理等操作提供了一種簡單的開發框架。

spring cloud並沒有重複製造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過spring boot風格進行再封裝遮蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。

上面的圖是spring cloud的全家桶,包羅永珍,猶如水電,涉及到開發的方方頁面。

spring cloud從設計之初就考慮了絕大多數網際網路公司架構演化所需的功能,如服務發現註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等。

eureka是netflix開源的一款提供服務註冊和發現的產品,eureka就是乙個服務中心,將所有的可以提供的服務都註冊到它這裡來管理,其它各呼叫者需要的時候去註冊中心獲取,然後再進行呼叫,避免了服務之間的直接呼叫,方便後續的水平擴充套件、故障轉移等。如下圖:

當然服務中心這麼重要的元件一但掛掉將會影響全部服務,因此需要搭建eureka集群來保持高可用性,生產中建議最少兩台。隨著系統的流量不斷增加,需要根據情況來擴充套件某個服務,eureka內部已經提供均衡負載的功能,只需要增加相應的服務端例項既可。那麼在系統的執行期間某個例項掛了怎麼辦?eureka內容有乙個心跳檢測機制,如果某個例項在規定的時間內沒有進行通訊則會自動被剔除掉,避免了某個例項掛掉而影響服務。

因此使用了eureka就自動具有了註冊中心、負載均衡、故障轉移的功能。

當然還有另外乙個實現元件spring cloud consul,這裡不做多介紹。

隨著微服務不斷的增多,每個微服務都有自己對應的配置檔案。在研發過程中有測試環境、uat環境、生產環境,因此每個微服務又對應至少三個不同環境的配置檔案。這麼多的配置檔案,如果需要修改某個公共服務的配置資訊,如:快取、資料庫等,難免會產生混亂,這個時候就需要引入spring cloud另外乙個元件:spring cloud config。

spring cloud config是乙個解決分布式系統的配置管理方案。它包含了client和server兩個部分,其實就是server端將所有的配置檔案服務化,需要配置檔案的服務例項去config server獲取對應的資料。將所有的配置檔案統一整理,避免了配置檔案碎片化。

在微服務架構中通常會有多個服務層呼叫,基礎服務的故障可能會導致級聯故障,進而造成整個系統不可用的情況,這種現象被稱為服務雪崩效應。

如下圖所示:a作為服務提供者,b為a的服務消費者,c和d是b的服務消費者。a不可用引起了b的不可用,並將不可用像滾雪球一樣放大到c和d時,雪崩效應就形成了。

在這種情況下就需要整個服務機構具有故障隔離的功能,避免某乙個服務掛掉影響全域性。在spring cloud 中hystrix元件就扮演這個角色。

hystrix會在某個服務連續呼叫n次不響應的情況下,立即通知呼叫端呼叫失敗,避免呼叫端持續等待而影響了整體服務。hystrix間隔時間會再次檢查此服務,如果服務恢復將繼續提供服務。

當熔斷發生的時候需要迅速的響應來解決問題,避免故障進一步擴散,那麼對熔斷的監控就變得非常重要。熔斷的監控現在有兩款工具:hystrix-dashboard和turbine。

hystrix-dashboard是一款針對hystrix進行實時監控的工具,通過hystrix dashboard我們可以直觀地看到各hystrix command的請求響應時間, 請求成功率等資料。但是只使用hystrix dashboard的話, 你只能看到單個應用內的服務資訊, 這明顯不夠. 我們需要乙個工具能讓我們彙總系統內多個服務的資料並顯示到hystrix dashboard上, 這個工具就是turbine. 監控的效果圖如下:

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可以很清楚的了解到乙個服務請求經過了哪些服務,每個服務處理花費了多長時間。從而讓我們可以很方便的理清各微服務間的呼叫關係。分布式鏈路跟蹤需要sleuth+zipkin結合來實現,當然實現鏈路追蹤的還有三方開源方案,如果zipkin實現的功能非常簡單,圖形化能力也不強,所以可以試試其它的方案,如pinpoint較成熟的框架等。

宣告式遠端排程元件。

負載均衡元件

大資料操作元件,它是spring xd的替代品,也是乙個混合計算模型,可以通過命令列的方式運算元據流

元件基於spring tsak,提供任務排程和任務管理的功能

以上只介紹經常用到非常重要的內容,一般的技術棧為 springcloud +gitlab+jenkins進行普通服務的開發持續整合部署ci,後面可公升級用spingcloud +gitlab+jenkins+docker容器化佈署,進一步公升級到用 spingcloud +gitlab+jenkins+docker+k8s自動化容器編排內容,這裡的難度等級就完全不一樣了,而且每乙個元件都涉及到很多內容,傳統業務如何進行微服務的拆分下次再進行討論。 

用SpringCloud進行微服務架構演進

在 架構師必須要知道的阿里的中颱戰略與微服務 中已經闡明選擇springcloud進行微服務架構實現中臺戰略,因此下面介紹springcloud的一些內容,springcloud已經出來了很多年,網上資料一大堆,這裡推薦 程式猿dd 的部落格 關於springcloud微服務各元件內容等做了非常詳細...

SpringCloud微框架系列整體模組梳理

一 springcloud專案簡介 spring cloud 微服務工具包,為開發者提供了在分布式系統的配置管理 服務發現 斷路器 智慧型路由 微 控制匯流排等開發工具包。spring boot 旨在簡化建立產品級的 spring 應用和服務,簡化了配置檔案,使用嵌入式web伺服器,含有諸多開箱即用...

SpringCloud微框架系列整體模組梳理

以下為spring cloud的核心功能 分布式 版本化配置 config 服務註冊和發現 eureka 路由 zuul 服務和服務之間的呼叫 feign 負載均衡 ribbon 斷路器 hystrix 分布式訊息傳遞 通過這張圖,我們來了解一下各元件配置使用執行流程 1 請求統一通過api閘道器 ...