跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

用GT3开发网格服务

李彬 (bin_li@eyou.com), 在读硕士研究生, 北京市华北计算技术研究所
作者相片
李彬,男,华北计算技术研究所在读硕士研究生。研究方向是网格计算,信息可视化。对网格计算有很强的爱好,目前正从事一个网格项目的开发。你可以通过 bin_li@eyou.com和他联系。

简介: 本文对网格的概念和发展方向进行了简要的介绍和探讨,并对OGSI1.0(开放网格服务基础设施)的具体实现Globus Toolkit3.0的结构进行了剖析,最后用具体的例子演示了GT3在Windows平台下的安装和编程。

发布日期: 2003 年 9 月 01 日
级别: 初级
访问情况 : 923 次浏览
评论: 


网格的概念

什么是网格(grid)?网格就是一种集成的资源和服务的环境。这里网格集成的东西包括计算能力、数据信息和知识、软件、人等各种相关的资源和服务。网格(Grid)概念产生于90 年代中期,是从电力网的概念借鉴过来的。网格的目的是要利用互联网把分散在不同地理位置的电脑组织成一台"虚拟的超级计算机", 实现计算资源、存储资源、数据资源、信息资源、软件资源、存储资源、通信资源、知识资源、专家资源等的全面共享。传统互联网实现了计算机硬件的连通,Web 实现了网页的连通,Web服务实现了程序和程序之间的共享,而网格试图实现互联网上所有资源的全面连通。网格希望用户在使用网格时,就如同现在使用电力一样方便地使用分布在网络上强大而丰富的各种资源。

网格计算( Grid Computing)就是基于网格的问题求解。

当人们在谈论网格时,喜欢用电力网的例子来类比网格。如使用电力时,用户通过电源插头获得所需的电力,但并不在乎这些电力来自那个发电厂的那台发电机,而电力网中的输配电系统保证根据用户的需要供应电力。有关电压、频率等标准使这种电力的动态组合和分配成为可能。而网格也希望给最终的使用者提供的是与地理位置无关、与具体的设施无关的通用的解决问题的能力(计算能力)。

那么我们能不能换一种思维:网格是如此和电力网相像,我们为什么不认为网格也是整个社会发展的基础设施的一部分呢?它就像水力、电力、交通等基础设施一样,用一种统一的方式向人们提供计算能力,做到按需应变、随需所用。也就是说,原来我们把IT设施当作商品来购买,而网格环境下,作为商品的不仅是IT设施本身,还有它们自身所具有的计算、存储、软件等资源。当然这是网格的最终目标,要达到这一步我们还有很长的路要走。

一般说来,网格中除了作为其基础的计算机、存储器、通信线路等硬件外,还有用于合成(集成、整合)这些硬、软件资源的软件。我们把这些在分布式网络上共享的计算能力和其他硬件资源称之为物理网格(physical grid),而把这些合成、整合这些硬件资源按某一业务流程以完成某项任务的软件和控制流程称之为逻辑网格(logical grid)。物理网格可以被多个逻辑网格使用,而逻辑网格可以使用多个物理网格来完成某一任务。从某种意义上说,逻辑网格是网格的核心。网格中最难解决的又是如何把动态地按需配置逻辑网格以建立能够完成用户要求的网格系统(如满足某种要求的某个企业的B2B电子商务系统,满足某种联合作战需要的指控系统)。


为什么需要网格计算

网格计算最初的由来是设备利用率问题(也就是利用成本问题),参看下面的统计数字[4]:

  • 大型机有40%的时间处于空闲状态
  • Unix服务器有90%的时间处于空闲状态
  • 多数的PC有95%的时间处于空闲状态

这一点从我们实验室的现状也可以看到。平时我们的PC机使用效率很低,从Windows自带的任务管理器上可以看出,CPU的使用经常在1%-5%之间。只用在启动一个程序或者运行一个大型程序时,CPU的使用率才高一些。与此相对的是,有些大型机或资源是希缺或不可复制的,有些资源无法和特定的地理位置分开。这一切都造成了资源的极大浪费,我们投入大量的资金购置的IT设备,却又一半以上的时间没有利用,而有人却急需这些资源,却没有购买这些昂贵的IT设备的资金,那么多余的计算能力该如何处理呢?如何解决这一矛盾呢?

