1. ICE的一些背景
ICE(the Internet Communications Engine,因特網通訊引擎),http://www.zeroc.com/ice.html
ICE 是ZeroC的主要產品, 是一個object-oriented toolkit,用來幫助我們構建分佈式應用程序,使我們專注於程序的邏輯而不是底程網絡交互的細節
ice提供了強大的 RPC(remote procedure call)功能,(同步異步Invocation,dispatch), one-way (對tcp,ssl),datagram(udp) ,也就是客戶端調用了就不管了(fire and forget),以及提供了除rpc之外的幾個強大的服務,iceGrid, iceStorm....
ICE提供的編程模型 :4步
- 定義slice(specification language for ice,ICE特定語言)文件
- slice文件生成相應語言的代碼(根據client,server所使用的語言)
- 編寫client-side代碼並鏈接ICE
- 編寫server-side代碼並鏈接ICE
ICE廣泛支持了各主流語言和 platform(OS & compiler)
2. ice manual的基本內容
這個文檔是ice主要的文檔了,編程什麼的都參考它,主要分了4個部份;
2.1,概述,ice主要的幾個部份介紹,在2.2.2(terminology)作爲術語解釋,包括ice object, ice proxy, ice object簡單說是一個可以響應client request的實體,它有至少一個interface,interface則有一個或多個operation,每個ice object都有一個object identity(object在35章詳講); ice proxy: client要想contact一個ice object,就必須hold一個ice proxy,它就是ice object的本地代理,所以proxy必須有object的address信息,以及object的identity來定位object,(proxy在32章詳講), 以及一個hello world例子,告訴我們最簡單的ice client,server怎麼寫
2.2 slice(specification language for ice,ICE規格語言) , slice在client和server之間做了一個約定, slice會被c++的預處理器作預處理,所以我們在文件中都應該用到#ifndef, #define,#endif, 另外 #include應該用<>,這樣slice compiler會在編譯選項的-I路徑中去查找頭文件,slice中所有的定義都必須放到module中,不能在全局定義
特別的要提到Ice module, 基本上所有的Ice run time時的API, 都是在以slice的形式定義和表達的,在module Ice { }中,比如我們下面提到的communicator是一個slice的interface
slice中的類型有basic types , user-defined types(enum, structure, sequence, dictionary), sequence<type>, dictionary<type,type>在c++中被映射爲vector和map
interface是slice中最中心最關注的東西了, 通過proxy調用一個operation則就由Ice run time向目標object發送了一個message, 4.10.4講了ice所定義的exception的層次結構,根處是Ice::Exception,應該是Ice自己用Slice定義的吧,不知道映射到C++中是不是std::Exception, interface可以用extends來派生, interface Thing extends BaseThing {}
class的內容很豐富,後面看,有和interface,struct的比較。。
2.3 slice到具體語言的映射,主要去看看到C++的映射
2.4 ice的configuration, thread, ice run-time的深入理解(其中有proxy),上面提到,run-time的api基本都是由slice定義的,以及ice object的深入理解
2.5 ice提供的其它服務,如ice storm
3. ICE manual 中的一張圖
這是在ice manual中概述部份的一張圖,2.2.5, client和server端的結構,其中proxy code和Skeleton都是slice生成的具體語言的代碼,Object Adapter是專屬server端的 Ice run-time的一部份,它把client的request映射到object具體的方法上
4, communicator的一點理解
以下內容差不多都看自於 Ice manual中Ice run-time in detail那一章
Communicator代表了Ice run time的主要進入點, Ice::Communicator的一個 instance(實例)關聯了一系列 run-time resources(運行時的資源) , 包括Client-side Thread Pool, Server-side Thread Pool , Configuration Properties ...... Communicator 是一個slice定義的 local interface, Communicator提供了一系列的operation, stringToProxy , createObjectAdapterWithEndpoints...; talk中的IceChannel這個類就是對 Ice Communicator的包裝, 且IceChannel中定義的方法大都是對createObjectAdapterWithEndpoints的包裝, 在talk的main函數中, 要用communicator的地方用的IceChannel
(32.3)Communicator的在創建的過程中, ICE run time爲其初始化了一系列的特性, 並且初使化後不能修改, 也就是只能在創建一個communicator時設定這些特性; 首先初始化一個data structure, 對C++來說是 struct InitializationData {PropertiesPtr properties; ...}, 然後使用函數 Ice::initialize來初使化生成一個communicator CommunicatorPtr initialize(const InitializationData& = InitializationData())
1 Ice::InitializationData id;
2 id.PropertiesPtr = properties;(properites先賦好值)
3 Ice::CommunicatorPtr ic = Ice::initialize(id);
在talk的 IceChannel::init()中先設置PropertiesPtr 再 生成 CommunicatorPtr_ ;
Object Adapters(32.4)
一個communicator有一個或多個object adapters, 一個object adapter處在Ice run time和server application(服務端應用程序)之間, Object Adapter本身是一個local interface,
endpoint的概念也是adapter的, 且一個adapter維護兩組endpoints, physical endpoints 和 published endpoints,
servant activation and deactivation(32.4.4) : adapter提供了 add , remove, find 等操作 , 在talk中main函數裏面用到了add, 注意創建的是 Ice::objectPtr ....,而add帶的第二參數是 Identity(32.5), 也就是client要使用這個servant必須知曉的名字
object Identity (32.5) 每一個ICE object都有一個object Identity, 這是一個slice定義的struct(module Ice中), Object Identity可以以string的形式表式, Fatory/File 表示 category是 Factory, name是File Communicator提供了 stringToIdentity 和 identityToString 來進行string和Identity的互轉 除非使用Locator, category常常是空的
module Ice{
struct Identity {
string name;
string category;
};
};
5.ICE wiki 介紹
http://en.wikipedia.org/wiki/Internet_Communications_Engine 這幅圖不錯 去細看看裏面那幅圖
ICE 在線文檔(不知道爲什麼現在沒找到pdf的下載了) http://doc.zeroc.com/display/Ice/Ice+Manual
Ice是一種面向對象的中間件平臺。從根本上說,這意味着Ice爲構建面向對象的客戶-服務器應用提供了工具、API和庫支持。Ice應用適合在異種環境中使用:客戶和服務器可以用不同的編程語言編寫,可以運行在不同的操作系統和機器架構上,並且可以使用多種網絡技術進行通信。無論部署環境如何,這些應用的源碼都是可移植的。
客戶與服務器 (Clients and Servers)
客戶與服務器這兩個術語不是對應用的特定組成部分的嚴格指稱,而是表示在某個請求從發生到結束期間,應用的某些部分所承擔的角色:
- 客戶是主動的實體。它們向服務器發出服務請求。
- 服務器是被動的實體。它們提供服務,響應客戶請求。
在從不發出請求、而只是響應請求的意義上,許多服務器常常不是“純粹的”服務器:它們常常充當某些客戶的服務器,但爲了完成它們的客戶的請求,它們又會充當另外的服務器的客戶。與此類似,在只從某個對象那裏請求服務的意義上,客戶常常也不是“純粹的”客戶:它們常常是客戶-服務器混合物。例如,客戶可以在服務器上啓動一個長時間運行的操作,在啓動該操作時,客戶可以向服務器提供回調對象(callback object),供服務器用於在操作完成時向客戶發出通知。在這種情況下,客戶在啓動操作時充當客戶,而在接收操作完成通知時充當服務器。這樣的角色反轉在許多系統中都很常見,所以,許多客戶-服務器系統常常可以被更準確地描述爲對等(peer-to-peer)系統。
Ice對象 (Ice Objects)Ice對象是一種概念性的實體 (或稱抽象) 。Ice對象具有以下特徵:
- Ice對象是本地或遠地的地址空間中、能響應客戶請求的實體。
- 一個Ice對象可在單個或多個服務器中實例化(後者是冗餘方式) 。如果某個對象同時有多個實例,它仍是一個Ice對象。
- 每個Ice對象都有一個或多個接口。 一個接口是一個對象所支持的一系列有名稱的操作。客戶通過調用操作來發出請求。
- 一個操作有零個或更多參數,以及一個返回值。參數和返回值具有明確的類型。參數是有名稱的,並且有方向:in參數由客戶初始化,並傳給服務器;out參數由服務器初始化,並傳給客戶 (返回值只是一種特殊的out參數)。
- 一個Ice對象具有一個特殊的接口,稱爲它的主接口。此外,Ice對象還可以提供零個或更多其他接口,稱爲facets(面) 。客戶可以在某個對象的各個facets之間進行挑選,選出它們想要使用的接口。
- 每個Ice對象都有一個唯一的對象標識(object identity) 。對象標識是用於把一個對象與其他所有對象區別開來的標識值。Ice對象模型假定對象標識是全局唯一的,也就是說,在一個Ice通信域中,不會有兩個對象具有相同的對象標識。