zoukankan      html  css  js  c++  java
  • ICE初识

    ICE:Internet Communications Engine
    一种适用于异种环境的面向对象中间件平台
    他为我们提供了除DCOM,CORBA,JAVA RMI,.NET Remoting, Web Service,SOAP RPC以外的一种远程调用方式。
    更重要的是ICE是一种跨操作系统跨语言的远程调用方式(支持.NET1.1 MONO1.0)。

    主页在:http://www.zeroc.com/index.html

    下面摘录几段ICE1.3文档中的话:
    Ice 是一种面向对象的中间件平台。从根本上说,这意味着Ice 为构建面
    向对象的客户-服务器应用提供了工具、API 和库支持。Ice 应用适合在异
    种环境中使用:客户和服务器可以用不同的编程语言编写,可以运行在不
    同的操作系统和机器架构上,并且可以使用多种网络技术进行通信。无论
    部署环境如何,这些应用的源码都是可移植的

    Ice 对象(Ice Objects)
    Ice 对象是一种概念性的实体(或称抽象)。Ice 对象具有以下特征:
    • Ice 对象是本地或远地的地址空间中、能响应客户请求的实体。
    • 一个Ice 对象可在单个或多个服务器中实例化(后者是冗余方式)。如果
    某个对象同时有多个实例,它仍是一个Ice 对象。
    • 每个Ice对象都有一个或多个接口。 一个接口是一个对象所支持的一系列
    有名称的操作。客户通过调用操作来发出请求。
    • 一个操作有零个或更多参数,以及一个返回值。参数和返回值具有明确
    的类型。参数是有名称的,并且有方向:in 参数由客户初始化,并传给
    服务器; out 参数由服务器初始化,并传给客户(返回值只是一种特
    殊的out 参数)。
    • 一个Ice 对象具有一个特殊的接口,称为它的主接口。此外, Ice 对象还
    可以提供零个或更多其他接口,称为facets (面)。客户可以在某个对
    象的各个facets 之间进行挑选,选出它们想要使用的接口。
    • 每个Ice 对象都有一个唯一的对象标识(object identity)。对象标识是用
    于把一个对象与其他所有对象区别开来的标识值。Ice 对象模型假定对
    象标识是全局唯一的,也就是说,在一个Ice 通信域中,不会有两个对
    象具有相同的对象标识。
    在实践中,你不需要使用像UUID[14] 这样的全局唯一的对象标识,
    只要你使用的标识与你感兴趣的域中的其他任何标识不相冲突,就可以
    了。但在架构上,使用全局唯一的标识符能带来一些好处,我们将在
    XREF 中对此加以探究。

    代理(Proxies)
    要想与某个Ice 对象联系,客户必须持有这个对象的代理1。 代理是客户
    的地址空间中的一种制品(artifact);对客户而言,代理就是Ice 对象的
    代表(该对象可能在远地)。一个代理充当的是一个Ice 对象的本地大使:
    当客户调用代理上的操作时, Ice run time 会:
    1. 定位Ice 对象
    2. 如果Ice 对象的服务器没有运行,就激活它
    3. 在服务器中激活Ice 对象
    4. 把所有in 参数传送给Ice 对象
    5. 等待操作完成
    6. 把所有out 参数及返回值返回给客户(或在发生错误的情况下抛出异
    常)
    代理封装了完成这一系列步骤所必需的全部信息。特别地,代理包含
    有:
    • 寻址信息:用于让客户端run time 联系正确的服务器
    • 对象标识:用于确定服务器中的哪一个对象是请求的目标
    • 可选的facet 标识符:用于确定代理所引用的是对象的哪一个facet

    串化代理(Stringified Proxies)
    代理中的信息可以用串的形式表示。例如:
    SimplePrinter:default -p 10000
    这个字符串表示的是一个代理,我们可以阅读这种表示方式。Ice run
    time 提供了一些API 调用,允许你把代理转换成它的串化形式,或是进行
    相反的转换。例如,如果你要把代理存储在数据库表或文本文件中,这种
    功能会很有用。
    倘若客户知道某个Ice 对象的标识及其寻址信息,使用这些信息,它可
    以“凭空”创建代理。换句话说,代理内部的所有信息都被认为是透明的
    ;要与某个对象联系,客户只需要知道这个对象的标识、寻址信息,以及
    对象的类型(为了能调用操作),就可以了。

    Ice 核心为分布式应用开发提供了一个完善的客户-服务器平台。但现
    实应用需要的常常不止是远地通信能力:你通常还需要拥有这样的能力:
    随需启动服务器、把代理分发给客户、分发异步事件、配置你的应用、分
    发应用补丁,等等。
    在Ice 中有一些服务, 能够提供上述特性及其他一些特性。这些服务被
    实现成Ice 服务器,你的应用充当的是这些服务器的客户。这些服务都没有
    使用Ice 的任何向应用开发者隐藏起来的内部特性,所以在理论上,你可以
    自行开发等价的服务。但让这些服务成为平台的一部分,你就可以专注于
    应用开发,而不必先构建许多基础设施。而且,构建这样的服务所需的工
    作量并非微不足道,所以你应该了解有哪些服务可用,而不要重新发明你
    自己的轮子。

    Ice 在架构上为应用开发者提供了一些好处:
    • 面向对象的语义
    Ice “在线路上”完全保留了 面向对象范型。所有的操作调用都使用
    迟后绑定,所以操作的实现的选定,是根据对象在运行时的(而不是
    静态的)实际类型决定的。
    • 支持同步和异步的消息传递
    Ice 提供了同步和异步的操作调用和分派,并且通过IceStorm 提供了
    发布-订阅消息传递机制。这样,你可以根据你的应用的需要来选择通
    信模型,而不必把你的应用硬塞进某种模型里。
    • 支持多个接口
    通过facets,对象可以提供多个不相关的接口,同时又跨越这些接
    口、保持单一的对象标识。这提供了极大的灵活性,特别是在这样的情
    况下:应用在发生演化,但又需要与更老的、已经部署的客户保持兼
    容。
    • 机器无关性
    客户及服务器与底层的机器架构屏蔽开来。对于应用代码而言,像
    字节序和填充这样的问题都隐藏了起来。
    • 语言无关性
    客户和服务器可以分别部署,所用语言也可以不同(目前支持
    C++、Java,以及PHP (客户端))。 客户和服务器所用的Slice 定义建
    立两者之间的接口合约,这样的定义也是它们唯一需要达成一致的东
    西。
    • 实现无关性
    客户不知道服务器是怎样实现其对象的。这意味着,在客户部署之
    后,服务器的实现可以改变,例如,它可以使用不同的持久机制,甚至
    不同的程序设计语言。
    • 操作系统无关性
    Ice API 完全是可移植的,所以同样的源码能够在Windows 和UNIX
    上编译和运行。
    • 线程支持
    Ice run time 完全是线程化的,其API 是线程安全的。 作为应用开发
    者,(除了在访问共享数据时进行同步)你无需为开发线程化的高性能
    客户和服务器付出额外努力。
    • 传输机制无关性
    Ice 目前采用了TCP/IP 和UDP 作为传输协议。客户和服务器代码都
    不需要了解底层的传输机制(你可以通过一个配置参数选择所需的传
    输机制)。
    • 位置和服务器透明性
    Ice run time 会负责定位对象,并管理底层的传输机制,比如打开和
    关闭连接。客户与服务器之间的交互显得像是无连接的。如果在客户调
    用操作时,服务器没有运行,你可以通过IcePack 让它们随需启动。服
    务器可以迁移到不同的物理地址,而不会使客户持有的代理失效,而客
    户完全不知道对象实现是怎样分布在多个服务器进程上的。
    • 安全性
    通过SSL 强加密,可以使客户和服务器完全安全地进行通信,这
    样,应用可以使用不安全的网络安全地进行通信。你可以使用Glacier
    穿过防火墙,实现安全的请求转发,并且完全支持回调。
    • 内建的持久机制
    使用Freeze,创建持久的对象实现变成了一件微不足道的事情。Ice
    提供了对高性能数据库Berkeley DB[18] 的内建支持。
    • 开放源码
    Ice 的源码是开放的。尽管要使用Ice 平台,并不一定要阅读源码,
    通过源码你可以了解各种事情是怎样实现的,或把这些代码移植到新的
    操作系统上。
    总而言之, Ice 提供了一流的分布式计算开发和部署环境,比我们所知
    道的其他任何平台都更完整。

    分享到: 更多
  • 相关阅读:
    iOS UITableViewCell中包含UICollectionView嵌套 解决UITableViewCell显示异常
    mac 终端创建podfile文件
    iOS UIScrollView弹性问题
    NSMutableParagraphStyle与NSParagraphStyle的使用
    iOS 单个控制器隐藏 导航栏下划线
    iOS UICollectionView reloadData后立即获取contentSize.height高度
    高德地图API开发二三事(一)如何判断点是否在折线上及引申思考
    Python-6
    Python-模块
    python-递归函数和内置函数笔记汇总
  • 原文地址:https://www.cnblogs.com/redmoon/p/68819.html
Copyright © 2011-2022 走看看