这是一个观念的转变。一些人提出,计算能力最终也会像水力、电力那样成为整个商业社会发展的基础设施。计算能力就像电力、自来水一样当作商品由公共购买,做到随需所用。当一个企业在解决某项问题需要计算能力时,他的第一反应不是去购买计算机等IT设备,而是像购买水力、电力一样去购买计算能力。这样企业界(各个IT公司如IBM、HP、SUN、MicroSoft)必须能够像水力、电力公司(如自来水公司、发电厂)那样方便、简捷的提供计算能力。

网格计算的第二个由来是系统之间的集成问题(如动态的电子商务)。我们知道现阶段我们开发的软件有一个很严重的问题就是所谓的"烟囱式"问题。即各个应用程序之间的联系是很弱或是没有的。如各个企业系统之间信息交互问题,这是企业进行电子商务所必须解决的问题。这一问题在企业规模很小时可能现不出来,但一旦企业的规模很大,要和其伙伴或客户进行电子商务时这一问题就很明显的暴露出来。因此,为了更好的集成、实现和维护这些系统,需要标准的技术和平台构架以支持系统之间的集成。

网格计算就是提供这种计算能力和解决系统集成所需要的步骤中的一个阶段。网格环境把网络上现有的计算资源、存储资源能看作一台虚拟的"超级计算机",用户就像使用本地机群一样使用和管理网格上的各种资源。如同电力网中的电压、频率一样,网格环境也提供了一系列的标准来解决异构、异种平台系统之间的集成问题。网格计算的基础是基于XML的消息传递。它用XML格式来包装各种数据、消息在各个系统之间进行信息交换。


网格计算的技术基础和发展方向

当计算能力像水力、电力一样成为社会发展的基础设施时,我们称之为公用计算(Utility Computing)[4]。应该说,把IT作为公共设施的概念并不新鲜,直到现在,技术的发展使之成为可能:

  • 宽带技术的发展使得带宽的成本大大降低,大量的光纤已经应用在网络中,可以为用户高速优质的提供数据;
  • 分布式的信息和应用程序体系结构的部署,新的技术如Web服务的出现,使得服务能够遍及整个网络;
  • 服务器和存储器的虚拟化,使得我们能从更高的结构级别上共享信息和数据。

当然要到这一目标,需要以下几个发展阶段[4]:



从图中可以看出,网格目前正处于发展时期。网格是建立在Web服务和其他标准的基础之上的。网格是网络上可用的一组分布式计算资源,它在最终用户或应用程序面前表现为一个大型虚拟计算系统。网格可以跨越地点、组织、机器体系结构和软件边界,向连接到网格的每个人提供无限的能力、协作和信息访问。网格使得网络计算更象一个公共设施。您只要在需要计算能力的时候将它提供给需要它的地方;当您使用它时,为您所用的资源付费。

网格的发展经历了三个阶段:第一阶段是网格的萌芽阶段,开始于90 年代早期,研究内容是关于千兆网试验床以及一些元计算方面的工作;第二阶段是一些早期的试验,时间大概从90 年代中期到晚期,出现了一些比较重要的开创性和奠基性的研究项目,比如I-WAY, Globus,Legion等;目前是网格计算的迅速发展阶段,关于网格的研究、开发和应用项目大量出现,出现了影响很大的组织全球网格论坛GGF(Global Grid Forum),同时网格计算也不再仅仅局限于科学研究,工业界与学术界联盟,正致力于使网格计算在更广泛的领域得到推广和应用。

