我们在ice文件中定义的class或interface,slice都会为我们生成stub存根类和skeleton骨架类。在这里要注意slice并没有分别生成两份单独用在客户端或服务端的接口给开发分发。在ice中,client和server只是相对于ice object的使用关系,client即使用代理远程调用ice object的一方,server相对就是为ice object提供执行servant的一方。并非我们传统意义上的c/s结构中的client和server。ice object既可以存在地c/s结构的server端,c/s结构的client端同样也可以提供ice object给server端远程调用。

我们先来看一下,slice对定义的空类和空接口如何生成代码,下面是生成的stub存根类和skeleton骨架类的类图。

上面分别在ice文件定义一个空类"Empty"和一个空接口"I",slice分别为我们在名字空间::IceProxy::Module和Module下都生成了class Empty和class I的类。

不论是类还是接口,对于空的定义目标,slice生成的stub存根类都只是重写(override)了静态方法ice_staticId和成员方法_newInstance。上图左边的两个类Empty和I则是stub存根类。再来看右边生成的skeleton骨架类,slice也几乎做了同样的处理,重写(override)了骨架类最小接口ice_id,ice_ids以及ice_isA,还有跟streaming流化相关两个实现函数_iceReadImpl和_iceWriteImpl。唯一不同的是对于定义为类的Empty,它的skeleton骨架类多了两个成员函数ice_clone和ice_factory。

当我们定义一个类或接口,slice就会最少为我们生成上面类图所示的函数。当我们再定义一对非空的类或接口,我们就可以观察到slice为我们生成了什么,下面的类图隐去上面给出的已知。

首先是定义一个有一个方法的简单接口Intf。

灰色的类是Ice项目内置的类,非slice生成的类。slice为我们针对这个接口的远程调用生成了上面的框架的代码。生成的代码比重偏于Stub存根类(即代理方)的使用(如何应用远程调用)上。Skeleton骨架类重写(override)_iceDispatch分派,开设一个待实现的接口方法函数。

然后是定义一个非空的类NotEmpty,简单地有一个成员,成员类型为我们开篇时定义的Empty。

与上面给出接口生成的类图相比,slice对类的生成框架代码主要集在实体端,并且都是与流化(streaming)相关的设施。而生成的Stub存根类和对Empty(空类)生成的Stub存根类一样,因为它并没有接口方法,可以提供给代理进行远程访问。

从上面可以看到不论类还是接口,在代码映射后都是一个类实体。在slice定义时,我们使用这些类或接口时,都看作一个类实体。而使用这些类或接口的指针时,则看作是它们的代理。我们看下面定义

class B;
interface A {
B b;
B* bprx;
}; class B {
};

A::b会映射成::IceInternal::Handle<B>,而A::bprx会映射成::IceInternal::ProxyHandle<B>。指针被看作是一个对象实体的代理(引用)。

不论是类实体还是代理,都可以进行流化(streamin)在远程调用过程中传递。当传递一个指针,就是在传递相对于某个对象实体的代理。通过代理在ice世界任何一处都可以使用远程调用访问目标的实体。但是传递一个实体而非代理时,就和我们的c++语言在函数中传递对象实体一样,会在传递的目的方进行实体的构造。所以在ice程序中,尽管有一方使用代理进行远程访问为主,但它同样需要依赖slice生成的skeleton骨架类的代码,stub存根类和skeleton骨架类的代码并不分开发给c/s两方的开发者。

下面是以ice代码项目的测试例子项目为例,cpp/test/objects。

slice中定义的类图

slice生成的Skeleton骨架类

