淺析微服務框架

Jeff_Shi發表於2019-02-26

微服務架構

你的整個應用程式將會被拆分成一個個功能獨立的子系統,獨立執行,系統與系統之間通過RPC介面通訊。這樣這些系統之間的耦合度大大降低,你的系統將非常容易擴充套件,團隊協作效率提升了N個檔次。

容器化部署

你的各個微服務將採用目前處於浪潮之巔的Docker來實現容器化部署,避免一切因環境引起的各種問題,讓你們團隊的全部精力集中在業務開發上。

自動化構建

專案被微服務化後,各個服務之間的關係錯中複雜,打包構建的工作量相當可怕。不過沒關係,本文將藉助Jenkins,幫助你一鍵自動化部署,從此你便告別了加班。

知識點1:微服務

微服務一次近幾年相當火,成為程式猿飯前便後裝逼熱門詞彙,你不對它有所瞭解如何在程式猿裝逼圈子裡混?下面我用最為通俗易懂的語言介紹它。

單機結構

一個系統業務量很小的時候所有的程式碼都放在一個專案中就好了,然後這個專案部署在一臺伺服器上就好了。整個專案所有的服務都由這臺伺服器提供。這就是單機結構。 單機的處理能力畢竟是有限的,當你的業務增長到一定程度的時候,單機的硬體資源將無法滿足你的業務需求。此時便出現了叢集模式

叢集結構

單機處理到達瓶頸的時候,你就把單機複製幾份,這樣就構成了一個“叢集”。叢集中每臺伺服器就叫做這個叢集的一個“節點”,所有節點構成了一個叢集。每個節點都提供相同的服務,那麼這樣系統的處理能力就相當於提升了好幾倍(有幾個節點就相當於提升了這麼多倍)。

但問題是使用者的請求究竟由哪個節點來處理呢?最好能夠讓此時此刻負載較小的節點來處理,這樣使得每個節點的壓力都比較平均。要實現這個功能,就需要在所有節點之前增加一個“排程者”的角色,使用者的所有請求都先交給它,然後它根據當前所有節點的負載情況,決定將這個請求交給哪個節點處理。這個“排程者”有個牛逼了名字——負載均衡伺服器。

叢集結構的好處就是系統擴充套件非常容易。如果隨著你們系統業務的發展,當前的系統又支撐不住了,那麼給這個叢集再增加節點就行了。但是,當你的業務發展到一定程度的時候,你會發現一個問題——無論怎麼增加節點,貌似整個叢集效能的提升效果並不明顯了。這時候,你就需要使用微服務結構了。

微服務結構

從單機結構到叢集結構,你的程式碼基本無需要作任何修改,你要做的僅僅是多部署幾臺伺服器,沒太伺服器上執行相同的程式碼就行了。但是,當你要從叢集結構演進到微服務結構的時候,之前的那套程式碼就需要發生較大的改動了。所以對於新系統我們建議,系統設計之初就採用微服務架構,這樣後期運維的成本更低。但如果一套老系統需要升級成微服務結構的話,那就得對程式碼大動干戈了。

微服務就是將一個完整的系統,按照業務功能,拆分成一個個獨立的子系統,在微服務結構中,每個子系統就被稱為“服務”。這些子系統能夠獨立執行在web容器中,它們之間通過RPC方式通訊。

舉個例子,假設需要開發一個線上商城。按照微服務的思想,我們需要按照功能模組拆分成多個獨立的服務,如:使用者服務、產品服務、訂單服務、後臺管理服務、資料分析服務等等。這一個個服務都是一個個獨立的專案,可以獨立執行。如果服務之間有依賴關係,那麼通過RPC方式呼叫。

這樣的好處有很多:

系統之間的耦合度大大降低,可以獨立開發、獨立部署、獨立測試,系統與系統之間的邊界非常明確,排錯也變得相當容易,開發效率大大提升。 系統之間的耦合度降低,從而系統更易於擴充套件。我們可以針對性地擴充套件某些服務。假設這個商城要搞一次大促,下單量可能會大大提升,因此我們可以針對性地提升訂單系統、產品系統的節點數量,而對於後臺管理系統、資料分析系統而言,節點數量維持原有水平即可。 服務的複用性更高。比如,當我們將使用者系統作為單獨的服務後,該公司所有的產品都可以使用該系統作為使用者系統,無需重複開發。 那麼問題來了,當採用微服務結構後,一個完整的系統可能有很多獨立的子系統組成,當業務量漸漸發展起來之後,而這些子系統之間的關係將錯綜複雜,而且為了能夠針對性地增加某些服務的處理能力,某些服務的背後可能是一個叢集模式,由多個節點構成,這無疑大大增加了運維的難度。微服務的想法好是好,但開發、運維的複雜度實在是太高。為了解決這些問題,阿里巴巴的Dubbo就橫空出世了。

知識點2:Dubbo

Dubbo是一套微服務系統的協調者,在它這套體系中,一共有三種角色,分別是:服務提供者(下面簡稱提供者)、服務消費者(下面簡稱消費者)、註冊中心。

你在使用的時候需要將Dubbo的jar包引入到你的專案中,也就是每個服務都要引入Dubbo的jar包。然後當這些服務初始化的時候,Dubbo就會將當前系統需要釋出的服務、以及當前系統的IP和埠號傳送給註冊中心,註冊中心便會將其記錄下來。這就是服務釋出的過程。與此同時,也是在系統初始化的時候,Dubbo還會掃描一下當前系統所需要引用的服務,然後向註冊中心請求這些服務所在的IP和埠號。接下來系統就可以正常執行了。當系統A需要呼叫系統B的服務的時候,A就會與B建立起一條RPC通道,然後再呼叫B系統上相應的服務。

這,就是Dubbo的作用。

知識點3:容器化部署

當我們使用了微服務架構後,我們將一個原本完整的系統,按照業務邏輯拆分成一個個可獨立執行的子系統。為了降低系統間的耦合度,我們希望這些子系統能夠執行在獨立的環境中,這些環境之間能夠相互隔離。

在Docker出現之前,若使用虛擬機器來實現執行環境的相互隔離的話成本較高,虛擬機器會消耗較多的計算機硬體/軟體資源。Docker不僅能夠實現執行環境的隔離,而且能極大程度的節約計算機資源,它成為一種輕量級的“虛擬機器”。

知識點4:自動化構建

當我們使用微服務架構後,隨著業務的逐漸發展,系統之間的依賴關係會日益複雜,而且各個模組的構建順序都有所講究。對於一個小型系統來說,也許只有幾個模組,那麼你每次採用人肉構建的方式也許並不感覺麻煩。但隨著系統業務的發展,你的系統之間的依賴關係日益複雜,子系統也逐漸增多,每次構建一下你都要非常小心謹慎,稍有不慎整個服務都無法正常啟動。而且這些構建的工作很low,但卻需要消耗大量的精力,這無疑降低了開發的效率。Jenkins來幫助你解決這個問題的。

我們只需在Jenkins中配置好程式碼倉庫、各個模組的構建順序和構建命令,在以後的構建中,只需要點選“立即構建”按鈕,Jenkins就會自動到你的程式碼倉庫中拉取最新的程式碼,然後根據你事先配置的構建命令進行構建,最後釋出到指定的容器中執行。你也可以讓Jenkins定時檢查程式碼倉庫版本的變化,一旦發現變動就自動地開始構建過程,並且讓Jenkins在構建成功後給你發一封郵件。這樣你連“立即構建”的按鈕也不需要按,就能全自動地完成這一切構建過程。

相關文章