Web Services Resource Framework (WSRF)定义了建模和使用 Web 服务访问有状态资源所使用的开放框架。Storage Resource Broker(SRB)是一个数据网格管理系统,它可以支持分布于多个组织和异构存储系统之间的共享集合。这两种技术分别为计算和数据网格中间件定义了一个强大的框架。然而,在这两个软件之间存在一个门槛,阻碍了二者之间的集成。SRB 开发人员通过支持 Grid Security Infrastructure (GSI)作为一种身份验证机制迈出了降低这个门槛的第一步。在本文中,我们将通过给出一个 用于查询 SRB 目录和数据传输服务代码的 Web 服务(WS)来进一步抹平这个门槛,这样可以在这些软件组件之间实现更紧密的集成。本文还包括了这些服务的 Eclipse 实现。
要在 Globus 和 SRB 元数据目录(MCAT)之间进行集成,我们创建了一个 WS 服务对 SRB 执行查询。这跟 Globus 与其他数据传输协议(例如 GridFTP)进行集成的方式类似。例如,Globus 提供了 Reliable File Transfer(RFT)服务,这个服务只是一个执行 GridFTP 操作的 WS 服务而已。图 1 给出了 SRB 查询服务的基本架构的简单工作流。
图 1. SRB 查询服务架构
图 1 给出了 WS SRB 查询服务的架构。查询客户机提供了两个基本操作:创建和查询。创建操作的任务是为查询服务构建一个 End Point Reference(EPR)。然后,查询操作会使用这个 EPR 来访问 SRB 服务器的 MCAT。查询输出是 SRB 服务器所返回的结果集的一个 XML 表示。在服务器端,WS-Query 服务使用 SRB Java API(Jargon —— 请参看参考资料一节)来查询 SRB MCAT,返回一个结果集对象。然后,这个对象会转换成 XML,后者被返回给客户机。这个 WS 服务的基本框架是由几个文件组成的。
任何 WS 服务都是由一组大小和功能不同的特定文件组成的,这取决于服务的复杂性。
表 1. 服务组件
| 文件 | 说明 |
|---|---|
| Service Description Language (WSDL) query_service.wsdl | WS 服务中最重要的文件之一。这个文件定义了 Web 服务所执行的操作。在 Globus 中,WSDL 文件通常在主服务文件中都有一个相关的绑定文件。WSDL 文件必须由诸如 WSDL2Java 之类的工具转换成一组服务存根。 |
| Ant 编译任务 (build.xml) | 自动完成很多开发任务,包括:
|
| 部署描述符 | 为服务容器提供有关服务本身的信息,例如实现服务操作、请求调度程序、服务范围等操作的类。 |
| 安全配置 | 为给定操作设置消息级安全验证。 |
| Java Naming and Directory Interface (JNDI)配置 | 指定服务获取资源必须使用哪个主接口。 |
| 服务实现类 | 实现服务操作的类,包括主接口、服务和持久资源类。 |
| 服务客户机类 | 每个服务操作 —— 创建 和查询 —— 使用的类。 |
这是 WS 服务中最重要的文件之一。WSDL2Java 工具使用这个文件从 WSDL 中构建存根、程序框架和数据类型。WSDL2Java 会生成客户机所必需的绑定,它遵守 JAX-RPC 规范。幸运的是,这是由服务一起提供的 Ant 编译文件自动执行的。存根通常都会在 WSDL 的目标名称空间所定义的位置创建,此时会将名称空间映射到 Java 包。
表 2. WS-Service WSDL 文件
| WSDL 子句 | 所生成的 Java 类 |
|---|---|
| 对于类型段中的每项 | 一个 Java 类
如果这个类型被用作一个输入/输出参数,就是一个 holder |
| 对于每个 portType | 一个 Java 接口 |
| 对于每个绑定 | 一个存根类 |
| 对于每个服务 | 一个服务接口
一个服务实现(也称为 locator) |
SRB 查询服务的 WSDL 如清单 1 所示。注意目标名称空间的名称(http://srb.com/service)。WSDL2Java 工具会使用这个名称来生成 Java 包 com.srb 中的存根。这个文件还包括了绑定文件 quey_bindings.wsdl,其中定义了服务操作。这个服务定义的基本服务操作有:
- createQuery — 创建对 SRB 服务器进行查询所使用的服务实例。它没有输入,返回一个调用查询操作所使用的 EPR。
- query — 对 SRB 服务器真正进行查询。其输入是一个查询字符串,返回查询结果的 XML 表示。
- SetTerminationTime — 设置资源生命周期值。
- Destroy — 销毁服务并释放资源。
- QueryResourceProperties — 允许客户机对资源属性文档进行查询。
- GetResourceProperty — 允许客户机检索特定服务属性的值。
清单 1. WS-SRB Query WSDL 文件
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="Query"
targetNamespace="http://srb.com/service"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:binding="http://srb.com/bindings"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:import namespace="http://srb.com/bindings"
location="query_bindings.wsdl"/>
<wsdl:service name="SRBQueryService">
<wsdl:port name="QueryPortTypePort"
binding="binding:QueryPortTypeSOAPBinding">
<soap:address location="http://localhost:8080/wsrf/services/"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
|
清单 2 给出了部署描述符的部分内容,它为容器提供了有关服务本身的信息。服务是在 <service> 元素中使用 SecureSRBQueryService 名称描述的。注意属性 use="literal" 和 style="document"。这些属性必须要用于所有的 WSRF/WSN 服务。服务参数都是在 <parameter> 元素中定义的。
表 3. 部署描述符参数
| 名称 | 说明 |
|---|---|
| allowedMethodsClass | 包含服务操作的类名。由 WSDL2Java 工具从 WSDL 中生成。 |
| handlerClass | 为某个服务方法指定请求调度器。默认的调度器是 Apache AXIS(org.globus.axis.providers.RPCProvider),它具有很多特性,例如操作提供者和安全支持。 |
| className | 实现服务方法的类。 |
| wsdlFile | 到 WSDL 文件的路径。这个路径可以是相对的,也可以是绝对的。推荐使用相对路径。 |
| Scope | 服务范围:Request(请求)、Application(应用程序) 或 Session(会话)。请求意味着可以为每个 SOAP 请求都创建一个新的服务对象。应用程序意味着会为所有对服务发起的 SOAP 请求都创建并使用一个服务对象实例。会话意味着会为每个访问服务并启用会话的客户机都创建一个新服务对象。 |
| Providers | 指定一个使用空格分隔开的操作提供者或类名列表。操作提供者用来对 Web 服务组件进行模块化。 |
清单 2. 部署描述符文件(deploy-server.wsdd)的部分内容
<service name="SecureSRBQueryService" provider="Handler"
use="literal" style="document">
<parameter name="allowedMethodsClass"
value="com.srb.QueryPortType"/>
<parameter name="handlerClass"
value="org.globus.axis.providers.RPCProvider"/>
<parameter name="className"
value="org.globus.wsrf.srb.query.QueryService"/>
<wsdlFile>share/schema/core/srb/query/query_service.wsdl</wsdlFile>
<parameter name="scope" value="Application"/>
<parameter name="providers" value="
DestroyProvider SetTerminationTimeProvider GetRPProvider
QueryRPProvider GetMRPProvider
SubscribeProvider GetCurrentMessageProvider"/>
<parameter name="securityDescriptor"
value="@config.dir@/security-config.xml"/>
</service>
|
安全配置用来为给定服务操作设置消息级的安全性验证。在消息级安全中,消息通过应用程序进行加密,而不是通过传输层安全协议(HTTPS)进行加密,后者在网络层进行加密。消息级安全性是基于 WS-Security、XML Encryption 和 XML Signature 标准的。验证方法可以是:
- None
- GSISecureConversation — 在客户机和服务之间首次建立一个安全上下文。这个上下文然后就可以用来对消息进行签名/验证/加密/解密。
- GSISecureMessage — 按照两个步骤使用 X509 证书对消息进行签名或加密:
- 使用一个对称密钥(使用 128 位密钥的 AES 生成)对消息主体进行加密。
- 使用接收方的公钥对这个对称密钥本身进行加密。
GSI Secure Conversation 比 GSI Secure Message 多需要 3 个步骤,这使得 GSI Secure Message 更适合于单个请求-响应交互。
清单 3. 服务安全配置文件(security-config.xml)给出了 SRB 查询服务操作(创建、销毁和查询)所使用的验证方法
<securityConfig xmlns="http://www.globus.org">
<method name="createQuery">
<auth-method>
<GSISecureConversation/>
</auth-method>
</method>
<method name="destroy">
<auth-method>
<GSISecureConversation/>
</auth-method>
</method>
<method name="query">
<auth-method>
<GSISecureConversation/>
</auth-method>
</method>
<auth-method>
<none/>
</auth-method>
<authz value="self"/>
</securityConfig>
|
Java Naming and Directory Interface (JNDI) 配置
Java Naming and Directory Interface 是查询对象所使用的一个应用程序编程接口(API)。通过调用这个 API,应用程序就可以确定由一个易读的 JNDI 名所确定的资源和其他程序对象的位置。资源的例子有数据库连接和定制应用程序对象。在 WSRF 中,JNDI 配置使用了 <resource> 元素来指定服务必须要使用哪个 home 接口来获取资源。资源名是 home,类型是实现它的类。参数是在 <parameter> 元素中指定的,方法如下:
表 4. JNDI 参数
| 名称 | 说明 |
|---|---|
| factory | 查找服务对象所使用的 JNDI 工厂类 |
| resourceClass | 这个服务可以使用的资源的类名 |
| resourceKeyName | 资源的唯一标识符 |
| resourceKeyType | 资源键值的 Java 类型 |
清单 4. JNDI 配置文件(deploy-jndi-config.xml)的部分内容
<service name="SecureSRBQueryService">
<resource
name="home"
type="org.globus.wsrf.srb.query.QueryHome">
<resourceParams>
<parameter>
<name>factory</name>
<value>org.globus.wsrf.jndi.BeanFactory</value>
</parameter>
<parameter>
<name>resourceClass</name>
<value>org.globus.wsrf.srb.query.PersistentQuery</value>
</parameter>
<parameter>
<name>resourceKeyName</name>
<value>{http://srb.com}QueryKey</value>
</parameter>
<parameter>
<name>resourceKeyType</name>
<value>java.lang.Integer</value>
</parameter>
</resourceParams>
</resource>
</service>
|
服务类通常会被划分为服务器端和客户端。一个基本的 WS 服务是由以下类组成的。
表 5. 服务实现类
| 名称 | 说明 |
|---|---|
| Home | home 类的工作是创建一个新服务实例。它会返回这个服务的一个唯一键值。 |
| Service |
这个服务类实现了服务操作。对于 SRB 查询服务来说,操作有:
|
| SRB Query | 包含 SRB 特定的逻辑。它会连接到 SRB 服务器上,执行查询,并将结果集转换成 XML。 |
您可能已经注意到 SRB 查询可以很容易地实现为一个传统的 Web 服务。实际上,它并不需要实现为一个 WSRF。同样,我们的目标是将 SRB 与 Globus Toolkit 集成在一起。
服务的编译和部署是由 Ant 任务(build.xml)自动进行的。要编译这个服务,请简单地运行:
$ cd eclipse//workspace/ws-srb $ ant |
要编译服务并将服务从项目源代码目录中部署到容器中,请执行:
$ export GLOBUS_LOCATION=[SET PATH HERE] $ cd eclipse//workspace/ws-srb $ ant deploy
要删除服务,请执行:
$ ant undeploy
注意 SRB 服务器只能在类 UNIX® 操作系统上运行。因此,建议将这个服务部署到一个 UNIX GT4 容器中。但是,也可以将服务部署到 win32 容器中并查询 UNIX SRB 服务器;但是尚未像这样测试过服务。
Ant 部署任务会创建客户机启动器。要测试这个服务,可以简单地重新启动容器,并运行下面的命令:
1) ws-srb-create -o srb.epr -s https://myhost134.67.66.53:8443/wsrf/services/SRBQueryService
其中 https://myhost:8443/wsrf/services/SRBQueryService 是服务工厂,它会创建一个用来查询 SRB 所使用的 WS 服务的 EPR。这个 EPR 看起来类似于:
清单 5. WS-SRB 查询 EPR
<ns1:QueryReference xsi:type="ns2:EndpointReferenceType" xmlns:ns1="http://srb.c
om" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://sche
mas.xmlsoap.org/ws/2004/03/addressing">
<ns2:Address xsi:type="ns2:AttributedURI">https://134.67.66.53:8443/wsrf/servic
es/SRBQueryService</ns2:Address>
<ns2:ReferenceProperties xsi:type="ns2:ReferencePropertiesType">
<ns1:QueryKey>21539046</ns1:QueryKey>
</ns2:ReferenceProperties>
<ns2:ReferenceParameters xsi:type="ns2:ReferenceParametersType"/>
</ns1:QueryReference>
|
2) ws-srb-query -e srb.epr "user name = vsilva, size > 10"
使用从步骤 1 中获得的 EPR,上面的查询会检索出属于用户 vsilva 并且大小大于 10 个字节的文件。
3) ws-srb-query -e srb.epr "Project Name = Foo, user like silva"
这个查询会对属主中包含字符串 silva 的 Foo 项目查找用户定义的元数据文件。
输出结果是作为 XML 的形式返回的。所有数据都是封装在 <MetaDataRecordList> 元素中的,它包含了一个或多个 <Record> 元素,其中的域分别是使用名称、说明和值来描述的。
清单 6. 查询输出 XML
<MetaDataRecordList len="9">
<Record rank="0" fields="7">
<Field type="3">
<Name>file name</Name>
<Desc>data name</Desc>
<Value>foo.txt</Value>
</Field>
<Field type="3">
<Name>user group name</Name>
<Desc>name of user group</Desc>
<Value>vsilva</Value>
</Field>
<Field type="3">
<Name>user name</Name>
<Desc>user name</Desc>
<Value>vsilva</Value>
</Field>
<Field type="3">
<Name>user domain</Name>
<Desc>user domain name</Desc>
<Value>NCC</Value>
</Field>
<Field type="0">
<Name>size</Name>
<Desc>size of data</Desc>
<Value>10</Value>
</Field>
<Field type="3">
<Name>file comments</Name>
<Desc>comments on data</Desc>
<Value></Value>
</Field>
<Field type="3">
<Name>owner domain</Name>
<Desc>domain of data creator</Desc>
<Value>NCC</Value>
</Field>
</Record>
...
</MetaDataRecordList>
|
正如上面介绍的一样,SRB 开发人员已经通过支持 GSI 作为一种验证机制迈出了集成的第一步。另外,紧密集成可以通过向 Globus 数据传输服务添加对 SRB URL 的支持来实现。这个目标非常容易实现;只需向 org.globus.io Java 包 —— 这是 Globus Toolkit 的数据传输服务的基础 —— 中添加对 SRB URL 的支持即可。
因此,SRB 可以认为是具有两种风格:标准的和启用 GSI 的。启用 GSI 的必须要使用 GSI 库进行编译。因此,为了区分这两种风格,我们使用了两种不同的 URL 模式:
- 对于标准的 SRB(无 GSI)来说,模式是
srb://[userName.domainHome[:password]@]host[:port][/path] - 对于启用 GSI 的版本来说,模式是
gsisrb://host[:port][/path]
例如,srb://vsilva.dev:secret@myhost.com:5544//home/vsilva.dev/myfile 会引用主机 myhost.com 的端口 5544 上 dev 域中用户 vsilva 的 /home/vsilva.dev 目录中的 myfile 文件。对于启用 GSI 的 SRB 来说,相同的 URL 是 gsisrb://myhost.com:5544//home/vsilva.dev/myfile。注意用户名、域和密码都不需要了。这是因为使用了代理证书作为验证手段的缘故。
这些新 URL 模式的实现非常简单,只需要对 Globus Java Client(CoG)库的两个文件稍加修改,另外加上两个新类即可。修改内容在表 1 中进行了详细介绍。
表 6. URL 模式
| 包 | 类名 | 说明 |
|---|---|---|
| org.globus.cog | GlobusUrlCopy | GlobusUrlCopy 是用来在多个协议之间进行数据传输所使用的命令行工具。对这个文件来说,唯一需要的改变是修改帮助文本,使其包括新 URL 模式:srb:// and gsisrb://. |
| org.globus.cog | UrlCopy | UrlCopy 是执行这些工作的位置。这里有两个方法 —— getInputStream 和 getOutputStream —— 需要进行修改,以包括对新 SRB 输入流的支持。 |
| org.globus.io.streams | SRBInputStream (new) | 这个新类继承了 GlobusInputStream,用来为读操作从 SRB 文件中提供输入流。 |
| org.globus.io.streams | SRBOutputStream (new) | 这个新类继承了 GlobusOutputStream,用来为写操作提供输出流到 SRB 文件中。 |
清单 7. 修改 UrlCopy 命令行工具来添加对 SRB URL 的支持
/* Vanilla SRB */
else if (fromP.equalsIgnoreCase("srb")) {
in = new SRBInputStream(new SRBFile(new URI(srcUrl.getURL())) );
}
/* gsi enabled SRB */
else if (fromP.equalsIgnoreCase("gsisrb")) {
CoGProperties cogProps = CoGProperties.getDefault();
//uses the ~/.srb/MdasEnv user info file
SRBAccount srbAccount = new SRBAccount( );
//set the password option to GSI_AUTH
srbAccount.setOptions( SRBAccount.GSI_AUTH );
//give the file path of your proxy file instead of the a password
srbAccount.setPassword( cogProps.getProxyFile() );
//If the CA locations are not defined in your cog.properties file:
srbAccount.setCertificateAuthority(cogProps.getCaCertLocations());
SRBFileSystem srbFileSystem = new SRBFileSystem( srbAccount );
SRBFile srbFile = new SRBFile( srbFileSystem, srcUrl.getPath() );
in = new SRBInputStream(srbFile) ;
} else {
...
|
清单 7 给出了需要对 UrlCopy 命令行工具进行的修改,从而增加对 SRB URL 的支持。对于普通的 SRB 来说,修改非常简单。对于 GSI SRB 来说,也只需为 SRB 帐户对象设置一些 GSI 特有的选项即可。Globus IO 流的包 org.globus.io.streams 使添加对新 URL 机制的支持变得非常容易。幸运的是,SRB 已经可以支持所有网络和 IO 操作的流。
SRB 环境是在用户主目录的 .MdasEnv 文件中定义的。对于启用 GSI 的 SRB 来说,清单 8 给出了用户环境,包括集合(主目录)名、域、用户名、服务器主机、端口、默认资源、验证机制(GSI)和服务器证书名(SERVER_DN)。
清单 8. 启用 GSI 的 SRB 的环境
$ more $HOME/srb/.MdasEnv
mdasCollectionName '/nccZone/home/globus.NCC'
mdasCollectionHome '/nccZone/home/globus.NCC'
mdasDomainName 'NCC'
mdasDomainHome 'NCC'
srbUser 'globus'
srbHost 'ebony.rtpnc.epa.gov'
srbPort '5544'
defaultResource 'nccResc'
AUTH_SCHEME 'GSI_AUTH'
SERVER_DN '/O=Grid/OU=GlobusTest/OU=simpleCA-host.domain/CN=host/ebony'
|
可以使用修改过的 globus-url-copy 命令(使用源代码发布)进行测试:
- 要将 /tmp/gtk24.zip 文件从 GSIFTP 服务器传输到 vsilva 用户下面的普通 SRB 上,可以使用密码验证机制:
globus-url-copy gsiftp://host1:2811//tmp/gtk24.zip srb://vsilva.dev:secret@host2:5544//home/vsilva.dev/gtk24.zip
- 要将 /tmp/gtk24.zip 文件从 GSIFTP 服务器传输到 vsilva 用户下面启用 GSI 的 SRB 上,可以使用:
globus-url-copy gsiftp://host1:2811//tmp/gtk24.zip gsisrb://host2:5544//home/vsilva.dev/gtk24.zip
- 要在普通 SRB 和启用 GSI 的 SRB 之间传输两个文件(使用调试模式),可以使用:
globus-url-copy -debug srb://vsilva.dev:secret@host1:5544//home/vsilva.dev/gtk24.zip gsisrb://host2:5544//home/vsilva.dev/gtk24.zip
了解 WSRF 的目的是为了实现聪明的服务(可以记住数据的服务)这一事实之后,您可能会问这样的问题:为什么要将 SRB 查询作为 WSRF 来实现呢?毕竟,没有必要去记住查询。答案是 SRB 查询也可以作为一个传统的服务实现。然而,本文的目的是帮助消除 SRB 和 Globus 之间的门槛,以及数据和计算网格之间的门槛。
| 描述 | 名字 | 大小 | 下载方法 |
|---|---|---|---|
| 样例代码 | gr-srbwsrf.zip | 1.1MB | HTTP |
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文。
-
Globus Message Level Security 可以在 Globus.org 上找到。
-
浏览 developerWorks 上的 网格计算文档库。
-
developerWorks podcasts 包含了为软件开发人员准备的很多有趣访谈和讨论。
-
随时关注 developerWorks 技术事件和网络广播。
-
查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、展览、网络广播和其他 活动。
-
请访问 developerWorks Open source 专区,这里有丰富的 how-to 信息、工具和项目更新信息,可以帮助您使用开源技术进行开发,并与 IBM 产品结合使用。
获得产品和技术
-
获得 SDSC Storage Resource Broker (SRB)。
-
获得 Java API for Real Grids On Networks (JARGON)。
-
请下载 IBM 产品评估版,开始使用来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件进行开发。
-
使用 IBM 试用版软件 改进您的下一个开源开发项目,这些软件可以从 developerWorks 下载或从 DVD 中获得。
讨论
-
请查看 developerWorks 上的 网格计算论坛。
-
通过参与 developerWorks blogs 加入 developerWorks 社区。
Vladimir Silva 出生在厄瓜多尔的基多,在这里他获得了 Polytechnic Institute of the Army 的工程师学位。然后他又在 Middle Tennessee State University 获得了计算机科学的硕士学位。毕业后,他加入了 IBM Web-Ahead 技术智囊团,在这里他以一名软件工程师的身份参加了很多项目,例如 IBM 内部网格和 IBM Grid Toolbox。他还为 developerWorks 发表了很多与网格有关的技术文章,他在服务器端安全性方面的一些工作(数字证书)已经集成到了最新的 Globus Toolkit(GT4)版本中。他是 Grid Computing for Developers 一书的作者。他的其他兴趣包括神经网络和人工智能。他还拥有包括 OCP、MCSD 和 MCP 在内的众多 IT 证书。