IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Grid computing  >

商业服务网格,第 4 部分: 服务域部署

如何编写服务域应用程序并在 Web 应用程序服务器上部署

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Yih-Shin Tan (ystan@us.ibm.com), 高级技术人员
Brad Topol (btopol@us.ibm.com), 高级软件工程师
Vivekanand Vellanki (vellanki@us.ibm.com), 顾问软件工程师
Jie Xing (jiexing@us.ibm.com), 顾问软件工程师

2004 年 7 月 01 日

本系列文章的第 1 部分描述了服务域(Service Domain)如何通过共有的服务入口点表示一组可比较的或相关的 Web 服务。文章将自主计算的原则应用到 Web 服务和网格服务的聚集上。服务域技术提供了一个服务网格,可以自主地创建、过滤、发现、群集、组织、选择、路由、恢复和切换 Web 服务和网格服务。 第 2 部分通过一个商业服务网格的情景示例,概要介绍了服务网格的实现,并深入讨论了服务域的创建问题。 第 3 部分展示了如何针对服务域的多个方面配置策略文件,其中包括服务级别定义、服务选择、安全性、错误发现机制、事件监视和服务映射等等。现在在本文中,作者将展示如何将服务域部署到多个平台上,如 Web Services Toolkit 1.0 版、Web Services Bus 框架,以及 WebSphere Application Server 5.0 版。文中还描述了如何将服务域发布到公共注册中心中,如 UDDI 注册中心,或是某种与 OGSA 兼容的注册中心。

简介

前一篇文章 中,我们讨论了服务网格的概念及其创建与操作。现在,让我们来看一个编程方面的基本问题:编写一个服务域应用程序,并将其部署到 Web 应用程序服务器上。回顾以下两个基本的服务域对象, ServiceDeskServiceHub 。这两个对象本身就是由 WSDL 描述的 Web 服务,因此,可以使用标准的 Web 服务和 J2EE 编程模型。典型的应用程序很可能包含多个部分,如 Web 服务客户机、Web 服务部署描述文件(Web service Deployment Descriptors,WSDD)、对象类、Web 页面、JSP、servlet 以及配置文件。在本文的最后,这些部分都将一起打包到一个 war 或者 ear 文件中,其中还包括在服务器上部署时所需的一组 jar 文件。





回页首


样例程序

图 1 描绘了服务域样例应用程序的一种简单结构。应用程序建立了一个 ServiceDesk 对象和 StockQuoteServiceDesk.class 。还提供了测试用的客户机, TestClient.class ,这样就可以向 ServiceDesk 上发出 Web 服务调用请求。在浏览器中,测试用的 JSP( stockquotelog.jsp )可以显示该客户机的测试日志。属性文件 stockquoteservicedesk.properties 用于设置与 ServiceDesk 有关的特定信息。


图 1. 样例应用程序的简单结构
样例应用程序的简单结构

接下来,我们需要创建 WSDL、WSDD 以及 Web 应用程序的 war 或者 ear 文件,用于部署。您需要从编译时使用的 jar 文件清单中确定哪些文件将包含到 war 包中(请参阅 有关工具的考虑)。为了简化问题,我们的包中总是包含 servicedesk.jar 这个文件。因此,在部署完毕之后的运行期间,IT 人员就不需要担心 jar 文件是不是已经安装好,是不是在正确的目录层次下。通常有很多工具可以帮助我们根据生成的原始应用程序代码来准备部署包。我们将在下面几节中讨论三种给定环境中使用到的 WSDL、WSDD、以及 Web 应用程序的 warear 文件。下面先讨论一下用于生成这些文件的工具。





回页首


用 IBM alphaWorks Emerging Technology Toolkit 部署

IBM Emerging Technology Toolkit (ETTK) Version 1.0 是一个精简型的技术预览工具箱,它在一个软件包中提供了简洁有效的编码和测试支持,可用于展示一种新的概念。服务域应用程序的部署全部由 ETTK 的配置工具处理,可以将 ETTK 下的目录编译、拷贝和部署到 Web 应用程序服务器上。为了在这种环境中部署。我们首先为服务域创建 WSDD 和 Web 应用程序的 war 文件,然后用 ETTK 的配置工具,按照 ETTK 1.0 指南中描述的那样进行部署。

