一、簡介
Ice 是一種針對客戶端和服務(wù)器進(jìn)行通信的面向?qū)ο蟮闹虚g件平臺(tái)。Ice 為構(gòu)建面向?qū)ο蟮目蛻簦?wù)器應(yīng)用提供了工具、API 和庫支持。客戶和服務(wù)器通信雙方可以用不同的編程語言編寫,目前最新的版本支持的語言包括C++,.NET,Java,Python,Objective-C,Ruby,PHP and ActionScript。客戶和服務(wù)器可以分別部署,可以運(yùn)行在不同的操作系統(tǒng)和機(jī)器架構(gòu)上。
Ice 核心為遠(yuǎn)地通信提供了客戶端和服務(wù)器端運(yùn)行時(shí)支持。其中的大量代碼所涉及的是網(wǎng)絡(luò)通信、線程、字節(jié)序,以及其他許多與網(wǎng)絡(luò)有關(guān)的問題,我們的應(yīng)用代碼應(yīng)該與這些問題隔離開來。
Ice 提供了一種RPC 協(xié)議,既可以把TCP/IP、也可以把UDP 用作底層傳輸機(jī)制。客戶和服務(wù)器代碼都不需要了解底層的傳輸機(jī)制(你可以通過一個(gè)配置參數(shù)選擇所需的傳輸機(jī)制)。
Ice 還允許你把SSL 用作傳輸機(jī)制,讓客戶與服務(wù)器間的所有通信都進(jìn)行加密。通過SSL 強(qiáng)加密,可以使客戶和服務(wù)器完全安全地進(jìn)行通信,這樣,應(yīng)用可以使用不安全的網(wǎng)絡(luò)安全地進(jìn)行通信。
Ice 提供了同步和異步的操作調(diào)用和分派。
客戶端采用異步方法調(diào)用,可以不需要等到服務(wù)器做出答復(fù),在Ice run time 等待答復(fù)的同時(shí),客戶端發(fā)出調(diào)用的線程不會(huì)阻塞。發(fā)出調(diào)用的線程可以繼續(xù)進(jìn)行各種活動(dòng),當(dāng)答復(fù)最終到達(dá)時(shí), Ice run time 會(huì)通知應(yīng)用。
服務(wù)器可以采用異步方法分配,一個(gè)服務(wù)器在同一時(shí)刻所能支持的同步請求數(shù)受到Ice run time 的服務(wù)器線程池的尺寸限制。如果所有線程都在忙于分派長時(shí)間運(yùn)行的操作,那么就沒有線程可用于處理客戶端發(fā)送過來的新的請求,客戶端就會(huì)出現(xiàn)不可接受的無響應(yīng)狀態(tài)。
在使用異步方法分配時(shí),服務(wù)器可以接收一個(gè)請求,然后先將此請求放入任務(wù)池中,讓其他的線程處理,以盡快釋放分派線程。當(dāng)處理結(jié)果已得出時(shí),服務(wù)器要使用Ice run
time 提供的回調(diào)對象,顯式地發(fā)送響應(yīng)到客戶端,告知客戶端請求處理的結(jié)果。
二、Ice 服務(wù)
Ice 核心為分布式應(yīng)用開發(fā)提供了一個(gè)完善的客戶-服務(wù)器平臺(tái)。但現(xiàn)實(shí)應(yīng)用需要的常常不止是遠(yuǎn)地通信能力:你通常還需要擁有這樣的能力:隨需啟動(dòng)服務(wù)器、把代理分發(fā)給客戶、分發(fā)異步事件、配置你的應(yīng)用、分發(fā)應(yīng)用補(bǔ)丁,等等。
在Ice 中有一些服務(wù), 能夠提供上述特性及其他一些特性。
1. IcePack
IcePack 是Ice 的定位服務(wù),用于在使用間接綁定時(shí)把符號性的適配器名解析為協(xié)議-地址對。 也就是說應(yīng)用程序中只需要提供字符串(一個(gè)對象的標(biāo)示符),將此字符串在ICE中注冊就行了,不需要將通信的IP、端口等信息硬編碼在程序代碼中,或者說在配置文件中手動(dòng)指定IP和端口信息。客戶端和服務(wù)器通信時(shí),客戶端就可以使用字符串先到注冊的映射表中查詢出相應(yīng)的IP和端口等信息,再進(jìn)行通信。