类似于因特网,网格也是从科学领域开始的,但现在已经由商业企业部署了。2002年在加拿大多伦多进行的第4界全球网格论坛(GGF)会议上,IBM 和 Globus 协作公共倡议了一个全新的网格标准(OGSA)。开放网格服务体系结构(Open Grid Services Architecture,OGSA)将Globus标准和商业的 Web 服务标准相结合,把这种资源统一以网格服务的形式提供给外界使用。OGSA为基于网格的应用定义了一个公共的和标准的体系结构,这个结构的核心是网格服务的概念。它把网格服务看作是一种特殊的Web服务。OGSA是基于网格服务的分布式体系框架,它以服务为中心,强调的是服务实例的位置透明性和多协议绑定,支持对底层各种平台设施的集成。OGSA的诞生,标志着网格不仅仅局限于科学计算领域,还能够对各种商业应用进行广泛的、基础性的网格环境的支持,实现更方便的信息共享和互操作,从而对商业模式、人员的工作方式和生活方式产生深远的影响。

OGSA只是一个框架,它不涉及网格服务如何实现等具体的问题。GGF组织的OGSI(开放网格服务基础设施)工作组制定了OGSI标准来实现OGSA中提出的各种概念。它是一个正式的技术规格说明书。相对OGSA来说,OGSI在技术层面上涉及的要多的多,也更为正式。

GT3(Globus toolkit 3.0)是一个基于OGSI1.0标准而实现的用于开发网格应用的工具包。目前它是基于Java语言的,并以7月1日发布了正式版本。作为国际上最有影响的和网格相关的项目之一,GT3已经成为建造网格应用和网格环境的首选。国内外大部分的网格项目都是基于GT3开发和运行的。GT3也是我们以后主要的工作重点,我们大部分的工作是围绕GT3进行的。下面会详细讨论一下GT3。


GT3介绍

GT3的体系结构见图[2]:



图中白色的部分是GT3 Core提供的。它们是建立网格服务的基础。OGSI 参考实现(RI)实现了OGSI规范1.0所定义的接口,以API和工具的形式提供给用户以方便开发和OGSI兼容的网格服务。安全基础设施(SI)提供SOAP安全,传输层安全,相互认证,单点登录服务认证等功能。GT3核心还提供了系统级服务用来作为运行时和其他服务相关联的基础,它们建立在OGSI-RI和OGSI-SI之上。GT3同时还提供了一些基础服务,如程序执行,数据管理和信息服务等。这些服务是建立在OGSI和GSI组件之上的。用户定义服务是指由用户开放的高层服务,它不由GT3提供,可以建立在任何GT3的组件之上,包括基础服务。

所有这些服务是和抽象的OGSI运行时环境相交互的,我们称为网格服务容器。网格服务容器把应用和服务运行时细节分离开来,同时还控制服务的生命期、把消息分发给对应的服务实例等。容器的前端封装了一个标准的Web服务引擎接口,用来实现XML消息映射。

最后,Web服务引擎和网格服务容器宿主到一个主机环境中。目前GT3支持4种Java主机环境:

  • Embedded:以库文件的形式将OGSI主机环境嵌入已有的J2SE应用中。
  • Standalone:一个可以部署网格服务的轻量级的J2SE服务器。
  • J2EE Web Container :将OGSI主机环境嵌入Web服务器中,该Web服务器具有Java Servlet引擎,如Jakarta Tomcat。
  • J2EE EJB Container:把网格服务容器嵌入到EJB应用服务中。

GT3软件结构模型

服务端框架

服务端框架见下图[8]:



如上图所示,GT3服务端框架主要包括以下组件:

  • Web服务引妗U飧鲆媸怯葾pache AXIS 提供,用来处理普通的Web服务行为,SOAP消息处理,JAX-RPC句柄处理和Web服务配置。
  • GT3服务容器。GT3提供一个容器来管理网格服务。它包括状态管理,生命期管理和"软-状态"管理等。

目前GT3使用Apache AXIS作为它的Web服务引擎,它运行在J2EE Web容器内,并提供一个SOAP消息监听者(AXIS Servlet)。它负责SOAP请求/响应进行序列化和反序列化,JAX-RPC句柄调用和网格服务配置。GT3容器提供了一个主句柄(pivot handler)来把从AXIS框架中的消息传递到GT3容器中。

