許多復(fù)雜的軟件系統(tǒng)運行在多個處理器或分布式計算機上。將軟件分布在多臺計算機上的原因有多種,例如:
但是,實現(xiàn)分布式系統(tǒng)是不容易的,因為您必須處理諸如并發(fā)性、跨平臺連接和不可靠網(wǎng)絡(luò)連接之類的問題。
影響因素
在構(gòu)建分布式系統(tǒng)時,必須協(xié)調(diào)下列影響因素:
解決方案
使用 Broker 模式可以隱藏遠程服務(wù)調(diào)用的實現(xiàn)細節(jié),方法是將這些細節(jié)封裝到一個與業(yè)務(wù)組件自身不同的層 [Buschmann96]。
這個層為客戶端提供一個接口,使客戶端可以像調(diào)用任何本地接口一樣調(diào)用方法。但是,客戶端接口內(nèi)的方法會觸發(fā)要對遠程對象執(zhí)行的服務(wù)。這對客戶端是透明的, 因為遠程服務(wù)對象實現(xiàn)了相同的接口。該模式將啟動遠程服務(wù)調(diào)用的業(yè)務(wù)組件當(dāng)作"客戶端",而將響應(yīng)遠程服務(wù)調(diào)用的組件當(dāng)作"服務(wù)器"。
圖 1 顯示沒有進行任何分布的簡單示例的靜態(tài)結(jié)構(gòu)。客戶端直接調(diào)用服務(wù)器上的 performFunctionA 方法。僅當(dāng)服務(wù)器對象與客戶端對象駐留在同一臺計算機上時,才能發(fā)生這種情況。
圖 1:沒有實現(xiàn)分布的結(jié)構(gòu)
圖 2 顯示實現(xiàn)分布后的靜態(tài)結(jié)構(gòu)。
圖 2:實現(xiàn)分布后的結(jié)構(gòu)
ServiceInterface 是一個必需的抽象,對于在服務(wù)器端不必公開實現(xiàn)細節(jié)的情況下將由服務(wù)器提供的服務(wù)來說,這樣的抽象可以通過提供有關(guān)該服務(wù)的和約而使分布成為可能。在實現(xiàn) 分布時,將添加客戶端和服務(wù)器代理,以處理通過網(wǎng)絡(luò)將方法調(diào)用及其參數(shù)發(fā)送到服務(wù)器,然后將響應(yīng)發(fā)回客戶端的所有傳送工作。代理將完成所有數(shù)據(jù)封送和拆 收、安全控制、傳輸通道配置和任何其他附加工作。客戶端只需調(diào)用客戶端代理的 performFunctionA 方法,就像它是本地調(diào)用一樣,這是因為客戶端代理實際上實現(xiàn)的是 ServerInterface。對客戶端進行的代碼更改將是最低限度的,因此您可以開發(fā)整個業(yè)務(wù)域模型,而不必知道系統(tǒng)是否是分布式的。對遠程服務(wù)調(diào)用的實現(xiàn)方式的任何更改都將被限制在代理類以內(nèi),并且不會對域模型產(chǎn)生任何影響。圖 3 顯示這些組件之間的一種交互方案。
圖 3:實現(xiàn)分布后的行為
服務(wù)器查找
Broker 解 決方案所針對的是前面所述的大多數(shù)問題。但是,因為客戶端代理直接與服務(wù)器代理進行通信,所以客戶端必須能夠在編譯時找到服務(wù)器的位置。這意味著,您不能 在運行時將服務(wù)器更改或移動到不同位置。要克服這一限制,需要避免公開服務(wù)器的確切位置。而應(yīng)當(dāng)將新組件(即代理程序組件)部署在一個眾所周知的位置,然 后向客戶端公開該位置。此后,代理程序組件負責(zé)為客戶端查找服務(wù)器。代理程序組件還會實現(xiàn)一個用于添加和刪除服務(wù)器組件的儲存庫,這樣就有可能在運行時添 加、刪除或交換服務(wù)器組件。圖 4 顯示包含代理程序組件的靜態(tài)結(jié)構(gòu)。
這種類型的功能通常稱為"名稱服務(wù)"。查找遠程對象是企業(yè)計算中的一項常見要求。因此,許多平臺實現(xiàn)了名稱服務(wù),例如,Microsoft 使用 Active Directory® 目錄服務(wù)。
圖 4:具有服務(wù)器查找功能的代理程序結(jié)構(gòu)
代 理程序駐留在一個不應(yīng)該頻繁更改的、眾所周知的位置。已被激活并且準備接收請求的任何服務(wù)器都將向代理程序注冊自己,以便下一次客戶端向代理程序請求這種 類型的服務(wù)器時,代理程序能夠使用它。這還可能提高系統(tǒng)的性能和可用性,因為它使您可以擁有多個同時運行并服務(wù)于多個客戶端的、完全相同的服務(wù)器組件。這 種機制有時稱為負載平衡。圖 5 顯示了一個這些組件之間的交互方案示例。
圖 5:具有服務(wù)器查找功能的代理程序行為
代理程序作為中介
在 前面的方案中,代理程序僅負責(zé)為客戶端查找服務(wù)器。這種方案中,客戶端從代理程序獲得服務(wù)器的位置,然后在不涉及代理程序的情況下直接與服務(wù)器進行通信。 但是,在某些情況下,我們并不希望客戶端與服務(wù)器之間進行直接通信。例如,由于安全原因,您可能希望將所有服務(wù)器放在位于防火墻后面的公司專用網(wǎng)絡(luò)中,并 且只允許代理程序訪問它們。這種情況下,您必須讓代理程序轉(zhuǎn)發(fā)服務(wù)器和客戶端這二者之間的所有請求和響應(yīng),而不是讓它們直接相互通信。圖 6 顯示將此模型修訂后的靜態(tài)結(jié)構(gòu)。
圖 6:用作中介的代理程序的結(jié)構(gòu)
圖 7 顯示用作客戶端和服務(wù)器之間的信使的代理程序的交互圖。此示例還說明了客戶端和服務(wù)器之間的通信可以是異步的(注意 sendRequest 調(diào)用上的開放箭頭)。
也 存在這樣的情況:客戶端必須對同一服務(wù)器進行一系列方法調(diào)用,才能完成一個持續(xù)時間長而且復(fù)雜的業(yè)務(wù)事務(wù)。在這樣的情況中,服務(wù)器必須在前后客戶端調(diào)用之 間保持狀態(tài)不變。然后,代理程序必須確保客戶端在基本會話內(nèi)所進行的所有服務(wù)器調(diào)用都會被路由到完全相同的服務(wù)器組件。
圖 7:用作中介的代理程序的行為
Broker 模式具有 Layered application 模式的許多優(yōu)點和缺點。
優(yōu)點
Broker 具有下列優(yōu)點:
缺點
可惜的是,抽象層可以損害性能。基本規(guī)則是,擁有的信息越多,就可以優(yōu)化得越好。使用單獨的代理程序?qū)涌赡茈[藏有關(guān)應(yīng)用程序如何使用較低層的細節(jié),這可能又 會阻止較低層執(zhí)行特定的優(yōu)化操作。例如,使用 TCP/IP 時,路由協(xié)議不知道正在路由的是什么數(shù)據(jù)包。因此,很難決定包含視頻流的數(shù)據(jù)包(例如)應(yīng)該具有比包含垃圾郵件的數(shù)據(jù)包更高的路由優(yōu)先級。
安全考慮事項
包含敏感業(yè)務(wù)數(shù)據(jù)的服務(wù)器組件通常位于公司的專用網(wǎng)絡(luò)中,并受到防火墻的保護。而代理程序位于外圍網(wǎng)絡(luò)(也稱為非管制區(qū) (DMZ) 或屏蔽子網(wǎng))中,外圍網(wǎng)絡(luò)是作為公司專用網(wǎng)絡(luò)與外部公用網(wǎng)絡(luò)之間的中性區(qū)域而插入的小型網(wǎng)絡(luò)。只允許從外圍網(wǎng)絡(luò)訪問服務(wù)器組件,而不允許從外部公用網(wǎng)絡(luò)訪 問這些組件。這一額外的網(wǎng)絡(luò)層阻止了外部用戶直接訪問服務(wù)器。
新聞熱點
疑難解答