清单 1 中的 WSDL 文件样例描述的是 StockQuoteServiceDesk 的服务实现 WSDL。

清单 2 中的 WSDL 文件样例描述的是导入到实现 WSDL 中的 StockQuoteServiceDesk 服务接口 WSDL。

清单 3 中的 WSDL 文件样例将样例服务 StockQuoteServiceDesk 用服务名 servicedesk 部署。这项服务通过实现 WSDL(http://localhost/wstk/services/servicedesk)中定义的外部 URL 显示,其结果将生成从 SOAP 服务调用的 StockQuoteServiceDesk 对象。





回页首


用 Web Services Bus 技术部署

ETTK 中展示的 Web Services Bus 技术使用的是另一种不同的部署方案,它要求将服务域对象部署为总线服务。这样部署的目的是让内置的总线过滤器能够对进入的服务域请求先进行预处理,然后再传递到目标服务域上。比如说,我们在上一篇文章中提到过有关设置选择规则的限定条件。可以构造一个过滤器,用来在为会话分配的请求上下文中设置特定的限定条件值,如临界值等等。总线技术正在不断发展中,您可能听说过处理器(handler)、解释器(interceptor)以及中介(intermediary)之类的术语。它们的概念都是相同的。对于总线部署来说,服务域对象将要求用特定的配置机制来代替 WSDD 文件。 earwar 文件被 jar 文件代替,这个文件中包含该服务域对象的所有工件(artifact)。

为了在 Web Services Bus 环境中部署服务,可以为名为 ServiceHubForBusServiceHub 对象创建 wsbus.cfg 以及 Web 应用程序的 war 文件,然后用 ETTK 1.0 提供的 Web Services Bus 配置工具部署这些文件。 清单 4 中的 wsbus.cfg 文件实例描述了 Web Services Bus 部署的情况。





回页首


用 IBM WebSphere Application Server 5.0 部署

这个样例文件展示了从 ETTK 场景中升级的情况。部署过程中涉及的描述符、WSDL,以及 warear 文件与 ETTK 中的部署文件类似。尽管格式可能不同,却都能被工具解析。比如说,前面提到,ETTK 配置工具可以从工作目录下将应用程序部署到不同的 Web 应用程序服务器上,其中就包括 WSDK、Apache 以及 WebSphere。

大多数 WebSphere 开发人员都想直接部署自己的应用程序,而不想通过 ETTK 进行。最简单的方法是创建一个 ear 或者 war 文件,其中包含所有的工件和工具。将这个 ear 或者 war 文件放在 WebSphere Application Server 上,然后从 WebSphere Application Console 中部署即可,如下所示:

  • 单击 Enterprise Applications
  • 选择 Install Enterprise Application Wizard
  • 按照安装步骤进行。

从这个控制台中选择上面那个 ear 或者 war 文件作为安装文件。定义应用程序的名称,比如说 mySampleServiceDeskApp 。指定您的应用程序将部署在哪台应用程序服务器上。对服务器的命名是部署中最主要的一点。 图 2 部署样例程序的屏幕截图。


图 2. 服务域样例应用程序的 WAS 5.0 控制台屏幕截图
样例应用程序的简单结构




回页首


将服务域部署到公共注册中心

这些辛苦的工作全部完成之后,我们该如何让用户找到这些服务呢?显然,可以将服务发布到公共注册中心,即 UDDI 或 WSIL。

发布过程不是必需的,因为服务域是一种 WSDL 服务,具有众所周知的 URL 可供访问服务。如果您想将服务发布到公共注册中心,您可以使用 ETTK Configuration 工具将其发布到公共 UDDI 注册中心。如果您更喜欢 OGSA,那么也可以只在服务域中设置属性,然后自动发布到公共 OGSA 注册中心。

使用下面的样例代码段可以将服务域发布到公共 OGSA 注册中心中:

//Public OGSA Registry WSDL URL
String wsdlURL = "http://localhost/wstk/servicedomain/OGSARegistry_Impl.wsdl";
//OGSA Registry Service QName
QName serviceQN = new QName("http://OGSARegistry", "OGSARegistryService");
//OGSA Registry port QName
QName portQN = new QName("http://OGSARegistry, "ogsaregistry");
//Create Soap service object
Service service = new Service(new URL(wsdlURL), serviceQN);
//Create soap service call
Call call = (Call) service.createCall(portQN, "RegisterService");
//Serialize/Deserialize on the object of ServiceEntry
call.registerTypeMapping(
	ServiceEntry.class,
	NQqName,
	new BeanSerializerFactory(ServiceEntry.class, NQqName),
	new BeanDeserializerFactory(ServiceEntry.class, NQqName));
//url: 		servicedomain wsdl uri
//time: 	time at that the service should be removed or timeout
	
String result = (String) call.invoke(
				new Object[] { new ServiceEntry(url, time)});


使用下面的样例代码段可以将服务域发布到公共 UDDI 注册中心。

//UDDI inquiry URL.
String uddiInquiryURI = "http://localhost:80/uddisoap/inquiryapi";
//UDDI publish URL.
String uddiPublishURI = "http://localhost:80/uddisoap/publishapi";
//UDDI userid.
String uddiUser = "User";
//UDDI credential.
String uddiPwd = "Password";
//Transport handler class
transport = "org.uddi4j.transport.ApacheAxisTransport";
// providerName declaration
// providerDesc declaration
// serviceInterfaceWSDLURL declaration
// servcieImplWSDLURL declaration

try{	
   //Create a service Registry information 
   ServiceRegistryInfo sri = new ServiceRegistryInfo(uddiInquiryURI, 
					 	      uddiPublishURI,
					 	      uddiUser,
					 	      uddiPwd,
   						      transport);
	//Create an UDDIWSDLProxy instance 
	UDDIWSDLProxy srp = new UDDIWSDLProxy(sri);
}catch(Exception e){
    //need to handle it properly
}

//Create business entity and publish it to UDDI
ServiceProvider sp = new ServiceProvider(providerName, providerDesc,null);
srp.publish(sp);

//Create a service interface definition and publish it to UDDI
ServiceInterface si = new ServiceInterface(serviceInterfaceWSDLURL);
srp.publish(si);

//Create a service implementation definition and publish it to UDDI
ServiceDefinition sd = new ServiceDefinition(serviceImplWSDLURL);
srp.publish(sp, sd);

服务域可以表示大量聚集到不同 portTypes 上的服务。在实际使用中,可以提供一个小的前端应用程序,用于检索在某个特定服务层次上可用的端口号,这种方法十分有用。ETTK 1.0 提供的随需应变的服务网格( On Demand Service Grid )解决方案演示程序使用了这种技术(请参阅 参考资料)。一旦用户登录成功,就返回可用服务列表,并在浏览器页面中显示出来,供以后调用。





回页首


有关工具的考虑

上面我们讨论了在部署服务域应用程序的过程中涉及到的工件。讨论目的在于引导大家深入探讨幕后的技巧。幸运的是,解决方案开发人员大多数情况下无需处理这些原始材料。只要有适当的工具支持就足够了。接下来,作为本文的总结,我们将介绍用 WebSphere 工具环境开发服务域应用程序的实例。

您可以用下面几种方法获得 WebSphere 开发工具:

  • WSAD 或 WSADIE:从 IBM WebSphere Studio 专区下载 WebSphere Studio Development Application Developer Integration Edition 试用版: http://www.software.ibm.com/wsdd/zones/studio/
  • Eclipse:从 eclipse 项目的下载站点下载 Eclipse 工作台: http://www.eclipse.org/downloads/index.php.
  • RYO: 尽管我们不推荐这样做,不过如果您喜欢通过命令行手工构建程序,就需要 JDK 1.3 或以上版本、一个编辑器,并且在手边放置一本 Java 命令手册。

下面是用 WSADIE 部署我们的服务域实例程序 mySampleServiceDeskApp 的步骤:

1. 创建一个 Web 项目,名为 mySampleServiceDeskApp

单击 File> New> Project。选择 Web然后选择 Web Project。单击 Next >。输入 mySampleServiceDeskApp 作为项目名称。选择 Use default, J2EE Web Project,并选择 Create a default CSS file(都是缺省设置)。单击 Next>。在 Enterprise 应用程序项目中选择 New 。输入 mySampleServiceDeskEAR 作为项目名称。其余选项保持缺省值。单击 Finish,创建 Web 项目。

2. 将应用程序的源代码导入 Web 项目。

右键单击 mySampleServiceDeskAppJava Source文件夹。单击 import。选择 File system。单击 Next >。浏览文件系统目录。选择导入 StockQuoteServiceDesk.java, TestClient.java, 以及 stockquoteservicedesk.properties。选择 Created selected folders only。单击 Finish 将 Java 文件导入。

展开 mySampleServiceDeskApp 的 Web Content 文件夹。右键单击 WEB-INF文件夹。单击 import。选择 File system。单击 Next>。浏览文件系统目录。选择 stockquotelog.jsp以及其他待导入的 Web 页面工件。选择 Created selected folders only。单击 Finish 导入 JSP 页面和 Web 页面文件。

3. 编译 Web 项目。

右键单击 mySampleServiceDeskApp 。单击 Properties。单击 Java Build Path> Libraries> Add External Jars。选择 File system。单击 Next >。浏览文件系统目录,将 servicedesk.jar 加入。如果您使用的是从 ETTK 下载的服务域代码,那么这个文件就在 wstk install root\servicedesk\lib 目录下。根据导入到应用程序的包的情况,判断是否需要其他 jar 文件。下面列出可能需要的 jar 文件清单:

  • JAVA - rt.jar
  • UDDI - uddi4j.jar, uddi4j-wsdl.jar
  • WSIL - wsil4j.jar
  • WSDL - wsdl4j.jar
  • WSIF - comwsif.jar
  • XML - xmlParserAPIs.jar, xercesImpl.Jar, xml-apis.jar
  • WSTK - wstk.jar
  • Axis - axis.jar, axis-ant.jar, saaj.jar, commons-logging.jar, commons-discovery.jar, jaxpc.jar
  • OGSA - activation.jar
  • XPath - xalan.jar
  • ServiceDesk - servicedesk.jar
  • Others - 其他 wstk 组件需要的类库,如 wsbus.jar。

对于我们的样例项目来说,除了 WSADIE 创建 Web 项目时加入的缺省 jar 文件之外,还要加入 axis.jar、jaxrpc.jarwstk.jar

单击 OK 开始编译。

4. 从服务域对象创建一项 Web 服务。

右键单击 Java Source 文件夹下的 StockQuoteServiceDesk.java 。单击 Web Services > Deploy as Web Service。选择 Use Defaults。请注意, mySampleServiceDeskApp 是 Web 项目的名称。单击 Next >。检查一下 StockQuoteServiceDesk 是否显示为 bean 名称。单击 Next>。配置面板上显示的所有值均保持缺省。单击 Next>。选择下面的方法部署(其实是公开) Web 服务:

服务域对象的基本操作,都具有字符串签名:

  • Register
  • UnRegister
  • setPolicy
  • getServiceInfo
  • setServiceInfo
  • Login
  • Logout
  • InvokeOperation

StockQuoteServiceDesk 对象进行与应用程序有关的操作,所有的操作都具有字符串签名:

  • getQuoteSingle
  • getQuoteMultiple
  • getQuoteDescriptive

单击 Finish 完成 Web 服务的创建工作。

5. 插入 server-config.wsdd 文件(请参阅 用 IBM WebSphere Application Server 5.0 部署

右键单击 mySampleServiceDeskApp 的 Web Content 文件夹下的 WEB-INF文件夹。单击 import。选择 File system。单击 Next>。浏览文件系统目录。选择导入 server-config.wsdd 。选择 Created selected folders only。单击 Finish,导入该 WSDD 文件。如果不存在可导入的 WSDD 文件,单击 New> Other> Simple> File> Next,在WEB-INF 文件夹下面创建一个文件,并将 WSDD 样例代码段输入进去。(请参阅 用 IBM alphaWorks ETTK1.0 部署)。

6. 为 WebSphere 创建部署包(请参阅 用 IBM WebSphere Application Server 5.0 部署)。

右键单击 mySampleServiceDeskApp 。单击 export> EAR file> Next。选择 mySampleServiceDeskEAR 作为导出资源。浏览文件系统目录,选择一个用于导出的目录。导出选项保持缺省值。单击 Finish,导出为 ear 文件。

7. 将样例应用程序部署到 WebSphere 中(请参阅 用 IBM WebSphere Application Server 5.0 部署)。

mySampleServiceDeskEAR.ear 文件放置在 WebSphere Application Server 上,并从 WebSphere Application Console 中将其部署。单击 Enterprise Applications,选择 Install Enterprise Application Wizard,然后按照安装步骤操作即可。





回页首


结束语

本文中我们演示了如何将服务域部署到多种平台上,如 Emerging Technology Toolkit Version 1.0,Web Services Bus 框架,以及 WebSphere Application Server Version 5.0。我们也描述了如何将服务域部署到公共注册中心中,如 UDDI 注册中心或者兼容 OGSA 的注册中心。

请注意,整个过程遵循标准的 WebSphere 和 J2EE 开发部署模型。服务域并没有引入任何私有的东西。它们只是 Web 服务而已。

在下面一篇文章中,我们将详细讨论服务域处理的下一个问题——服务注册。

一旦服务域部署成功,它的端口就开放了,服务提供端可以注册服务,请求端也可以订阅使用。这就是将服务域处理注册的步骤。它建立起应用程序的功能,创建了为消费者提供服务和订阅的机制,设置好自主操作的基础,并激活预先定义好的策略。本系列的下一篇文章中将介绍更多有关服务域注册和操作的内容。



参考资料



作者简介

作者

Yih-Shin Tan 是 IBM Software Group 的高级技术人员。他的专业领域包括基于 Web 的系统软件体系结构、分析、设计和开发,并且他已经成为新兴技术的前沿开拓者。目前,他是 WebSphere 平台系统系列高级设计和开发(WebSphere Platform System House Advanced Design and Development)组织的 Web 服务和网格计算集成技术的首席架构设计师。他曾经协助开发了作为 IBM alphaWorks 上的技术概念演示的服务域工具箱。可通过 ystan-at-us.ibm.com 与 Yih-Shin 联系。


author

Brad Topol 是 IBM 位于美国北卡罗来纳州 Research Triangle Park 的高级软件工程师,他在 WebSphere 平台系统系列高级技术(WebSphere Platform System House Advanced Technology)团队任职。他于 1998 年获得佐治亚州理工学院(Georgia Institute of Technology)的计算机科学博士学位。目前,他正积极地参与 Web 服务、网格计算、OGSA 和自主计算等领域的高级技术项目。可通过 btopol-at-us.ibm.com与 Brad 联系。


author

Vivekanand Vellanki 参与了 Web 服务、网格计算和自主计算领域的高级技术项目。他于 2001 年获得佐治亚州理工学院的计算机科学博士学位。他的兴趣在于分布式计算、Web 服务器和对等计算。可通过 vellanki-at-us.ibm.com与 Vivek 联系。


author

Jie Xing 是一位顾问软件工程师,他已经在 IBM 位于美国北卡罗来纳州 Research Triangle Park 工作了一年半。目前,他正参与 Web 服务、网格计算和自主计算领域的高级技术项目。他于 2000 年获得北卡罗来纳州立大学(North Carolina State University)计算机科学运筹学博士学位,他的研究兴趣涉及多代理系统、分布式系统和工作流。可通过 jiexing-at-us.ibm.com与 Jie 联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款