GT3容器用来管理网格服务的状态和生命期。只要服务工厂产生一个网格服务实例,框架就会为这个实例生成一个唯一的句柄(GSH),这个服务实例注册到服务容器资源库中。服务容器资源库中保存着所有的状态服务实例,它可以和其他框架组件和句柄联系以完成如下服务:

  • 鉴别服务和调用方法
  • 设置/得到服务属性(例如GSH和GSR)
  • 激活/钝化服务
  • 把GSH解析为GSR和保持服务持久性

客户端框架

客户端的框架如图所示[8]:



如图所示,GT3使用JAX-RPC客户端编程模式和AXIS客户端框架来编写网格服务客户端,除此之外,它还提供了一些帮助类来隐藏OGSI客户端编程模式的细节。


GT3安装和编程

在这里我介绍GT3在Windows 2000 Professional上的安装和编程,目前只有GT3 Core能够在Windows平台上运行。本文使用GT3 Core。

GT3 Core的安装

要安装GT3和进行GT3编程,需要以下几个工具:

可选的工具有:

  • apache tomcat 4.1.24( http://jakarta.apache.org/tomcat);GT3本身提供了一个Web服务容器以供测试使用,但要正式使用时,一般选择Web服务容器如Tomcat或J2EE应用服务器如(IBM WebSphere,BEA WebLogic等)。
  • Junit3.8.1 ( http://www.junit.org)供测试使用。

下载和安装工具

1、安装JDK

  • http://java.sun.com/j2se网址上下载j2sdk_1.4.0_win.exe,它是一个自解压文件;双击运行并安装到E:\\dev\\j2sdk14目录下;
  • 设置环境变量JAVA_HOME=E:\\dev\\j2sdk14;
  • 把e:\\dev\\j2sdk14\\bin添加到PATH变量值中。

2.安装ant

  • http://ant.apache.org中下载apache-ant-1.5.2-bin.tar文件,并解压缩到D:\\grid\\ant目录下
  • 设置ANT_HOME=D:\\grid\\ant
  • 把D:\\grid\\ant\\bin添加到PATH中

3.从 http://www.junit.org中下载junit.jar 并拷贝到D:\\grid\\ant\\lib目录下,以供测试使用。

4.安装GT3 core

  • 从globus网站 http://www.globus.org上下载GT3 Core的源码版gt3_core_src.tar,并解压到D:\\grid\\ogsa目录;
  • 在控制台方式下进入D:\\grid\\ogsa\\impl\\java目录,输入ant dist 命令,将在D:\\grid\\ogsa\\impl\\java\\目录下生成build,etc,schema等子目录和client-config.wsdd和service-config.wsdd等文件,其中会在build目录下生成ogsa-3.0目录,这是一个GT3的可执行版发布版本,工程产生的所有的class文件放在build目录下的classes目录中,schema是GT3所提供的服务和自带例子的WSDL描述文件。这时已经生成了工程可执行环境;
  • 验证是否安装成功,在D:\\grid\\ogsa\\impl\\java目录下输入ant startContainer 命令,将启动GT3自带的容器,你会看到如下界面:


输入ant gui,会显示如下画面:



则表明GT3 core已经安装成功。


GT3程序设计

GT3 程序设计符合通常的分布式计算编程模型,即proxy-stub 模型。它包括服务端编程和客户端编程两个部分。服务端和客户端是弱耦合的。它们之间的联系是通过WSDL 服务描述文件来完成的。服务提供者在开发服务时,必须提供相应服务的WSDL 服务描述文件。在该文件中具体描述了服务的接口、服务的调用方法以及服务调用同底层通信协议的绑定情况。客户端用户得到WSDL 服务描述文件后,就可以根据该文件生成服务调用的stub,并通过该stub 来完成对服务的调用。同时,以WSDL 文档为中心,也为上层服务调用与底层通信协议的分离提供了可能。服务提供者可以提供多种服务调用与底层通信协议绑定的方法。客户端可以在这些方法中选定一种绑定来完成服务调用。这种绑定选择甚至可以延迟到服务调用时进行。

下面,将以开发一个简单的服务EchoString 为例来具体介绍GT3 服务程序设计。EchoString 的功能很简单,当客户端调用服务器端服务时,指定一个字符串。服务器端服务收到该字符串后,将把该字符串原封不动的发还给客户端。

服务端程序设计

服务端程序设计分为四个步骤:

  • 提供一个服务接口
  • 生成网格服务支持代码
  • 实现服务
  • 部署服务

下面结合我们的例子EchoString服务来具体的说明。

1.提供服务接口

有两种方式可以用来提供网格服务的接口。一种方法是用java语言编写一个接口,然后用工具生成WSDL poteType 接口描述文件,以供用户远端的客户调用,使用这种方法我们可以很容易、很方便的生成WSDL文件,但也有缺点如一些复杂的接口不是总能正确的转换为对应的WSDL文件;一种方法是自己编写WSDL portType 接口文件,这种方法的优点是我们可以完全的控制服务接口的描述,适合于编写较复杂的服务,缺点是直接书写WSDL对用户的要求要高,掌握起来难度要大。

在这里我使用第一种方法来提供服务接口。在D:盘根目录建立sample目录作为我们工作的总目录。

定义Java 接口文件 EchoString.java:

package org.nci.sample.impl;
public interface EchoString{
 public String echostring(String str);
}

在sample目录下建立src\\org\\nci\\sample\\impl目录,把文件拷贝到目录下。

这是用来生成WSDL poteType接口描述文件的java文件。这个接口只有一个方法echostring,用来返回用户输入字符串。

2.生成网格服务支持代码

这一步骤分为两步:生成WSDL文件,生成Stub。

1)生成WSDL文件:

在sample目录下建立build.propeties文件,并添加以下代码:

ogsa.root=d:/grid/ogsa/impl/java

用来指明我们安装的GT3的目录。稍后的build.xml文件中会使用到这个文件。

在sample目录下建立build.xml文件,并添加以下代码:

<target name="generateWSDL" unless="wsdl.present" depends="setenv">
    <ant antfile="${build.services}" target="generateWSDL">
      <property name="interface" value="org/nci/sample/impl/EchoString.java"/>
      <property name="generated.dir" value="${package.dir}"/>
    </ant>
  </target>

在smaple目标下运行ant generateWSDL,会在sample\\build\\schema\\sample目录下生成EchoStringService.wsdl文件。

在build.xml文件中,${build.service}属性指的是GT3目录下的build-service.xml文件。${generated.dri}和${package.dir}都是在build.xml设置的属性。可以参看build.xml得到更多的信息。

2)生成Stub

