ICE詳解

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步

  1. 定義slice(specification language for ice,ICE特定語言)文件
  2. slice文件生成相應語言的代碼(根據client,server所使用的語言)
  3. 編寫client-side代碼並鏈接ICE
  4. 編寫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 ObjectsIce對象是一種概念性的實體 (或稱抽象) 。Ice對象具有以下特徵:

  • Ice對象是本地或遠地的地址空間中、能響應客戶請求的實體。
  • 一個Ice對象可在單個或多個服務器中實例化(後者是冗餘方式) 。如果某個對象同時有多個實例,它仍是一個Ice對象。
  • 每個Ice對象都有一個或多個接口。 一個接口是一個對象所支持的一系列有名稱的操作。客戶通過調用操作來發出請求。
  • 一個操作有零個或更多參數,以及一個返回值。參數和返回值具有明確的類型。參數是有名稱的,並且有方向:in參數由客戶初始化,並傳給服務器;out參數由服務器初始化,並傳給客戶 (返回值只是一種特殊的out參數)。
  • 一個Ice對象具有一個特殊的接口,稱爲它的主接口。此外,Ice對象還可以提供零個或更多其他接口,稱爲facets(面) 。客戶可以在某個對象的各個facets之間進行挑選,選出它們想要使用的接口。
  • 每個Ice對象都有一個唯一的對象標識(object identity) 。對象標識是用於把一個對象與其他所有對象區別開來的標識值。Ice對象模型假定對象標識是全局唯一的,也就是說,在一個Ice通信域中,不會有兩個對象具有相同的對象標識。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章