隨著雲計算和容器化技術的發展成熟,使得應用程式開始向雲伺服器部署轉移,從單台伺服器或者由多態伺服器各種部署連接構成的服務集群,向虛擬化後的服務集群的過度,要求我們的應用程式架構必須發生轉變來適應這種底層伺服器的變化。
前面的文章提到過,由於未來的服務一定是運行在雲計算平台上的雲服務,不管是部署在共有雲上面向大眾的,還是部署在私有雲上面向專門的特定用戶的服務,都要求我們的應用開發架構從原來集中式的巨型單體應用程式轉變為功能責任單一,能夠自己獨立部署和自治管理的組件化功能服務轉變,這也是雲服務原生應用架構的要求。
我們知道作為一個架構師,其核心的能力應該是對應用系統功能按照某種規則進行劃分並引入模組設計。
在過去我們所有的應用開發過程中都在做這某種程度的功能劃分和模塊化設計,但是這種設計往往都是在同一個應用進程環境下的內部邏輯分組設計。
而到了雲服務架構下,需要考慮的是基於網絡節點的獨立服務分組和連接通信問題。
所以在開始考慮採用微服務設計架構時,首先得了解我們的應用程式的部署運行環境,其最理想的部署環境是雲服務平台,一種虛擬化的硬體管理和服務技術。
我們可以通過虛擬化的硬體資源在動態的管理和調整伺服器的算力資源,存儲資源以及網絡帶寬資源等。
而微服務框架設計方面,我們需要針對這些部署環境特點來作為入口點進行理解。
在過去我們無論是做面向終端用戶的網際網路應用開發,還是做企業級內部系統開發,我們長期以來形成了一套完整的架構設計規範。
這套規範是以應用伺服器容器為外部邊界進行設計和開發,也就是說所有的應用功能設計實現都是在容器空間內部來完成的。
其應用程式的生命周期完全由應用程式容器來管理,我們是在應用程式內部創建標準化的組件來實現功能設計,比如我們設計UI組件,業務邏輯組件,數據存儲以及內部信息集成組件等。
因為所有的功能組件都是在同一個應用程式容器內部實現的,所以他們之間的交互訪問都是通過組件的相互注入調用來實現的,也就我們熟悉的依賴注入函數方法調用的方式。
而到了雲服務環境中,我們的應用不再是部署到獨立的應用程式容器里,而是需要部署到無數的服務節點上,每個節點上部署的功能組件可能相同也可能不同,而這些獨立的服務組件獨立完成某個服務內容的提供,並且採用的是分布式是數據存儲。
在傳統的系統架構里,我們有部署應用程式的應用伺服器,有獨立的集中式資料庫伺服器,如果數據量龐大我們可能考慮使用資料庫邏輯上的分庫分表,但是所有的資料庫訪問邏輯都會來自同一個應用程式,該應用程式可能會有多個服務節點,但是每個節點運行的服務都應該是相同的。
也就是完全是一個整體服務的多個副本,如果出現了一個用戶被路由到了不同的服務節點上,那麼就需要解決會話同步問題,這是通常我們會使用緩存伺服器來在多個分布式節點伺服器中間做一個會話數據緩衝同步。
但是這樣的方案還是無法擺脫各個功能組件之間緊耦合問題,只是從一個整個應用層級上進行了冗餘擴容處理。
但是要知道我們一個應用系統中面臨的並發訪問量處理壓力並不均勻,也就是說我們一個系統中各個功能部分因為業務功能不同面對的處理壓力不同,產生瓶頸的地方也會不同,我們從系統級別上通過複製擴容,雖然能解決部分問題,但是也同時會造成很多非受壓功能部分的重複浪費。
也就是說我們不能很好的精緻化的管理我們應用程式的彈性設計。
比如拿一個網上商城應用系統來說,其主要的系統功能可能包括用戶登錄和身份驗證的安全模塊,包括商品查詢模塊,包括訂單生成和處理模塊,支付處理模塊,包括出庫和配送信息管理模塊,還包括很多特殊功能的設置模塊,比如活動推廣,特殊形式的競購功能等等。
這裡面容易產生處理瓶頸的訂單生成和處理模塊,支付處理模塊等,因為它們的並發處理效率會直接體現在用戶的購物體驗上,而用戶登錄和驗證我們用戶登錄安全檢查服務等可能就沒有上兩個模塊處理的壓力。
但是由於我們傳統的單體應用程式架構設計造成了要想擴大某些模塊處理能力,我們只能增加整個伺服器的處理能力,同時系統的脆弱性也會變大。
如果我們採用微服務架構來進行設計,我們就可以獨立出想用戶登錄和身份驗證服務,訂單生成和處理服務,支付處理服務等一個個獨立的服務處理節點,它們各自保存自己的關聯數據,包括應用伺服器和數據存儲伺服器都是獨立的,同時我們可以採用同等服務的矩陣方式來避免某單個節點出現問題,而造成整個服務不能使用的問題。
如此依賴所有的通信就變成了伺服器節點之間的通信調用,而非同一個進程中線程的函數調用了。即使某個進程出現問題崩潰,完全可以通過技術手段切換到正常的同樣功能的其它服務節點的進程調用。
從而通過獨立節點的冗餘和相關管理調度手段來解決服務脆弱性問題。
同時因為各個功能組件服務獨立性,我們可以針對某一部分或者業務環節的服務壓力來增加參與處理的節點數,從而通過這種局部功能的彈性化處理,準確的管理服務能力的彈性管理。
同時因為獨立性和冗餘部署,我們可以很好的避免因為某個功能節點問題而造成的服務脆弱性,通過對服務處理節點狀態的檢測,我們可以及時發現節點問題從而提前做處理。
由於服務組件做到功能的冪等性,我們可以對某個功能處理的瓶頸任意的擴容,而不會影響整個服務的運行。
微服務架構由於是基於容器化技術來實現對服務運行節點的管理和調度,由此就為我們提供了一個動態的監控和管理服務運行的途徑。
特別是容器化技術將運行應用服務的節點從重量級的作業系統的負擔中解救出來,讓我們節點伺服器的開啟和關閉變的異常的容易,不用在耗費大量的時間和資源成本。
這就給了我們微服務架構無與倫比的部署靈活性。