得到WSDL描述文件后,下一步的工作就是生成Stub用来从XML消息中序列/反序列化数据。

在build.xml中添加如下代码:

<target name="stubs" unless="stubs.present" depends="setenv, generateWSDL">
    <ant antfile="${build.services}" target="generateStubs">
      <property name="schema.file.dir" value="${package.dir}/EchoString"/>
      <property name="schema.file" value="EchoStringService.wsdl"/>
    </ant>
  </target>

运行ant stubs命名,将在sample\\build\\stub目录下生成JAR-RPC接口文件,可以用来服务端和客户端使用。

GT3提供了两种方法来生成网格服务:自底向上和自顶向下。如图所示:



自底向上这种方法在想把原有的系统变成网格服务的形式时使用。自顶向下在开始一个新的项目时,可以编写WSDL文件,想生成这个接口的java映射时使用。

3.实现服务

EchoStringImpl.java
Package org.nci.sample.impl;
Import org.globus.ogsa.impl.ogsi.GridServiceImpl;
Import org.nci.sample.service.EchoString.EchoStringPortType;
Import java.rmi.RemoteException;
Public class EchoStringImpl extends GridServiceImpl implements EchoStringPortType{
 Public EchoStringImpl(){
 }
 
 public String echostring(String str) throws remoteException{
                 return str;
 }
}

在这个java文件中,EchoStringImpl继承的是GridServiceImpl,GridServiceImpl取代了GT3 Alpha版中的Serviceskeleton类。同时它实现了EchoStringPortType接口中的echostring方法。EchoStringPortType就是上一步生成stub时生成的服务接口,这个接口是暴露给客户使用的。打开这个文件可以看到,它和EchoString.java文件是差不多,只是添加了一些代码使它成为一个远程接口,以供远程客户调用。

