ICE

面向對象中間件

網路徠通信引擎ICE(Internet Communications Engine)是Zero C公司的分散式系統開發專家實現的一種新的高性能的面向對象中間件平台。從根本上說, ICE 為構建面向對象的客戶-伺服器應用提供了工具、 API( Application Program Interface)和庫支持。基於ICE可以實現電信級的解決方案。

技術簡介


中間件(middleware)是基礎軟體的一大類,屬於可復用軟體的範疇。顧名思義,中間件處於操作系統軟體與用戶的應用軟體的中間。中間件在操作系統、網路和資料庫之上,應用軟體的下層,總的作用是為處於自己上層的應用軟體提供運行與開發的環境,幫助用戶靈活、高效地開發和集成複雜的應用軟體。
在設計網站架構的時候可以使用ICE實現對網站應用的基礎對象操作,將基礎對象操作和資料庫操作封裝在這一層,在業務邏輯層以及表現層(java,php,.net,python)進行更豐富的表現與操作,從而實現比較好的架構。基於ICE的數據層可以在未來方便的進行擴展。ICE支持分散式的部署管理,消息中間件,以及網格計算等等。
ICE 作為一種新型的面向對象中間件,目前並未得到廣泛地應用。然而它在架構上為應用開發提供的種種好處,如面向對象的語義、支持同步和非同步的消息傳遞、支持多個介面、機器、語言、操作系統無關性、線程支持、位置和伺服器的透明性、高度的安全性、內建的恆久機制以及開放的源碼等等,它有著非常強大的技術優勢。在構建三層分散式系統方面, ICE 中間件技術有著良好的發展前景。

實現原理


客戶與伺服器

ICE[面向對象中間件]
ICE[面向對象中間件]
按照常規的理解,客戶與伺服器的劃分在於兩者承擔的角色不同:客戶是發出請求的一方,伺服器是響應請求、提供服務的一方。然而在實際應用中,很多伺服器並不是純粹的伺服器,它們常常充當某些客戶的伺服器,但為了完成它們的客戶的請求,它們又會充當其他的伺服器的客戶。
同理,很多客戶機也不是純粹的客戶。例如,客戶可以在伺服器上啟動一個長時間運行的操作,在啟動該操作時,客戶可以向伺服器提供回調對象( callback object),供伺服器用於在操作完成時向客戶發出通知。在這種情況下,客戶在啟動操作時充當客戶,而在接收操作完成通知時充當伺服器。

ICE對象

Ice 對象是本地或遠地的地址空間中、能響應客戶請求的實體。一個Ice對象可在一個或多個伺服器中實例化。每個Ice對象都有一個或多個介面。一個介面是一個對象所支持的一系列有名稱的操作,客戶通過調用操作來發出請求。一個操作有零個或更多參數,以及一個返回值。每個Ice 對象都有一個唯一的對象標識。對象標識是用於把一個對象與其他所有對象區別開來的標識值。 Ice 對象模型假定對象標識是全局唯一的,也就是說,在一個Ice 通信域中,不會有兩個對象具有相同的對象標識。對象標識既可以通過調用GenerateUUID()全局唯一產生,也可以根據自己的喜好隨意創建一個,只要沒與其他對象標識重複即可。對象標識的定義如下:
module Ice {
struct Identity {
string name;
string category;
};
};

代理

要想與某個Ice對象聯繫,客戶必須持有這個對象的代理。對客戶而言,代理就是Ice對象的本地代表(該對象可能在遠地)。代理所封裝的信息有:定址信息:用於讓客戶端run time 聯繫正確的伺服器對象標識:用於確定伺服器中的哪一個對象是請求的目標可選的facet 標識符:用於確定代理所引用的是對象的哪一個facet。

Servants

Ice 對象是一種具有類型、標識,以及定址信息,在本地或遠地的地址空間中、能響應客戶請求的實體的概念性實體。而Servants是伺服器端用具體的編程語言實現的實體,並且在伺服器的地址空間中進行實例化。 Servants 為“客戶發送的操作調用”提供伺服器端行為。

動態映射表

