作為一個技術人員,你是否在為不斷增長的數據量和日益復雜的業務邏輯而頭疼不已,雜亂堆砌在一起的龐大業務讓系統越來越脆弱,於是你想到了網格,想到了利用分布式來重組一個健壯的系統架構。
隨后,RMI,EJB, WebService,Hessian,http invoke…..一堆名詞鋪天蓋地的向你襲來。面對這么多的技術實現,我們似乎有點難以抉擇。EJB太過笨重,webservice的性能似乎有待商榷。http invoker似乎還不如webservice,Hession的功能似乎又太過簡單….
一個面向對象的,性能極高的,平台和語言無關的分布式應用中間件平台,ICE就是這么一個應該被收入我們技術人員工具箱的必備利器。
The Internet Communications Engine
分布式應用中間件平台 ICE
一.來源和定義
ICE是由一些前CORBA陣營中的領軍人物創建的ZeroC公司推出的旗艦產品。ICE開放源碼遵循GPL協議,目前已經有包括 Lockheed Martin , Skype , Hewlett-Packard , Naval Undersea Warfare Center 以及國內的 CCTVnet,Tencent 等等非常多的公司和機構采用其產品,並基於該產品構建自己的分布式應用系統。
那么,ICE是個什么東西呢?我們能用它做什么呢?
ICE的定義:Ice是一個支持多語言映射的,面向對象的用於構建分布式應用系統的中間件平台。
ICE目前支持到C++, Java, .NET, Python, PHP, Ruby, and Objective-C等多種語言的映射。同時他的分支Ice-E支持使用網絡的智能手機,PDA甚至是嵌入式控制器等網絡設備.
目前ICE的最新版本是3.4.1,因為目前我們仍然在使用3.3.1,所以之后的內容都會基於3.3.1版本。
二.ICE的特點
ICE相比較其他分布式中間件來講,具有如下優點:
①提供適用於異種環境的面向對象中間件平台.
②提供一種在網絡帶寬、內存使用和CPU 開銷方面都很高效的實現.
③提供一組完整的特性,支持廣泛的領域中的實際的分布式應用的開發。
④避免不必要的復雜性,使平台更易於學習和使用。
當然,ICE也有其自身的缺點:
①需要使用slice語言進行接口和對象設計.
②編譯前確認,靜態的接口。
③接口或對象更新需要重新生成映射並分發,部署更新.
三.ICE提供的功能
ICE提供了足夠全面和完善的功能特性,使其能應用在各種實際的生產環境中. ICE包含的主要功能如下:
①IceRunTime內建提供的多線程處理。
②直接代理對象,組對象和動態代理對象(需要LocationService),組對象。
③異步接口回調和基於流的動態分發(支持防火牆穿透)。
④基於TCP/IP的高性能單路,批量單路調用 和 基於UDP的數據包,批量數據包調用。
此外,ICE還提供了多種服務,包括:
①Glacier2服務(Ice的防火牆解決方案,雙向鏈接通訊,數據采用SSL加密)
②IceFreeze服務(默認基於Berkeley DB的對象持久化服務)
③IceStorm服務(Ice的消息服務,支持作為federated服務運行)
④IcePatch服務(Ice的補丁更新服務,一般采用Glacier2來保證不被非法下載)
⑤IceGrid服務(網格計算服務,包含了動態部署,自動更新,按需啟動,負載均衡,狀態監測和自我恢復)是舊版本中IcePack的增強版,整合了其他服務。
四.ICE的用途
盡管ICE提供了極為全面和完善的功能,使其能應用在各種實際的生產環境中. 但我個人認為其在如下場景中能最大化發揮其優點:
①整合業務線中的通用服務或核心服務(如用戶積分系統)。
②流量極高的小數據消息服務(如統一的遠程日志統計系統)。
③性能要求苛刻的對外系統服務(如提供給第三方的API接口)。
五.ICE實例
我們現在以一個簡單JAVA版本的Hello World遠程打印程序為例子,簡單說明一下ICE的實現。首先,如前所述,ICE使用一種稱之為Slice的描述語言來定義接口和對象,那我們首先來使用Slice定義一個遠程接口,如下所示:
module src{
module slices{
interface Printer{ void remotePrint (string s); };
};
};
我們把這段文本保存在叫作printer.ice 的文件中。然后利用ice提供的Slice2Java映射工具生成各種遠程代理和對象。
在cmd方式下,執行slice2java printer.ice命令,即可得到所有相關的類和接口。
五.ICE實例
示例中我們定義了一個接口Printer,包含一個remotePrint方法,然后我們分別編寫服務器端和客戶端的代碼。注意該接口位於模塊src/slice目錄下,對於JAVA就是package,對於C++就是namespace。
在服務器端中,我們僅僅只是需要實現擴展該接口的Disp抽象類,並具體實現該遠程接口的唯一方法即可。
在服務器端中的SliceServer類雖然看起來比較復雜,但是實際上我們只需要編寫完整之后,每次都可以直接拿來作為新的服務器端啟動類來使用。而不需要每次都進行編寫。同理,客戶端中的SliceClient類也是實際上可以之后進行復用,而無需每次都重新編寫的。
本例中,我們僅僅定義了一個接口,其實可以擴展成定義多個接口,多個接口之間也是完全可以存在擴展和繼承關系。本例中我們唯一的接口僅僅包含一個remotePrint方法,自然也可以定義多個方法。並且每個方法都可以有返回值,而且返回值既可以是基本數據類型,也可以是自定義數據類型。
六.SLICE語法簡介
? 如前所述,ICE為了保證語言無關性,客戶和服務器使用Slice 來定義並建立兩者之間的接口合約。
? Slice (Specification Language for Ice) Slice 在客戶與服務器之間建立合約,描述應用所使用的各種類型及對象接口。這種描述與實現語言無關。 Slice編譯器定義了編譯到特定的實現語言。編譯器把與語言無關的接口和對象定義翻譯成針對特定語言的類型定義和API。之前的樣例就是一個SLICE接口合約,下邊我們簡單介紹一下SLICE語言。
①所有的Slice定義文件擴展名必須是.ice ,否則slice編譯器不接受。
②可以使用C或者C++風格的注釋。
③包含class,dictionary,ice等關鍵字,同時保留Helper,Holder等等保留的標識符。詳見相關的文檔。
④基本的數據類型有bool,byte(8位),short(16位),int(32位),long(64位),float(IEEE 單精度),double(IEEE 雙精度),string(沒有null的概念,因為其難以映射到部分語言中)。
六.SLICE語法簡介
⑤枚舉(enumerations)、結構(structures)、序列(sequences)以及詞典(dictionaries)。
枚舉例子: enum
Fruit { Apple, Pear, Orange };
映射到Java為枚舉 。
結構會映射為一個具體的Javabean。舉例子如下:
struct TimeOfDay { string
second; };
序列默認都是為數組,例如:
sequence FruitPlatter;
詞典映射為Map類型。例如:
dictionary<</SPAN>int,string> smap;
⑥可以定義基本數據類型的常量,使用const關鍵字即可。例如:
const
bool AppendByDefault
= true;
const string Advice = "Don't Panic!";
⑦接口定義。Slice的接口可以理解成Java的接口。接口中的方法即對應了Java接口中的抽象方法。例如我們例子中的remotePrint 方法就是一個沒有返回值的抽象方法,需求我們之后去繼承並實現。注意的是接口可以被繼承。
六.SLICE語法簡介
⑧此外slice還支持用戶自定義異常,其結構為
exception
customexception{ string message,string
code};
當然,一個異常也可以沒有任何信息數據。同時類似Java,一個接口的操作可以申明為拋出多個自定義異常。
⑨Slice還可以定義class類,類像是接口:它們都能有操作;類也像是結構:它們都能有數據成員。 Slice 的類定義與結構定義類似,但所用關鍵字是class。例如:
? class TimeOfDay
? { short hour; // 0 - 23
? short minute; // 0 - 59
? short second; // 0 - 59
?
};
但是同結構不同的是,類也可以被單繼承,能使用Slice 結構的地方,你都能使用Slice 類。但根據官方文檔的描述,一般而言結構相對於類,定義和實現更清晰,性能也更好。
六.SLICE語法簡介
最后,Slice還支持元數據。元數據指的是某一個具體語言映射的特殊類型或者特定標記。例如:
["java:type:java.util.LinkedList"]
sequence seqs;
[[“java:package:com.kaiqi.slice
”]]
對於第一個,當其作為到Java的映射時候,該sequence 就不會被轉換為通常的數組,而是作為Java的List類型被映射。而如果作為到C或者C++的映射,仍然會被作為數組。
第二個是一個比較特殊的元數據,成為全局元數據,映射為我們JAVA經常使用的包名前綴,同樣,只有在作為Java映射的時候才有效,對其他語言來說,編譯器會自動忽略。
七.結束語
ICE為我們提供了一個高性能分布式應用開發的框架,基於其提供的各種功能,使得我們可以專注於業務邏輯,而不用關心系統底層的通信和交互細節。面對市面上林林總總的中間件,我們又多了一個值得信賴的選擇。
由於時間有限,我們只能就ICE的基本功能做一個簡單的介紹,以便讓大家對其有一個全面系統的了解,在我們知道其用途之后,就可以在之后進行系統設計的時候多一份選擇。關於ICE更詳細的內容,以后有機會的話再同大家一起分享!
謝謝大家!
ICE的官網為:http://www.zeroc.com/