GT3还提供了一种实现服务的方法:operation provider(也称为委托或代理方法)。这种方法使得在部署服务时可以很容易的插入不同的操作实现。GT3中NotificationSource和Factory服务是用这种方式提供的,因此我们的服务需要Factory和NotificationSource时只需要更改以下服务的描述文件而已。

4.部署服务

到了这一步,我们已经生成了网格服务所需的所有的Java代码:1)我们有一个服务接口,2)有了WSDL服务描述文件,3)stub文件,4)服务的实现。这一步的工作是把所有的这些文件编译、归档,并部署到host环境中。

这一步分3各步骤:

  1. 建立一个服务部署描述文件
  2. 建立一个Gar文件
  3. 部署到主机环境中。

下面分别进行说明。

1)编写一个服务部署描述文件

部署文件告诉Web服务器应该怎样来发布网格服务。部署文件以WSDD的形式存在。

Echo-config.wsdd
<?xml version="1.0" encoding="UTF-8"?>
<deployment name="defaultServerConfig"
xmlns=http://xml.apache.org/axis/wsdd/ xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <service name="sample/EchoString/EchoStringFactoryService" provider="Handler" style="wrapped">
   <parameter name="name" value="EchoString Factory"/>
   <parameter name="instance-name" value="EchoString"/>
   <parameter name="instance-schemaPath" value="schema/sample/EchoString/EchoStringService.wsdl"/>
   <parameter name="instance-baseClassName" value="org.nci.sample.impl.EchoStringImpl"/>
   <parameter name="persistent" value="true"/>
   <parameter name="schemaPath" value="schema/ogsi/ogsi_notification_factory_service.wsdl"/>
   <parameter name="baseClassName" value="org.globus.ogsa.impl.ogsi.PersistentGridServiceImpl"/>
   <parameter name="handlerClass" value="org.globus.ogsa.handlers.RPCURIProvider"/>
   <parameter name="className" value="org.gridforum.ogsi.NotificationFactory"/>
   <parameter name="allowedMethods" value="*"/>
   <parameter name="factoryCallback" value="org.globus.ogsa.impl.ogsi.DynamicFactoryCallbackImpl"/>
   <parameter name="operationProviders" value="org.globus.ogsa.impl.ogsi.FactoryProvider
       org.globus.ogsa.impl.ogsi.NotificationSourceProvider"/>
 </service>
</deployment>

在这个文件中,我们需要主要以下几个部分:

2)建立Gar文件

第一步我们需要编译所有的文件,并打包:

在build.xml中添加如下代码:

<target name="compileStubs" depends="stubs">
    <javac srcdir="${build.stubs}" destdir="${build.dest}" debug="${debug}"
      deprecation="${deprecation}"
      classpathref="classpath">
    </javac>
  </target>
  <target name="compile" depends="compileStubs">
    <javac srcdir="${src.dir}" destdir="${build.dest}" debug="${debug}"
      deprecation="${deprecation}"
      classpathref="classpath">
    </javac>
  </target>
  <target name="stubjar" depends="compile">
    <jar jarfile="${build.lib}/${package.dir}-stub.jar" basedir="${build.dest}" >
      <include name="**/${package.dir}/**" />
      <exclude name="**/${package.dir}/impl/**" />
    </jar>
  </target>
  <target name="jar" depends="stubjar">
    <jar jarfile="${build.lib}/${package.dir}.jar" basedir="${build.dest}" >
      <include name="**/${package.dir}/impl/**" />
    </jar>
</target>

运行ant jar,系统会在sample\\build\\lib目录下生成sample-stub.jar,sample.jar.

在build.xml中添加