動態映射表( Active servant map),簡稱ASM。之所以稱為動態映射表,是因為它可以動態維護servant的數量,可以添加,也可以刪除。它是一個查找表,用於把對象標識映射到servant;要激活一個servant,就將它添加進動態映射表。這個過程可以看作是在“Ice 對象的標識”與“對應的用編程語言編寫的、負責為該ICE對象處理請求的servant”之間創建鏈接。這個鏈接創建好之後,一旦客戶端的請求到來時, Ice run time 就可以將該請求分派給正確的servant來執行。動態servant映射表的幾種操作行為如下:
add
add 操作把一個具有指定標識的servant 增加到ASM中。一旦add 被調用,請求就會分派給這個servant。返回值是這個servant 所體現的Ice對象的代理。你不能用同一標識多次調用add:如果你試圖在ASM 中增加一個已經存在的標識,就會引發AlreadyRegisteredException
addWithUUID
addWithUUID 操作的行為和add 操作一樣,但你不需要為servant 提供標識。addWithUUID 會生成一個UUID,作為對應的Ice 對象的標識。
remove
remove 操作中斷對象標識與其servant 之間的關聯,從ASM 中移除對應的條目。一旦servant 解除了激活,新到來的針對已移除的對象標識的請求會引發ObjectNotExistException

具體實現過程


Ice 對象的實現過程如下:

伺服器端

ICE[面向對象中間件]
ICE[面向對象中間件]
1) 創建 servant 類,並在伺服器端 Ice run time 上註冊。
2)徠 實例化 servant 類,創建具體的 servant。
3) 為這個 servant 所體現的 Ice 對象創建標識。
4) 激活 servant(即將 servant 添加進動態 servant 映射表)。

客戶端

1) 當客戶端要調用某一操作時,客戶端 run time 會將對象標識以及請求一起發給伺服器。
2) 伺服器端的對象適配器接收到了請求和對象標識,對象適配器繼而根據這個對象標識,在它所維護管理的active servant map中查找其相對應的正確的servant。
3) 若找到了與對象標識對應的正確的servant,就把調用分派給它。若查找不到,就會引發Object Not Exist Exception。最後客戶端接收到來自伺服器端的返回值或異常信息。

設計目標


ICE主要設計目標是:
1.·成為適用於異種環境的面向對象中間件平台。
2.具有一組完整的特性,支持廣泛領域中的實際的分散式應用的開發。
3.·去掉不必要的複雜性,使平台更易於學習和使用。
4.是一種在網路帶寬、內存使用和CPU 開銷方面都很高效的實現。
5.是一種具有內建安全性的實現,使它適用於不安全的公共網路。

優點


(一) 面向對象的語義
支持面向對象的分散式計算技術。
(二) 適合在異種環境中使用
客戶和伺服器可以用不同的編程語言編寫,可以運行在不同的操作系統和機器架構上,並且可以使用多種網路技術進行通信。無論應用環境如何,這些源碼是可以移植的。
(三) IceStorm 的發布/訂閱機制
IceStorm 是一種發布-訂閱服務,能夠解除客戶與伺服器的耦合。在本質上, IceStorm充當的是事件分發交換機。發布者把事件發給這個服務,由它發給訂閱者。這樣,發布者發布的單個事件就可以發送給多個訂閱者。 IceStorm適用於構建高效的事件轉發機制。
(四) 利用 Glacier 機制,可以方便地實現穿越防火牆
Glacier 是Ice 防火牆服務:它能讓客戶與伺服器通過防火牆安全地進行通信,且不犧牲安全性。
(五) 採用了 TCP/UDP 協議
ICE 提供了一種 RPC 協議,既可以把 TCP/IP、也可以把 UDP 用作底層傳輸機制。(可以通過配置一個參數來選擇需要的傳輸機制)。另外, ICE 還允許採用 SSL 作為傳輸機制,讓客戶和伺服器間所有通信都進行加密。
(六) 可靠的安全機制
ICE 採用了 SSL 加密技術,使得客戶機和伺服器哪怕是在不安全的網路中,也可以安全地進行通信。