1.服務(wù)器在啟動(dòng)時(shí),服務(wù)器向定位器注冊它的對象和對象適配器。
2.在創(chuàng)建使用間接綁定的代理時(shí),客戶端的Ice run time 調(diào)用定位器上的方法,獲取與某個(gè)對象標(biāo)識或?qū)ο筮m配器標(biāo)識符相關(guān)聯(lián)的端點(diǎn)。
3.在為代理獲取了端點(diǎn)之后,客戶直接建立一個(gè)通向服務(wù)器的連接。客戶不會(huì)再次詢問定位器,除非發(fā)生連接錯(cuò)誤。
除了這樣的定位服務(wù), IcePack 還提供了其他特性:
-
IcePack 允許你注冊服務(wù)器,進(jìn)行自動(dòng)啟動(dòng):當(dāng)客戶發(fā)出請求時(shí),服務(wù)器無需在運(yùn)行, IcePack 會(huì)在第一個(gè)客戶請求到達(dá)時(shí),隨需啟動(dòng)服務(wù)器。
-
IcePack 支持部署描述符,能讓你輕松地配置含有若干服務(wù)器的復(fù)雜應(yīng)用。
-
IcePack 提供了一種簡單的對象查找服務(wù),客戶可用來獲取它們感興趣的對象的代理。
2. IceBox
IceBox 是一種簡單的應(yīng)用服務(wù)器,可用于協(xié)調(diào)許多服務(wù)的啟動(dòng)和停止。一個(gè)通用的IceBox 服務(wù)器取代了你通常編寫的整體式Ice 服務(wù)器。你通過屬性為IceBox 服務(wù)配置它負(fù)責(zé)加載和管理的應(yīng)用特有的服務(wù),并且可以對它進(jìn)行遠(yuǎn)地管理。
要把自己編寫的服務(wù)配置進(jìn)IceBox 服務(wù)器中,只需使用一個(gè)屬性。下面是這個(gè)屬性的格式:
IceBox.Service.name=entry_point [args]
name 部分是服務(wù)名,entry_point指出服務(wù)具體的類路徑,args指出開啟服務(wù)是需要的一些參數(shù)。
3. IceStorm
IceStorm 是一種發(fā)布-訂閱服務(wù),能夠解除客戶與服務(wù)器的耦合。在本質(zhì)上, IceStorm 充當(dāng)?shù)氖鞘录职l(fā)交換機(jī)。發(fā)布者把事件發(fā)給這個(gè)IceStorm服務(wù),由它發(fā)給訂閱者。這樣,發(fā)布者發(fā)布的單個(gè)事件就可以發(fā)送給多個(gè)訂閱者。事件按照主題進(jìn)行分類,訂閱者會(huì)指定它們感興趣的主題。只有那些與訂閱者感興趣的主題相吻合的主題才會(huì)發(fā)給這個(gè)訂閱者。這個(gè)服務(wù)允許你指定服務(wù)質(zhì)量標(biāo)準(zhǔn), 讓應(yīng)用在可靠性和性能之間進(jìn)行適當(dāng)?shù)恼壑浴?/span>
如果你需要把信息分發(fā)給大量應(yīng)用組件, IceStorm 就會(huì)特別有用(一個(gè)典型的例子是,擁有大量訂閱者的證券報(bào)價(jià)應(yīng)用)。IceStorm 能解除信息的發(fā)布者與訂閱者的耦合,并負(fù)責(zé)重新分發(fā)已發(fā)布的信息。此外,IceStorm還可以作為聯(lián)盟服務(wù)運(yùn)行,也就是說,服務(wù)的多個(gè)實(shí)例可以在不同的機(jī)器上運(yùn)行,使處理負(fù)載分?jǐn)偟皆S多CPU 上。
應(yīng)用常常需要把信息分發(fā)給多個(gè)接收者。例如,假定我們在開發(fā)一個(gè)氣候監(jiān)測應(yīng)用,用于收集來自氣象塔的觀測數(shù)據(jù),比如風(fēng)速和溫度,并把它們周期性地發(fā)布給氣候監(jiān)視站。我們一開始考慮使用下圖中的架構(gòu)。

