如何理解微服務架構,組件化服務,容器化管理,集群化調度

2019-12-26   道以致遠



前言

在介紹了有關Web應用程式的發展過程後,我們今天來說一下微服務架構,說起微服務架構可以說是現在最為流行的雲服務應用開發框架。

嚴格來說微服務這種理念不是今天才有的,在以前就有人不斷地嘗試過,只不過是由於當時基礎技術不夠成熟,造成了其不能被大部分開發社區接受。

比如最早從SOA的概念來看,就有很多企業採用了虛擬機來運行組件化服務來構建企業級應用,可惜由於虛擬機本身需要帶有作業系統,其過於重量級無法靈活的使用,同時其啟動和關閉都過於緩慢繁雜,也導致了在一台伺服器上安裝多個虛擬機來運行多個組件化服務變的異常的繁雜難以維護,自然這個方向的發展就舉步維艱。

容器技術的出現

而隨著伺服器虛擬化技術的發展,進而產生了在作業系統上進行容器化產生了Docker這樣的容器化產品,讓服務組件化運行的環境擺脫了作業系統的沉重包袱,只需要在作業系統級別上藉助虛擬化的硬體平台,可以安裝多個具體應用的容器,多個容器共享虛擬化的硬體平台而相互不會產生干擾。

如果我們在以前想通過協調管理多個虛擬機上運行的組件化服務來完成應用程式構建障礙重重的話,現在擺脫了作業系統束縛的容器化應用成為了理想的組件化服務運行基礎。

可以說有了Docker這樣的容器化基礎應用,讓我們的伺服器突然有了一個基於作業系統的多插頭插盤。

它能夠抽象作業系統管理的像CPU,內存,存儲和網絡等所有重要資源,讓我們根據具體應用的需要在組織和配置管理這些資源構建一個專門的運行環境。

而這些容器型的環境能夠做到相互隔離,又能夠通過指定的協議進行通信交互。

這跟我們前面說的所有的編程本質就是數據的隔離和交互通道的建立和管理一個道理。



微服務架構

關於微服務,它作為現在流行的軟體開發架構,要想真正理解它,必須從軟體架構的演化歷史來看。

最初我們開發的應用程式是運行在計算機上的,由硬體主導計算機性能時代,我們開發的應用主要針對單台計算機的。

我們要提供應用的性能主要靠提高計算機本身的處理能力,於是大型計算機作為主伺服器成為運行應用程式的主流。

到後來的伺服器的小型化,但是還是沒能擺脫硬體主導應用性能的架構。這個階段主要是複雜的大型應用集中運行在大型計算機上。

隨著計算機的普及,特別是個人電腦算力的提升,開始將伺服器的部分運算轉移到個人電腦上運行,於是就出現了客戶端-伺服器架構的應用。

在這種應用架構下,客戶端負責處理簡單的一些顯示和初步處理操作,由伺服器來運行主要的業務邏輯,這就是典型的C/S架構。

我們在使用C/S架構過程中,針對應用程式進行了功能的部分分離設計,開始出現專用的服務,如此就開始出現了對該架構的設計進行分層。

出現了表現層,業務邏輯層,數據層存儲層等經典三層或者N層模式架構。

這些在我們應用程式開發過程中已經成為經典架構模式,當然我們在操作這些分層設計時也會對具體的功能進行進一步的分層,比如MVC的邏輯分層。

SOA架構與微服務

在到後來發展對企業級服務集成而設計的SOA架構。在這一階段主要解決的是企業各服務之間的交互和集成。為此引入了數據總線概念,通過消息的標準接口協議定義來統一各服務組件之間的數據傳輸和交換。

我們知道在SOA架構中強調的是企業內部各個基礎服務的整合和集成,每個集成組件都是一個功能完備的系統,它們能夠通過向數據總線發送消息來跟與其本身異構的其它服務系統進行數據交換和服務響應。

而現在流行的微服務,從某種程度上說是SOA架構的細粒度化,通俗一點說就是將原來龐大巨型的應用系統垂直拆分成功能專一的組件化服務,從表現層一直到底層數據存儲服務等垂直化組合,由於容器技術的支持,使之成為完全可以自主治理的獨立服務組件。



微服務架構優勢

微服務最大的特點就體現在其可伸縮性,以及性能的彈性,服務的穩定性等特點。

在過去我們傳統的巨型集中體應用程式中,系統的各個功能是運行在同一個系統進程中的多個線程,這對我們對系統的維護和升級提出了極大的挑戰。

特別是隨著我們業務的增加,處理能力的擴容變的異常困難,如果系統某個部分功能出現問題需要修補,就需要對整個應用程式進行維護升級。

這讓一些要求7X24小時服務的應用來說,穩定的可用性成為一個限制服務升級的最大問題。

在另外一種情形中,如果我們的應用程式對數據的處理能力是分時的,比如白天時間段並發處理能力要求會達到一定的峰值,而到了夜間需要處理的數據量就會回到低谷,峰值和低谷之間差別太大,我們傳統的單體集成應用程式無法只能按照最大峰值來配置和部署應用,並接受在夜間低谷時大量的處理能力閒置浪費。

也就是不能夠彈性靈活的管理服務的性能。

