您当前的位置: 首页 > 

顺其自然~

暂无认证

  • 2浏览

    0关注

    1317博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ICE详解

顺其自然~ 发布时间:2020-04-21 09:27:01 ,浏览量:2

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,  dictionary在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通信域中,不会有两个对象具有相同的对象标识。
关注
打赏
1662339380
查看更多评论
立即登录/注册

微信扫码登录

0.0427s