<target name="gar" depends="jar" unless="garBuild.notRequired">
     <copy todir="${build.lib}">
      <fileset dir="${lib.dir}">
        <include name="**/*.jar"/>
      </fileset>
    </copy>
    <ant antfile="${build.packages}" target="makeGar">
      <property name="gar.name" value="${build.lib}/${package.dir}.gar"/>
      <property name="garlib.dir" value="${build.lib}"/>
      <property name="garserverdeployment.file" value="${package.dir}-config.wsdd"/>
      <property name="garschema.origin" value="${build.schema}/${package.dir}"/>
      <property name="garschema.path" value="${package.dir}"/>
    </ant>
  </target>

运行ant gar,会在sample\\build\\lib目录下生成sample.gar。这个Gar文件中包括前一步生成的jar文件,WSDL文件,和部署文件。

3) 部署到主机环境

在build.xml中添加如下代码:

<target name="deploy" depends="gar" >
      <ant dir="${ogsa.root}" inheritAll="false" target="deploy">
      <property name="gar.name" value="d:/sample/build/lib/${package.dir}.gar"/>
    </ant>
</target>

其中gar.name属性值是你所生成的gar文件的位置。在这里我们的值是d:/sample/build/lib/sample.gar。

运行ant deploy。把服务部署到环境中。

至此,服务端开发和部署已经完成。

客户端程序设计

在客户端,首先要得到服务的WSDL描述文件,然后由该WSDL描述文件得到stub,由于在服务端程序设计中生成的stub也可供客户端使用,我们直接使用了服务端编程中生成的stub。客户端程序EchoStringClient.java如下:

EchoStringClient.java
Package org.nci.sample.impl;
import org.nci.sample.service.EchoStringServiceLocator;
import org.nci.sample.service.EchoStringPortType;
import java.net.URL;
import org.gridforum.ogsi.OGSIServiceGridLocator;
public class EchoStringClient{
 public static void main(String[] args) {
      
   try {
    URL GSH=new URL(args[0]);
    EchoStringServiceLocator Locator = new EchoStringServiceLocator();
    EchoStringPortType echo =
     Locator.getEchoStringService(GSH);
                System.out.println("inpute i am libin the output" +
                 "is "+ echo.echostring("i am libin"));      
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
}

编写网格服务客户端很容易,我们要得到EchoStringPortType的引用,一旦得到后,我们就可以和本地方法一样使用它。

程序运行

服务器端服务启动:

setenv
ant startContainer

客户端调用服务:

java org.globus.ogsa.client.CreateService 
http://localhost:8080/ogsa/services/sample/EchoString/EchoStringFactoryService instance
java org.nci.sample.impl.EchoStringClient 
http://localhost:8080/ogsa/services/sample/EchoString/EchoStringFactoryService/instance

第二种方法

GT3正式版还提供了另一种工具来简化GT3编程。使用这个工具,我们可以很方便以自底向上、自顶向下、多服务方式来建立网格服务。下面我们来介绍。

使用这种方法底步骤有四步(前提是我们已经编写了java接口或WSDL描述文件):

  1. 生成网格服务代码
  2. 向服务添加服务数据(可选)
  3. 生成GAR
  4. 部署服务

下面还是以echostring为例来说明使用这种工具的方法。

1.生成网格服务代码

使用这个工具可以有三种方法生成网格服务代码:

  • 自底向上:自底向上适用于把遗留系统变成网格服务。使用这种方法,必须把编译遗留系统底java文件并打包成jar文件,然后使用createBottomUpGridService工具会自动的生成stub,服务定位器(service locators)和服务部署描述
  • 自顶向下:自顶向下适用与新建的网格服务,它从GWSDL文件中生成绑定(binding)、stubs、服务定位器、服务部署描述、a operation provider和一个服务的实现类。当生成这些文件后,你可以在服务实现类中添加合适的逻辑代码。
  • 多服务方式。多服务方式允许用户从XML描述文件中创建多个网格服务,这个XML描述文件必须符合GT3自带的CreateGridService.xsd模式。

我们使用自底向上的方法。

1)建立D:\\sample目录,建立EchoString的接口文件EchoString.java和EchoString的实现文件EchoStringImpl.java文件,把它们放到org\\nci\\sample\\目录下;

EchoString.java
Package org.nci.sample;
Public interface EchoString{
 Public String echostring(String str);
}
EchoStringImpl.java
Package org.nci.sample;
Public class EchoStringImp implements EchoString{
 Public EchoStringImpl(){
}
 public String echostring(String str){
  return str;
}
 }

2) 编译文件:javac org\\nci\\sample\\*.java