ZeroC ICE的远程调用框架 class与interface的更多相关文章

  1. ZeroC ICE的远程调用框架 Slice如何帮助我们进行Ice异步编程(AMI,AMD)

    Slice最大的用处就是为我们使用Ice进行编程,代劳绝大部分的重复性代码,并提供一些帮助性的框架代码,如用于AMI和AMD方式进行异步编程的回调框架. 当Slice不为我们生成代码时,我们仍然可以按 ...

  2. ZeroC ICE的远程调用框架 AMD

    继上一篇<ZeroC ICE的远程调用框架>,本篇再来说其中的AMD.(本篇需要重写) 当在ice文件中声明某个接口方法Method为["amd"]后,接口方法在stu ...

  3. ZeroC ICE的远程调用框架

    想搞清楚slice为我们生成了什么样的框架代码,就先搞明白Ice的远程调用框架暗中为我们做了些什么? Ice将Ice Object的方法调用分为三个阶段(或步骤),分别是begin,process和e ...

  4. ZeroC ICE的远程调用框架 AMI与AMD -Why?

    在Ice有两种异步使用的方式,AMI和AMD.AMI是异步方法调用,AMD是异步方法调度(分派).前者用在代理端,后者用在饲服实现端. AMI其实就是在代理端,使用Future机制进行异步调用,而不阻 ...

  5. ZeroC ICE的远程调用框架 Callback(一)-AMI异步方法调用框架

    Ice框架提供了不少回调设施,其中一些是使用Ice远程调用进行ami模式或amd模式的支撑.本篇来看一下用于代理端的回调设施. Ice代码中有好几个Callback相关命名的基类,并且slice还会为 ...

  6. ZeroC ICE的远程调用框架 ServantLocator与Locator

    ServantLocator定位的目标是Servant,而Locator定位的目标是“Ice Object”,即一个可定位的“Ice Object”代理.Servant是::Ice::Object的继 ...

  7. ZeroC ICE的远程调用框架 ThreadPool

    ThreadPool提供Reactor/Proactor服务,并且强偶合了Reactor(反应器)/Proactor(前摄器).不同于Reactor/Proactor使用线程池 进行事件处理的设计.如 ...

  8. ZeroC ICE的远程调用框架 代理引用地址

    在官方文档中称为Binding,协议-地址对的绑定.在Proxy模式中,一般地有三个参与者,Proxy,Subject以及RealSubject.Subject定义了Proxy(代理)和RealSub ...

  9. ZeroC ICE的远程调用框架 ASM与defaultServant,ServantLocator

    ASM与defaultServant,ServantLocator都是与调用调度(Dispatch)相关的. ASM是ServantManager中的一张二维表_servantMapMap,默认Ser ...

随机推荐

  1. SpringCloud之RefreshScope 源码解读

    SpringCloud之RefreshScope @Scope 源码解读 Scope(org.springframework.beans.factory.config.Scope)是Spring 2. ...

  2. TCC推导过程

    svn 账号 yuanzn 密码:TCH5mb 项目分层 MapperDao 数据校验 throw new CloudBaseRuntimeException Helper 数据转换 manager ...

  3. axios reponse请求拦截以及token过期跳转问题

    前两天项目中遇到了token拦截,需要在请求的header头里放置token,需要用到response拦截,调试过程中遇到了拿不到token的问题 我用的axios实例 let token = sto ...

  4. 通过FeignClient接收shaded的javabean的JSON序列化

    问题说明 最近做了关于flink的需求. 现在需要通过HTTP访问FLINK的 RESTAPI, rest 接口的JSON 非常庞大而复杂. 那么怎么去完整的接收数据呢? 方法一就是手写部分需要的Ja ...

  5. Java ArrayList底层实现原理源码详细分析Jdk8

    简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用 ...

  6. SpringBoot整合MybatisPlus3.X之乐观锁(十三)

    主要适用场景 意图: 当要更新一条记录的时候,希望这条记录没有被别人更新 乐观锁实现方式: 取出记录时,获取当前version 更新时,带上这个version 执行更新时, set version = ...

  7. ArangoDB数据导入

    目录 arangoimp方法 参数解析 实例展示 python方法 单条导入 批量导入 1.arangoimp方法 参数解析 全局配置部分(Global configuration) --backsl ...

  8. Mycat分布式数据库架构解决方案--Linux安装运行Mycat

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Myc ...

  9. Flask:Flask中使用会话技术

    1.会话技术cookie和session (1)cookie 在网站中,HTTP请求是无状态的.也就是说,即使第一次用户访问服务器并登录成功后,第二次请求服务器依然不知道当前发起请求的是哪个用户.co ...

  10. 《JavaScript设计模式与开发实践》-- 策略模式

    详情个人博客:https://shengchangwei.github.io/js-shejimoshi-celue/ 策略模式 1.定义 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们 ...