目前分布式應用軟件越來越多,但在如何平衡分布式應用和單機應用的處理性能有一些麻煩。另外就是從一種分布式技術(shù)遷移到另一種分布式技術(shù)也很困難。一個原因就是我們的上層應用代碼和底層的分布式技術(shù)(CORBA,ICE,SOCKET)緊密相關(guān),難以分割導致。本文給出一種分離具體分布式技術(shù)的設計方案,目的是強調(diào)一點:對于應用軟件來講,CORBA,ICE,SOCKET等具體分布式技術(shù)不是核心,核心是我們的客戶需要的業(yè)務功能。
下面以CORBA和SOCKET(ASN.1協(xié)議)為例子說明這種分離架構(gòu)。
1. 所有業(yè)務功能都通過接口定義;
2. 所有使用業(yè)務功能的代碼都必須通過接口工廠獲取業(yè)務接口的實例
接口+類工廠的方式。保證任何一個業(yè)務模塊(組件)對外(包括大平臺內(nèi)部各個業(yè)務模塊或組件之間)提供的所有服務都是接口,同時提供類工廠讓外部訪問業(yè)務模塊(組件)中某個接口的實現(xiàn)。
說明:
1) IExpand是需要外部定制的接口,當然可能存在多個,如果一個業(yè)務模塊(組件)不需要外部定制,就不存在這個接口了;
2) IPlatform是提供外部使用的功能接口,當然可能存在多個;
3) IPlatformFactory是類工廠的接口,類工廠也用接口定義,是因為需要對外屏蔽底層通信細節(jié),比如ASN.1,CORBA等;當然這個接口的定義應該是很少變化的;一般而言,一個業(yè)務模塊或組件只需要一個類工廠的接口定義;
4) TFactory是一個類工廠的實現(xiàn),這是外部唯一可見的一個實現(xiàn)類。
5) PlatformImpl是一個內(nèi)部用標準C++開發(fā)的一個功能實現(xiàn)體,它對外部是不可見的。
所有業(yè)務都是利用這個核心架構(gòu)來實現(xiàn),下面考慮CORBA,ASN.1接口的適配方式,這兩種方式都有一個共同點:都可以看作是CLIENT/SERVER結(jié)構(gòu),需要我們提供CLIENT/SERVER兩端的外部接口
利用Adaptor和delegate模式來屏蔽CORBA技術(shù)細節(jié)。
說明:
1) IServerIDL利用IDL語言定義IPlatform這個接口,是外部不可見的;
2) CorbaServerImpl從IServerIDL和IPlatform繼承下來,將IServerIDL的任何調(diào)用轉(zhuǎn)調(diào)IPlatform的接口實現(xiàn);同時CorbaServerImpl還使用委托模式,將IPlatform的接口調(diào)用轉(zhuǎn)調(diào)給PlatformImpl來實現(xiàn),這樣CorbaServerImpl在實現(xiàn)CORBA對象的時候僅僅是將CORBA數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為標準C++的接口,將CORBA調(diào)用轉(zhuǎn)換為普通的C++API接口調(diào)用,它內(nèi)部沒有復雜的業(yè)務邏輯,實現(xiàn)非常簡單
3) TCorbaServerFactory是內(nèi)部負責創(chuàng)建CorbaServerImpl對象,外部完全看不到CORBA的任何信息
4) 這里沒有標出IExpand接口,因為它與CORBA任何細節(jié)無關(guān)
采用delegate模式來實現(xiàn)
說明:
1) IClientIDL是利用IDL定義的IPlatform接口,這是IDL編譯器編譯后的客戶端的接口,這是外部不可見的
2) CorbaClientImpl IPlatform同時繼承,將IPlatform接口的都轉(zhuǎn)調(diào)用IClientIDL接口來實現(xiàn),它是外部不可見的
3) TCorbaClientFactory負責創(chuàng)建CorbaClientImpl實例,對外屏蔽CORBA的實現(xiàn)細節(jié)
4) IExpand接口沒有在圖中出現(xiàn),是因為它和CORBA的任何細節(jié)都無關(guān)
同CORBA的適配方式,采用Adaptor和Delegate模式來實現(xiàn)
說明:
1) IASN接口定義發(fā)送消息和接收消息兩個接口
2) ASN.1ServerImpl采用Adpator模式和委托模式來實現(xiàn),將IPlatform的接口轉(zhuǎn)調(diào)用PlatformImpl來實現(xiàn)的,另外它分析收到的所有ASN.1的消息,將消息內(nèi)容轉(zhuǎn)換為IPlatform的接口調(diào)用,然后再將IPlatform接口調(diào)用的返回值組裝為一個ASN.1消息發(fā)送出去
3) TASN.1ServerFactory內(nèi)部負責ASN.1ServerImpl實例的創(chuàng)建,對外屏蔽ASN.1的任何技術(shù)細節(jié)
4) IExpand接口沒有出現(xiàn),是因為它和ASN.1的任何細節(jié)無關(guān)
采用Adaptor模式來實現(xiàn)。
說明:
1) ASN.1ClientImpl將IPlatform接口調(diào)用轉(zhuǎn)換為ASN.1消息發(fā)送出去,然后將收到的ASN.1響應消息轉(zhuǎn)為為標準C++的數(shù)據(jù)結(jié)果作為IPlatform接口調(diào)用的返回值和輸出參數(shù)
2) TASN.1ClientFactory對外屏蔽ASN.1的技術(shù)細節(jié)
從上面可以看出,對于外部用戶來說,是內(nèi)部是采用CORBA,ASN.1還是純粹的c++API接口都沒有任何區(qū)別。我們甚至可以同時提供這三種方式,用戶根據(jù)需要進行選擇。比如所有業(yè)務模塊(組件)都是同機運行,我們可以放棄CORBA,ASN.1技術(shù),以后要改為分布式組網(wǎng)方式,只需要替換為一個類工廠庫即可。以后要支持一種新的分布式技術(shù),只需要采用同樣的方式實現(xiàn)一個適配層即可,上層業(yè)務的業(yè)務的所有實現(xiàn)都是可以重用的。
最后回到一點:應用軟件的核心是業(yè)務不是底層分布式技術(shù)。