在系統的某個部分出現故障時,會讓整個應用服務崩潰無法提供服務,比如某台資料庫伺服器出問題,無法提供正常的數據訪問,前端某台web伺服器阻塞,使得用戶對我們系統的訪問無法及時響應等。這些在傳統的單體集成應用程式架構下是常見的問題。也就是說無法保證系統的穩定可靠性。

而上面所說的問題,在微服務系統架構下都得到了完美的解決。

怎麼解決的呢? 首先微服務將系統從功能上做了簡化,秉持著服務功能單一設計的原則,將系統的單一功能進行垂直化切割,使其成為一個獨立的可獨立部署並自我治理的組件服務。

功能越單一出錯的幾率就越小,可維護性就越強,同時微服務基礎架構中引入了快速死亡的設計理念以及斷路器模式,因為微服務基礎架構的基礎是底層網絡連接和通信,很顯然從所有功能組件都作為同一個單體集中應用進程的線程轉變為微服務框架下,獨立運行在一個單獨主機或容器里的獨立進程,其服務之間的通信從線程間調用(函數或者方法調用)轉變為進程間調用(IPC)或者網絡連接訪問(HTTP訪問)。

如此一個微服務架構的系統變成了一個運行在服務集群各個節點的多個服務相互之間通信串聯而成的應用。而容器技術和容器的管理調度應用從出現,讓管理每個服務組件的運行狀態,以及對於某個服務節點的管理變的簡單而直接。



微服務使服務集群化

簡單說來我們可以通過容器管理調度程序來動態的部署和安裝某個服務組件,也能夠隨時監控某個節點的服務是否正常,在出現問題,達不到預期性能指標時通過管理調度程序將該節點的組件服務關閉,並從能夠提供服務的節點列表中撤出,不再參與對外提供服務。

而對於外部訪問請求,則是通過前端請求路由組件路由到運行正常的服務節點來處理,而出現問題的服務節點可以通過斷路器模式,一方面阻斷外部請求的傳入,一方面不斷的去檢查服務可用性,直到服務被重新啟動並加入到可以提供服務的服務節點列表里,斷路器會恢復對路由請求的處理。

從而保證了我們系統的任何一個服務都能夠有對等的多個服務冗餘集群來提供服務,而不會因為某個節點的故障而影響到整個系統的運行。

同時由於採用冗餘的集群化服務節點矩陣來替代單個服務節點,能夠更好的根據外部請求的流量來動態的調整參與處理的服務節點數量,即在流量增加超過某個峰值時動態的啟動新的服務組件來增加並發處理能力,當訪問流量降低到某一個閾值時,可以動態的關閉某些空閒的服務節點,已達到服務的彈性擴容和收縮。

由於採用了集群式的對等性服務組件對外提供服務,如此能夠保證個別節點出現問題,不會影響對外服務的提供。從而大大加強了我們服務的可靠性和穩定性。

當然微服務做到這些,是要付出代價的,也就是其實現的複雜程度比起單體集中式巨型應用程式架構不知增加的多少倍,但是現在很多大公司和技術社區都在對它做很多的底層基礎服務的研究和開發,儘量的簡化微服務實現的複雜性成本。



流行微服務開發框架

比如我們現在流行的阿里巴巴公司貢獻給開源社區的Apache Dubbo以及老牌Spring社區里組織實現的各個版本的Spring Cloud傘包項目。

其中Dubbo最初實現的是一個進程間遠程過程調用(RPC)開發管理框架,支持多種協議的通信。

而Spring Cloud項目提供的技術組合則是基於Spring框架的技術系列,提供了基於HTTP網絡通信訪問協議的開發框架,主要支持基於HTTP REST API的開發。

說到微服務架構不得不提另外一家公司那就是奈飛(Netflix),它算是最早研究微服務架構實現的公司,因為其網上租碟片的內容查詢和在線觀看業務的需要,開始研究影片內容的量子化切片查詢和在線觀看時龐大的流量支持,讓他們的原來的單體集中式架構無法繼續支撐才開始通過很多懸賞挑戰賽形式在微服務架構方面進行了大量的研究,它們將研究結果貢獻給了開源社區,並在Spring Cloud項目中提供了一套它們的解決方案包。

簡單來說,要實現從線程間調用到獨立進程間或者跨網絡訪問的調用,需要實現的基礎設施包括組件服務的列表管理,服務節點之間的連接和活性檢測,複雜服務調用的分解和合併,服務集群管理,服務穩定性監控等等一些列的內容。其實其本質還是基於網絡的數據流處理。當然這些流行的解決方案並沒有直接的採用JDK提供的IO或NIO類庫來開發,而是大都採用了目前比較流行的第三方網絡基礎架構實現Netty。

總結

這裡我只是大體的理了理現代應用程式是如何過渡到現在流行的微服務架構的,重點說了一下微服務架構的特點和它解決的痛點。以及現在流行的微服務開發的基礎框架特點,希望能夠為想學習微服務架構開發的同學提供一個整體的思路,知道從哪裡下手去學習。

當然,由於篇幅限制不能對每一個點具體展開來講其原理和實現。希望以後能夠找時間對微服務的基礎開發設施內容做一下詳細的講解。