3) 打包成jar文件:jar -cvf echostring.jar org\\nci\\sample\\*.class

4) 建立build.xml文件,添加如下代码:

   <target name="createBottomUpGridService"> 
        <ant antfile="${build.tools}" target="createBottomUpGridService"> 
          <property name="verbose" value="true"/> 
          <property name="outputDir" value="./bottomUpFiles"/> 
          <property name="bottomUp.sourceJar" value="echostring.jar"/> 
  <property name="bottomUp.classOfPortType" value="org.nci.sample.EchoStringImpl"/> 
        </ant> 
</target>

其中build.tools属性指的是OGSA目录下的build-tools.xml。

5) 运行ant createBottomUpGridService,会在sample目录下生成bottomUpFiles目录,里面有生成的类代码、schema目录、client-deploy.wsdd、server-deploy.wsdd等。

2.向服务中添加服务数据,这一步从略。

3.生成GAR

向build.xml文件中添加如下代码:

<target name="bottomUpGar">
        <ant antfile="${build.tools}" target="gar">
          <property name="outputDir" value="./bottomUpFiles"/>
          <property name="jar.name" value="echostring.jar"/>
          <property name="gar.name" value="echostring.gar"/>
        </ant>
</target>

运行ant bottomUpGar,会在bottomUpFiles目录中生成echostring.gar文件。这就是要部署的文件。

4.部署服务

向build.xml中添加下列代码:

 <target name="deploy">
        <ant dir="${ogsa.root}" inheritAll="false" target="deploy">
        <property name="gar.name" value="d:/sample/bottomUpFiles/echostring.gar"/>
      </ant>
  </target>

其中gar.name属性值指向你自己生成的gar文件的目录。

运行ant deploy。哈哈,一切大功告成!

客户端程序和原来的差不多,这里就不再详细说明了。


结束语

网格是分布式计算的发展方向,网格的最终目的是其成为一个公共设施以提供计算资源。OGSA的产生使得网格不仅仅局限于科学领域。作为OGSA的实现,GT3已经成为建立网格应用的首选。本文对网格技术和GT3编程做了一个简单的介绍,以期能起到抛砖引玉之功。

本人对网格技术和GT3接触的时间也不长,对GT3的机理了解的也不深刻,认识尚嫌肤浅,文中难免有疏漏之处,望读者不吝斧正。


参考资料

  1. http://www.globus.org,Globus项目官方网址。可以下载工具包和各种文档。
  2. GT3自带的编程手册和用户手册。
  3. http://www.ibm.com/developWorks/grid, IBM关于网格计算的网址。里面有大量的文档,材料和工具。个人认为很好的网址。
  4. Alfredo Cutierrez, e-business on demand: a developer roadmap. http://www.ibm.com/developerworks/grid/library/i-ebodov/index.html
  5. IBM的三本红皮书:
    Globus ToolKit 3 Early Experience
    http://publib-b.boulder.ibm.com/Redbooks.nsf/RedpieceAbstracts/redp3697.html
    Introduction to Grid Computing with Globus
    Enable Application for Grid Computing with Globus
    http://publib-b.boulder.ibm.com/Redbooks.nsf/RedpieceAbstracts/redp3697.html
  6. The Globus Toolkit 3 Programmer's Tutorial。 http://www.casa-sotomayor.net/gt3-tutorial-working/
  7. http://ant.apache.org,可以找到apache ant的资料。
  8. 下载样例代码( source.zip

关于作者

作者相片

李彬,男,华北计算技术研究所在读硕士研究生。研究方向是网格计算,信息可视化。对网格计算有很强的爱好,目前正从事一个网格项目的开发。你可以通过 bin_li@eyou.com和他联系。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and Web services
ArticleID=21992
ArticleTitle=用GT3开发网格服务
publish-date=09012003
author1-email=bin_li@eyou.com
author1-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。