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

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

但這種構架有一個很大的缺點,它把收集器及其監視器緊密地耦合在一起,要求收集器實現去管理監視器的注冊細節、觀測數據遞送,以及出錯恢復,從而變得無謂的復雜化。如下圖所示,我們可以把IceStorm 結合進我們的應用中,使我們擺脫這些瑣碎的工作。

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