但這種構(gòu)架有一個(gè)很大的缺點(diǎn),它把收集器及其監(jiān)視器緊密地耦合在一起,要求收集器實(shí)現(xiàn)去管理監(jiān)視器的注冊細(xì)節(jié)、觀測數(shù)據(jù)遞送,以及出錯(cuò)恢復(fù),從而變得無謂的復(fù)雜化。如下圖所示,我們可以把IceStorm 結(jié)合進(jìn)我們的應(yīng)用中,使我們擺脫這些瑣碎的工作。

IceStorm 使收集器與監(jiān)視器解除耦合,極大地簡化了收集器實(shí)現(xiàn)。作為發(fā)布/ 訂閱服務(wù),IceStorm 充當(dāng)?shù)氖鞘占?/span>( 發(fā)布者) 與監(jiān)視器( 訂閱者)之間的“中間人”,它提供了若干好處:
-
當(dāng)收集器準(zhǔn)備好分發(fā)一組新的觀測數(shù)據(jù)時(shí),它會(huì)向IceStorm 服務(wù)器發(fā)出一個(gè)請求。IceStorm 服務(wù)器會(huì)負(fù)責(zé)把請求遞送給監(jiān)視器,包括處理由于訂閱者的行為有問題或訂閱者不存在所造成的異常。收集器不再需要關(guān)注它的監(jiān)視器,甚至不需要知道此時(shí)是否有監(jiān)視器。
-
與此類似,監(jiān)視器會(huì)與IceStorm 服務(wù)器交互,完成像訂閱和取消訂閱這樣的任務(wù),從而讓收集器專注于它自己的應(yīng)用特有的職責(zé),而不是管理上的瑣事。
-
要把IceStorm 結(jié)合進(jìn)來,收集器和監(jiān)視器應(yīng)用所需做出的改動(dòng)非常少。
4. IcePatch
IcePatch 是一種軟件修補(bǔ)服務(wù)。 你可以用它來輕松地把軟件更新分發(fā)給客戶。客戶可以簡單地連接到IcePatch,請求獲得特定應(yīng)用的更新。這個(gè)服務(wù)會(huì)自動(dòng)檢查客戶的軟件的版本,并以一種壓縮形式下載任何更新過的應(yīng)用組件,從而節(jié)省帶寬。你可以用Glacier 服務(wù)來保護(hù)軟件補(bǔ)丁,只讓得到授權(quán)的客戶下載軟件補(bǔ)丁。
5. Glacier
Glacier 是Ice 防火墻服務(wù):它能讓客戶與服務(wù)器通過防火墻安全地進(jìn)行通信,且又不犧牲安全性。 客戶-服務(wù)器之間的通信數(shù)據(jù)使用公鑰證書進(jìn)行了完全的加密,并且是雙向的。Glacier 支持相互認(rèn)證,以及安全的會(huì)話管理。
6. Freeze
Ice 擁有內(nèi)建的對象持久服務(wù),叫作Freeze。Freeze 能夠讓我們輕松地在數(shù)據(jù)庫中存儲(chǔ)對象狀態(tài),。Freeze 使用Berkeley DB作為它的缺省數(shù)據(jù)庫。也可以使用其他的數(shù)據(jù)庫。Ice 還提供了一些工具,能讓我們更輕松地管理數(shù)據(jù)庫。
7. IceSSL
無論是在企業(yè)內(nèi)部網(wǎng)中,還是在像Internet 這樣的非受信網(wǎng)絡(luò)上,安全性對于許多分布式應(yīng)用而言,都是一個(gè)重要的考慮事項(xiàng)。保護(hù)敏感信息、確保其完整性、檢驗(yàn)各通信方的標(biāo)識,這些能力對開發(fā)安全的應(yīng)用而言必不可少。考慮到這些目標(biāo), Ice 提供了IceSSL 插件,能夠通過SSL協(xié)議提供這些能力。