架构杂谈《一》
架構(gòu)雜談《一》
?
從傳統(tǒng)單體架構(gòu)到服務(wù)化架構(gòu)的發(fā)展歷程
典型的單體架構(gòu)分為三個層級,Web層、業(yè)務(wù)邏輯層和數(shù)據(jù)存儲層,每個層的指責(zé)分別如下:
Web 層:負(fù)責(zé)與用戶交互或者對外提供接口
業(yè)務(wù)邏輯層:為了實現(xiàn)業(yè)務(wù)邏輯而設(shè)計的流程處理模塊
數(shù)據(jù)存儲層:將業(yè)務(wù)邏輯層處理的結(jié)果持久化
? ? ??
將不同的模塊化組件聚合后運行在通用的應(yīng)用服務(wù)器上。
單體架構(gòu)已經(jīng)對企業(yè)級應(yīng)用的整體架構(gòu)進(jìn)行了邏輯分層,包括了上面提到的Web層、業(yè)務(wù)邏輯層和數(shù)據(jù)存儲層,不同的層級有自己的職責(zé),并從功能類型上劃分層級,每個層級的職責(zé)單一。
在這一時期,由于架構(gòu)上把整體的單體系統(tǒng)分成具有不同指責(zé)的層級,對應(yīng)的項目管理也傾向于把大的團(tuán)隊分成不同的職能團(tuán)隊(UI團(tuán)隊、后臺業(yè)務(wù)邏輯處理團(tuán)隊(程序員)和DBA團(tuán)隊),每個團(tuán)隊只對自己的職責(zé)負(fù)責(zé)。架構(gòu)已經(jīng)在一定程度上進(jìn)行了邏輯的劃分。但是,每個層次的多個業(yè)務(wù)邏輯的實現(xiàn)會被放在同一應(yīng)用項目中,并運行在同一個.Net CLR或者JVM中,盡管會使用規(guī)范來約束不同業(yè)務(wù)邏輯的隔離性來解耦,但隨著復(fù)雜業(yè)務(wù)邏輯的迭代增加及開發(fā)人員的不斷流動或者為了節(jié)省時間和趕進(jìn)度,非法使用了其他組件的服務(wù),業(yè)務(wù)組件之間、UI組件之間、數(shù)據(jù)存儲之間的耦合性必然會增加,最后導(dǎo)致組件與組件之間難以劃清界限,完全耦合在一起,將來新的功能迭代、增加和維護(hù)將會難上加難。
在(JEE、ASP.Net WebForm)等開始流行但沒有奠定地位的時候,開源軟件Struts、Spring和Hibernate開始浮出水面了,很快成為了行業(yè)內(nèi)企業(yè)開發(fā)的開源框架標(biāo)配(SSH)(.Net 的 Asp.Net MVC),Web MVC 框架在用戶交互的UI層進(jìn)一步劃分了前端的職責(zé),將用戶交互層劃分為了視圖(View)、模型(Model)和控制器(Controller)三大塊(簡稱MVC架構(gòu)),結(jié)構(gòu)圖如下:
在這個時代、Struts MVC和Asp.net MVC 模板幾乎服務(wù)于大多數(shù)企業(yè)服務(wù)的Web項目。后來,開源框架Spring的發(fā)布,更加改變了一開始指定的戰(zhàn)略目標(biāo)。Spring有兩大核心思想:IOC和AOP。(后單體架構(gòu))
從單體架構(gòu)后后單體架構(gòu),服務(wù)的特點仍然是單體化,服務(wù)的粒度抽象為模板化組件,所有的組件耦合在一個項目中。并且配置和運行在一個.Net CLR(JVM)進(jìn)程中。如果某個模塊化需要升級上線,則會導(dǎo)致其他沒有變更的模塊化組件同樣上線,在嚴(yán)重情況下,對某個模塊化組件的變更,由于各種原因會導(dǎo)致其他模塊化組件出現(xiàn)問題。另外在互聯(lián)網(wǎng)的突飛發(fā)展下,傳統(tǒng)的單體架構(gòu)和后單體架構(gòu)無法滿足對大量用戶發(fā)起的高并發(fā)請求進(jìn)行處理的需求,無法破解耦合在一起的模塊化組件的性能瓶頸,單一進(jìn)程已經(jīng)無法滿足需求,并且水平擴(kuò)展的能力也是有限的。
為了解決上述問題,SOA就應(yīng)運而生了。SOA代表面向服務(wù)的架構(gòu)(服務(wù)化),SOA將應(yīng)用程序的模塊化組件通過定義明確的接口和約定(契約)聯(lián)系在一起,接口采用中立的方式進(jìn)行定義,獨立于某種語言、硬件和OS(操作系統(tǒng)),通常通過網(wǎng)絡(luò)通信來完成,但并局限于某種網(wǎng)絡(luò)協(xié)議(可以是TCP/IP,也可以是HTTP,也可以是消息隊列,甚至可以是約定的某種數(shù)據(jù)庫存儲形式),這使得各種各樣系統(tǒng)中的模塊化組件可以以一種統(tǒng)一和通用的方式進(jìn)行交互。
通過對比各個時代架構(gòu)下的模塊化組件,可以發(fā)現(xiàn)SOA將模塊化組件從單一進(jìn)程中進(jìn)一步拆分,形成了獨立的對外提供服務(wù)的網(wǎng)絡(luò)化組件,每個網(wǎng)絡(luò)化組件通過某種協(xié)議對外提供服務(wù),這種架構(gòu)有以下特點:
SOA定義了良好的對外接口,通過網(wǎng)絡(luò)協(xié)議對外提供的服務(wù),服務(wù)之間表現(xiàn)為松耦合性(松耦合性具有靈活的特點,可以對服務(wù)流程進(jìn)行靈活組裝和編排,而不需要對服務(wù)本省做任何改變)
SOA可以讓企業(yè)最大化地使用內(nèi)部和外部提供的公共服務(wù)
SOA的數(shù)據(jù)通信格式通常為XML(冗余的標(biāo)記會給性能帶來極大的影響,后來被JSON取代)
組成整個業(yè)務(wù)流程的每個服務(wù)的內(nèi)部結(jié)構(gòu)和實現(xiàn)在發(fā)生改變時,不影響整個流程對外提供的服務(wù)(只要對外的接口不變,則改變服務(wù)內(nèi)部的實現(xiàn)機制對外部來說是透明的)
SOA定義了標(biāo)準(zhǔn)的對外接口,可以讓底層通用服務(wù)進(jìn)行下沉,供多個上層的使用方同時使用,增加了服務(wù)可重用性
要徹底理解SOA服務(wù)化發(fā)展情況,必須要了解SOA的兩個主流實現(xiàn)方式:Web Service 和 ESB
Web Service
Web Service 技術(shù)是SOA服務(wù)化的一種實現(xiàn)方式,它使得運行在不同的機器及OS(操作系統(tǒng))上的服務(wù)的互通發(fā)現(xiàn)和調(diào)用成為可能,并且可以通過某種協(xié)議交換數(shù)據(jù)
通過上圖可以看出,每個服務(wù)之間是平等的,并且互相解耦的,通過WSDL定義的服務(wù)發(fā)現(xiàn)接口進(jìn)行訪問,并通過SOAP協(xié)議進(jìn)行通信。SOAP協(xié)議通常是一種在HTTP或者HTTPS上傳輸XML數(shù)據(jù)來實現(xiàn)的協(xié)議,但是每個服務(wù)都要依賴中心Web Service來發(fā)現(xiàn)現(xiàn)存的服務(wù)。
Web Service的工作原理如下:
1、服務(wù)提供者通過UDDI協(xié)議將服務(wù)注冊到中心Web Service目錄中
2、服務(wù)調(diào)用者通過UDDI協(xié)議從中心 Web Service目錄中查詢服務(wù),并獲得服務(wù)的WSDL服務(wù)描述文件
3、服務(wù)調(diào)用者通過WSDL語言遠(yuǎn)程調(diào)用服務(wù)提供者提供的服務(wù)
通過這個過程,要改造一個新的業(yè)務(wù)流程,可以從 Web?Service 目?錄中發(fā)現(xiàn)現(xiàn)有的服務(wù),并最大限度地重用現(xiàn)有的服務(wù),經(jīng)過服務(wù)流程的編排來服務(wù)新的業(yè)務(wù)?。?
ESB
ESB 是企業(yè)服務(wù)總線的簡稱,是用于設(shè)計和實現(xiàn)網(wǎng)絡(luò)化服務(wù)交互和通信的軟件模型,是SOA的另一種實現(xiàn)方式,主要用于企業(yè)信息化系統(tǒng)的集成服務(wù)場景中。
在SOA服務(wù)化發(fā)展之前,企業(yè)對信息化系統(tǒng)進(jìn)行了初步建設(shè),在現(xiàn)有的服務(wù)系統(tǒng)上增加新的功能或者疊加新的服務(wù)化系統(tǒng),這需要對這些現(xiàn)有的信息化系統(tǒng)和新增的系統(tǒng)進(jìn)行組合(如果在現(xiàn)有的系統(tǒng)上使用新的開發(fā)、操作系統(tǒng)等等是不現(xiàn)實的,有可能現(xiàn)有的系統(tǒng)是采用異構(gòu)技術(shù)棧實現(xiàn)的)。SOA的松耦合特點正好應(yīng)用于這一場景。使得企業(yè)可以按照服務(wù)化的方式來添加新的服務(wù)或升級現(xiàn)有的服務(wù),來解決新業(yè)務(wù)對流程編排的需要,甚至可以通過不同的渠道來獲得外部服務(wù)并與企業(yè)現(xiàn)有的應(yīng)用進(jìn)行組合。來提供新的業(yè)務(wù)場景所需要的信息化流程。
ESB 也使用于事件處理、數(shù)據(jù)轉(zhuǎn)換和映射、消息和事件異步隊列順序處理、安全和異常處理、協(xié)議轉(zhuǎn)換和保證通信服務(wù)的質(zhì)量等場景。
從上圖可以看出ESB沒有中心化的服務(wù)節(jié)點,每個服務(wù)提供者都是通過總線的模式接入系統(tǒng),總線根據(jù)流程的編排負(fù)責(zé)將服務(wù)的輸出進(jìn)行轉(zhuǎn)換并發(fā)送給流程要求的下一個服務(wù)
進(jìn)行處理。?
總線根據(jù)流程的編排負(fù)責(zé)將服務(wù)的輸出進(jìn)行轉(zhuǎn)換并發(fā)送給流程要求的下一個服務(wù)進(jìn)行處理。如下所述
監(jiān)控和控制服務(wù)之間的消息路由
控制可插拔的服務(wù)化的功能和版本
解析服務(wù)之間交互和通信的內(nèi)容和格式
通過組合服務(wù)、資源和消息處理器來統(tǒng)一編排業(yè)務(wù)需要的信息處理流程
使用冗余來提高服務(wù)的備份能力
企業(yè)服務(wù)總線是?ESB 的核心要素,所有服務(wù)都可以在總線上插拔,并通過總線的流程編排和協(xié)議轉(zhuǎn)接能力來組合實現(xiàn)業(yè)務(wù)處理能力。
? 說明:
1、文中的圖都來自于百度圖片
2、參考書籍:《分布式服務(wù)架構(gòu):原理、設(shè)計與實戰(zhàn)》
總結(jié)
- 上一篇: 使用Minikube部署本地Kubern
- 下一篇: 从零开始实现ASP.NET Core M