`

ice学习与应用

 
阅读更多
Ice中间件研究
简介
Ice 是一种面向对象的中间件平台。从根本上说,这意味着  Ice 为构建面向对象的客户-服务器应用提供了工具、 API  和库支持。 Ice  应用适合在异构环境中使用:客户和服务器可以用不同的编程语言编写,可以运行在不同的操作系统和机器架构上,并且可以使用多种网络技术进行通信。无论部署环境如何,这些应用的源码都是可移植的。
 
 
Slice语言
在介绍 Ice 工作原理之前,有必要来了解一下 Slice语言。
Slice( Specification Language for Ice )是一种用于使对象接口与其实现相分离的基础性抽象机制。  Slice 在客户与服务器之间建立合约,描述应用所使用的各种类型及对象接口。这种描述与实现语言无关,所以编写客户所用的语言是否与编写服务器所用的语言相同,这没有什么关系。 Slice 定义由编译器编译到特定的实现语言 。编译器把与语言无关的定义翻译成针对特定语言的类型定义和  API 。开发者使用这些类型和 API  来提供应用功能,并与  Ice  交互。用于各种实现语言的翻译算法称为语言映射( language mappings )。  Ice  目前定义了  C++, Java, C#, Python, Objective-C, Ruby, PHP. 的语言映射。 Slice 定义的文件扩展名为  .ice 。
以上是官方文档的表述,难以形成清晰的概念,如果用一种不太严谨但更容易理解的话来讲,
Slice是一种用于定义接口的中间语言。
 
 
Slice语言编译
Ice为每种其所支持的语言 ( 以下称宿主语言 ) 提供了相关编译器,假设语言为 XXX, 则编译命令一般为 slice2XXX, 用于为 slice 文件生成相对应的用宿主语言定义的映射代码,以辅助服务端或客户端的开发。
 
 
Ice基本原理
 
有了Slice 语言的基本概念,理解 Ice 的工作原理变得容易,下图很好地呈现了 Ice 的工作原理及执行流程:
 
 

 
1. 首先用slice 语言编写好“接口”
2. 接口编好后,自然要去实现它,这时可以选择任一种宿主语言去实现该接口。本图例用的是C++ 。用相应编译器生成辅助代码后,开发者在此基础上进行业务逻辑的开发。实现接口的一方通常作为服务端,可利用 Ice 提供的 api 发布服务。
3. 作为调用方,同样可以选择任一种宿主语言。本图例是用Java 。
4. 服务端运行后,客户端便可调用其提供的接口。Ice 为我们屏蔽了底层的通讯细节。
 
 
安装
windows
Windows平台安装比较简单,下载 安装文件 然后安装即可。Windows 安装文件已带有 demo 。
 
Linux
1. 下载 Ice-3.4.1-rhel5-i386-rpm.tar.gz
2. 安装文件放到linux 任意目录,打开 linux 终端
3. 解压文件
#tar xzvf  Ice-3.4.1-rhel5-i386-rpm.tar.gz
4.安装必要的 rpm
#rpm -ivh ice-3.4.1-1.rhel5.noarch.rpm
#rpm -ivh db48-4.8.30-1ice.rhel5
#rpm -ivh ice-libs-3.4.1-1.rhel5
#rpm -ivh ice-servers-3.4.1-1.rhel5
#rpm -ivh ice-utils-3.4.1-1.rhel5
5. 根据需要安装宿主语言支持,本例为java
#rpm -ivh db48-java-4.8.30-1ice.rhel5
#rpm -ivh ice-java-3.4.1-1.rhel5
#rpm -ivh ice-java-devel-3.4.1-1.rhel5
 
安装完毕,如需要demo, 需要下载 Ice-3.4.1-demos.tar.gz
 
 
Java端开发
以下链接介绍了如何安装和使用Eclipse 插件进行 Ice 程序开发
http://www.zeroc.com/eclipse.html
想进一步了解编程细节,可参考官方提供的Demo 。
tips:
Java语言的 Demo 是用 Ant 来构建的,为方便运行 Demo, 建议采用以下方式。
(为便于表述,以下称Demo 根目录为 ICE_DEMO)
打开ICE_DEMO/config/common.xml 文件,在文档尾部增加以下两个任务:
<target name="runServer" depends="init">
 
        <java className="Server">
                   <classpath refid="ice.classpath" />
                   <classpath location="${class.dir}"/>
        </java>
 </target>
 <target name="runClient" depends="init">
        <echo message="path: ${dist.jar.file}"/>
                <java className="Client">
                   <classpath refid="ice.classpath" />
                   <classpath location="${class.dir}"/>
        </java>
  </target>
 
经过修改后,demo 的运行变得方便,试举一例:
#cd ICE_DEMO/demoj/Ice/minimal
#ant all
#ant runServer
另开一终端
#ant runClient
 
其中ant all 是执行代码生成,编译等任务,如无修改,只需执行一次,以后可省去此步。
 
Ice服务
Ice 核心为分布式应用开发提供了一个完善的客户-服务器平台。但现实应用需要的常常不止是远程通信能力:你通常还需要拥有这样的能力:随需启动服务器、把代理分发给客户、分发异步事件、配置你的应用、分发应用补丁,等等。在  Ice  中有一些服务, 能够提供上述特性及其他一些特性。这些服务被实现成  Ice  服务器,你的应用充当的是这些服务器的客户。这些服务都没有使用  Ice 的任何向应用开发者隐藏起来的内部特性,所以在理论上,你可以自行开发等价的服务。但让这些服务成为平台的一部分,你就可以专注于应用开发,而不必先构建许多基础设施。而且,构建这样的服务所需的工作量并非微不足道,所以你应该了解有哪些服务可用,而不要重新发明你自己的轮子。
Ice服务内容非常丰富,诸如负载均衡,消息服务,容器,持久化等功能都是由 Ice 服务来提供, 以下对 IceGrid服务进行介绍 。
 
 
IceGrid
IceGrid是 Ice 定位服务的一个实现,以解决在间接代理中用符号信息来对协议地址对进行间接绑定的问题。定位服务仅仅是IceGrid 的能力的一部分:
•IceGrid 允许您注册自动启动服务器:而不需要在运行一个客户端前,必须先启动服务器。当第一客户端请求到达时, IceGrid 将按需启动服务。 
•IceGrid 提供的工具可以很容易地配置包含在多台服务器中复杂的应用程序。 
•IceGrid 支持复制和负载均衡。 
•IceGrid 使可执行文件和依赖文件的分发和打补丁自动化。 
•IceGrid 提供了一个简单的查询服务,使客户能够获得他们感兴趣的对象的代理。
 
一 个 IceGrid 域由一个注册表( Registry )和任何数目的节点 (Node) 构成。注册表( Registry )和节点 (Node) 一起合作管理一些信 息以及包含一些应用( Application )的服务进程。每项应用( Application )被指定在特定节点上的服务。这个注册表 ( Registry )持久记录了这些信息,而节点( Node )负责启动和监测其指定的服务器进程。对于一个典型的配置,一个节点( Node )运行在一台计 算机 ( 称之为 Ice 服务器主机 ) 。注册表( Registry )并不消耗很多处理器时间,所以它常常是和一个节点( Node )运行在同一台计算机上的 ; 事实 上,如果想要的话,注册表( Registry )可以和一个节点( Node )可以运行在同一进程中 . 如果容错是理想的,注册表( Registry )使用主从 式的设计支持复制( Replication )。 也可将注册表与节点进行分离,如下图:

以下将演示一个实例,以对 IceGrid有一个比较清晰的理解。
ICE_DEMO/demoj/IceGrid/simple的例子向我们展示了 IceGrid 的简单应用,该例子主要演示的是服务端实现了打印字符接口,客户端通过调用接口,在服务端打印出 Hello world 。
1. 要运行该事例,首先开启IceGrid 服务
打开终端1
$ cd ICE_DEMO/demoj/IceGrid/simple
$  icegridnode --Ice.Config=config.grid
2. 部署服务
打开一个新终端2 ,执行
$ icegridadmin --Ice.Config=config.grid -e \
"application add 'application.xml'"
3. 运行客户端
打开一个新终端3 ,执行
$ant runClient
出现界面

 
输入 t后回车
回到终端1 ,出现以下消息:
SimpleServer says Hello World!
 
由此可见,我们并没有手动开启服务端,当客户发出调用请求时,IceGrid 已经帮我们运行并激活了服务程序。
 
 
 
负载均衡集群
修改上面示例,以体现IceGrid 服务的负载均衡特性。
1、 环境
主机1 : IP= 90.0.12.199 ,上面部署注册表服务器registry 和节点 node1 , registry 和 node1 运行在 不同 进程中;
主机2 : IP= 90.0.12.200 ,上面部署节点node2 ;
其中每个节点中包含 三 个服务程序, 节点 1 各服务器名为 SimpleServer-1/2/3, 节点 2 各服务器名为 SimpleServer-4/5/6。

2、主机 1 配置
(1 ) 注册表服务器 XML: config.register ,内容如下

Xml代码  
IceGrid.InstanceName=DemoIceGrid  
  
#  
  
# The IceGrid locator proxy.  
  
#  
  
Ice.Default.Locator=DemoIceGrid/Locator:default-p 4061  
  
#  
  
# IceGrid registry configuration.  
  
#  
  
IceGrid.Registry.Client.Endpoints=default-p 4061  
  
IceGrid.Registry.Server.Endpoints=default  
  
IceGrid.Registry.Internal.Endpoints=default  
  
IceGrid.Registry.Data=db/registry  
  
IceGrid.Registry.PermissionsVerifier=DemoIceGrid/NullPermissionsVerifier  
  
IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier  
  
IceGrid.Registry.SSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier  
  
IceGrid.Registry.AdminSSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier  
  
   
  (2)节点 1 配置文件 : config.node1, 内容如下

Xml代码  
#  
  
Ice.Default.Locator=DemoIceGrid/Locator:default -p 4061  
  
#  
  
# IceGrid registry configuration.  
  
#  
  
#  
  
# IceGrid node configuration.  
  
#  
  
IceGrid.Node.Name=node1  
  
IceGrid.Node.Endpoints=default  
  
IceGrid.Node.Data=db/node  
  
#IceGrid.Node.Output=db  
  
#IceGrid.Node.RedirectErrToOut=1  
  
#  
  
# Trace properties.  
  
#  
  
IceGrid.Node.Trace.Activator=1   
(3)修改服务部署文件  application_with_replication.xml ,内容如下

Xml代码  
<icegrid>  
  
  <application name="Simple">  
  
    <server-template id="SimpleServer">  
  
      <parameter name="index"/>  
  
      <server id="SimpleServer-${index}" exe="java" activation="on-demand">  
  
   <option>-classpath</option>  
  
        <option>/usr/share/java/Ice-3.4.1.jar:./classes/</option>  
  
        <option>Server</option>  
  
        <adapter name="Hello" endpoints="tcp" replica-group="ReplicatedHelloAdapter"/>  
  
        <property name="Identity" value="hello"/>  
  
      </server>  
  
    </server-template>  
  
    <replica-group id="ReplicatedHelloAdapter">  
  
      <load-balancing type="round-robin"/>  
  
      <object identity="hello" type="::Demo::Hello"/>  
  
    </replica-group>  
  
    <node name="node1">  
  
      <server-instance template="SimpleServer" index="1"/>  
  
      <server-instance template="SimpleServer" index="2"/>  
  
      <server-instance template="SimpleServer" index="3"/>  
  
    </node>  
  
    <node name="node2">  
  
      <server-instance template="SimpleServer" index="4"/>  
  
      <server-instance template="SimpleServer" index="5"/>  
  
      <server-instance template="SimpleServer" index="6"/>  
 
--------------------------------------------------------
2.  主机2 配置
 (1)节点 2 配置文件 : config.node2, 内容如下,与 node1 不同的是,需配上注册服务器地址

Xml代码  
#  
  
Ice.Default.Locator=DemoIceGrid/Locator:default   -h  90.0.12.199  -p 4061  
  
#  
  
# IceGrid registry configuration.  
  
#  
  
#  
  
# IceGrid node configuration.  
  
#  
  
IceGrid.Node.Name=node 2  
  
IceGrid.Node.Endpoints=default  
  
IceGrid.Node.Data=db/node 2  
  
#IceGrid.Node.Output=db  
  
#IceGrid.Node.RedirectErrToOut=1  
  
#  
  
# Trace properties.  
  
#  
  
IceGrid.Node.Trace.Activator=1   
 

3 、客户端配置
配置文件:config.client ,内容如下:
#
# The IceGrid locator proxy.
#
Ice.Default.Locator=DemoIceGrid/Locator:default -h  90.0.12.190  -p  4061  #只需有注册表服务器的端点信息即可

4 、启动服务程序
(1 )主机 1 上先启动注册表 服务器 和节点1 ,
#icegridregistry  --Ice.Config=config. register
新开一终端,执行
# icegridnode --Ice.Config=config. node1
(2 )主机 1 上部署服务(只需部署一次,除非修改过),执行:
icegridadmin --Ice.Config=config .register  -e "application add  'application_with_replication.xml' "
若要重新部署,执行:icegridadmin --Ice.Config=config.grid -e " 'application_with_replication.xml' "
(3 )主机 2 上启动节点 2
# icegridnode --Ice.Config=config.node 2
 
 
5. 客户端调用测试
#ant runClient

选择 t,然后观察两个节点的终端,可见节点 1 终端出现
SimpleServer-1 says Hello World!
 
将当前客户端暂停运行
#ctrl + z
继续运行一个客户端
#ant runClient
选择 t,然后观察两个节点的终端,可见节点 1 终端出现
SimpleServer-2 says Hello World!
 
反复执行以上各步,当运行到第四个客户端时,观察两个节点的终端,可见节点2 终端出现
SimpleServer-4 says Hello World!
 
 
 http://yangguo.iteye.com/blog/1096630
分享到:
评论

相关推荐

    Zeroc_ICE学习大全

    中文教程、微服务架构入门、权威指南、应用配置手册、快速入门、3.7.0源码资源

    ZeroC Ice权威指南

    , 与很多技术类书籍不同的是,《ZeroC Ice权威指南》不是简单地罗列知识点和简单代码,而是在指导学习的过程中,不断抛出一些高质量代码,如客户端封装、服务端框架、服务调用拦截监控等可立即应用于生产的代码,...

    ice分布式应用开发中文手册

    • 提供一组完整的特性,支持广泛的领域中的实际的分布式应用的开发。 • 避免不必要的复杂性,使平台更易于学习和使用。 • 提供一种在网络带宽、内存使用和 CPU 开销方面都很高效的实现。 • 提供一种具有内建安全...

    ICE讲座资料,包括PPT和C++源程序

    利用ICE通信中间件构建分布式应用程序开发框架 1.什么是ICE? ICE,夏天我最容易想的是冰激淋 : -- ) 在这里我们要讲的可不是冰激淋,而是一种用于分布式程序设计的网络通信中间件ICE(Internate Communications Engine)...

    中间件ICE中文文档手册

    Internet Communications Engine,简称Ice。其主要设计目标是: 1.提供适用于异种环境的面向对象...更简单地说,Ice的设计目标可陈述为:"让我们构建与CORBA 一样强大的中间件平台,而又不去犯CORBA 所犯下的任何错误"。

    Ice-1.3.0_分布式应用(中文版)

    版本有点老,但是拿来学习没问题; 而且其他人不是描述不清,就是分太高

    ICE分布式程序设计

    ICE提供适用于异种环境的面向对象中间件平台。 • 提供一组完整的特性,支持广泛的领域中的实际的分布式应用的开发。 • 避免不必要的复杂性,使平台更易于学习和使用。 • 提供一种在网络带宽、内存使用和 ...

    ice:全面的RPC框架,支持C ++,C#,Java,JavaScript,Python等

    通过处理与底层网络编程接口的所有交互,Ice使您可以将精力集中在应用程序逻辑上。 使用Ice时,无需担心细节,例如打开网络连接,对数据进行序列化和反序列化以进行网络传输,或重试失败的连接尝试(仅举几例这样的...

    chantilly::soft_ice_cream:用于在线机器学习模型的部署工具

    简单: chantilly基本上只是一个Flask应用程序。 直截了当:您提供了一个模型, chantilly提供了一些API路由来完成其余的工作。 方便: chantilly赶走你的存储预测和学习步骤之间功能的负担。 灵活:只要使用...

    2021大数据计算(边缘计算+实时计算+计算架构等)资料合集-共34份.zip

    硬实时计算加速机器学习应用规模化落地 基于DorisDB构建实时数据仓库 FlinkSQL在实时维度建模中的应用 基于参数服务器的高性能分布式图计算框架 端边云全场景的AI计算框架 预训练模型和图计算的实践应用 AI计算服务...

    DataFunSummit2022:大数据计算架构峰会PPT合集(47份).zip

    Apache Iceberg 批流一体的实践 Apache Doris 极速1.0版本解析与未来规划 Apache Flink 流批一体的规划和进展 大数据弹性云的方案演进 电商零售大数据分析云上实战 工业需要什么样的边缘计算 埋点数据流建设与...

    Android应用程序开发原码例子

    Google于2007年11月05日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。它采用软件堆层(Software Stack,又名软件叠层)的架构,主要...是广大爱好者学习过程。

    QCon 2023全球软件开发大会广州站(公开)PPT汇总(47份).zip

    EB 级 Iceberg 数据湖的机器学习应用与优化 云原生时序数据库的挑战和架构设计 下一代微服务架构的实践与探索 大数据平台出海上云架构设计与实践 探索软件开发新工序:LLM 赋能研发效能提升 ……等等。

    Android 教学实验箱 CES-EDU210B

    理论与实践的结合,透过详尽的实验例程,更深层次、系统化的学习Android系统的相关技术,从系统架构介绍、开发环境搭建,再到系统到平台的移植,应用软件的开发,整个课程系统采用由浅及深、循序渐进的学习模式,...

    HarmonyOS 鸿蒙应用开发 例1-任务进度管理程序

    对于ArkUI框架本身,你需要学习框架提供的装饰器、组件、状态管理等核心概念。理解@State、@Styles、@Extend、@Builder等装饰器的作用和使用方法,学会如何定义和使用组件,以及如何管理组件内的状态。实践是巩固所...

    单片机 80C51 51单片机 单片机课件 单片机教材

    通过对基本概念和单片机的发展与特点的介绍,使学生建立起对单片机和单片机应用系统的开发过程有全面的认识,激发学生学习单片机的学习信心和兴趣。 教学内容: 1.单片机概述 2.单片机的发展 3.单片机的应用 4....

    nhl-fantasy-helper:小型应用程式,适合NHL幻想玩家

    学习React 使用Sass重新学习样式让我的梦想成真,创造出与曲棍球有关的东西,尤其是与NHL有关的东西 开始项目 在项目目录中,可以运行: yarn start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您...

Global site tag (gtag.js) - Google Analytics