面向服务的计算和web数据管理第3章-面向服务软件开发概要课件_第1页
面向服务的计算和web数据管理第3章-面向服务软件开发概要课件_第2页
面向服务的计算和web数据管理第3章-面向服务软件开发概要课件_第3页
面向服务的计算和web数据管理第3章-面向服务软件开发概要课件_第4页
面向服务的计算和web数据管理第3章-面向服务软件开发概要课件_第5页
已阅读5页,还剩451页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章面向服务软件开发概要3.1面向服务的软件开发环境综述3.2服务提供商:创建和托管服务3.3服务中介:服务的发布和发现3.4SOAP3.5WSDL:Web服务描述语言3.6服务请求者:用服务构建应用3.7基于Java的Web服务开发3.8讨论第3章面向服务软件开发概要3.1面向服务的软件开发环境1

到现在为止,我们有可能掌握了SOC的主要概念和技术,而没有实际开发SOC软件,如果我们去开发SOC软件,即使只是创建合成的服务和应用,也会发现实际开发和理论的巨大差别。面向服务软件开发概要

到现在为止,我们有可能掌2本章将重点介绍如何使用工具开发SOC软件,而不涉及底层语言、协议和标准,因此主要负责大型编程的软件工程师和项目经理能够理解本章。本章的目的是让读者通过有限的编码深刻理解相关的概念和技术。如果你是一位经验丰富的程序员,你可以在学习完本章之后,用相关的概念、技术和资源开发实际的应用。

本章把主要概念、技术和工具结合在一起,展示如何一步一步创建Web服务,发布服务并组合成SOC应用。本章的结构如下:3.1节概述了不同的SOC软件开发环境;本章将重点介绍如何使用工具开发SOC软件,而不涉及底层语言、33.2节研究如何使用C#和ASP.Net创建具有标准接口的与平台无关的Web服务,还讨论了不同的服务托管机制,以及如何使用Internet信息服务(IIS)托管服务;3.3节探讨了应用共有的UDDI、ebXML以及其他服务目录和注册中心发布和发现服务;3.4节讨论用我们自己的服务以及通过公有服务目录发现的服务构建虚拟应用和真实应用;最后,在3.5节,我们解释了如何使用Java和Eclipse开发环境创建Web服务。3.2节研究如何使用C#和ASP.Net创建具有标准接口的与4

许多面向服务的软件开发环境都可用于创建Web服务、服务目录以及使用现有服务构建应用。表3.1列出了一些这样的开发环境,其特点以及这些环境中使用的主要语言。表中前五个开发环境来自微软,其他的开发环境来自Java和BPEL社区,包括IBM、Oracle、SunMicrosystems。3.1面向服务的软件开发环境综述

许多面向服务的软件开发环境都可用于创建We5

表3.1面向服务的软件开发环境表3.1面向服务的软件开发环境6续表

续表

7

与平台无关的Web服务是SOC应用的基石,并得到大部分环境的支持。

如果应用仅限于一个平台,则与平台相关的服务就是更合理的选择,例如.Net或JEE。在这种情况下,没有不同接口之间的转换,与开发平台相关的服务更有效率。.Net的远程调用就是为了满足上述目标而设计的。JEE既可用于开发标准的Web服务,也可用于开发Java相关的组件,例如JavaBeans。与平台无关的Web服务是SOC应用的基石,并得到大部8

分布式事务确保了两个商业伙伴间的事务,比如从一个账户到另一个账户的转帐事务,或者能顺利完成,或者当事务失败时不做任何更改。在事务处理中,回滚通常用于从失效中恢复。

WS*规范包括许多可信性标准,例如WSSecurity和WSReliable消息。

这些环境支持的特征是不断演化的,新的特征不断地添加到环境中。因此,表3.1没有给出环境支持的所有特征。分布式事务确保了两个商业伙伴间的事务,比如从一个账户到另9

在.Net2008中,WCF(Windows通信基础)是微软的一个支持所有特征的包容环境。但是,如果主要关注与平台无关的Web服务和应用的开发,则使用ASP.Net更简单、更容易。在本章的剩余部分,我们将用ASP.Net开发与平台无关的Web服务(作为一个服务提供者),讨论支持服务发布和发现的服务中介,研究用与平台无关的Web服务构建基于ASP.Net的应用。最后简要讨论基于Java的Web服务开发环境。

基于BPEL的SOC软件开发和开发环境将在后面的章节研究。在.Net2008中,WCF(Windows通信基础)是10

Web服务是平台无关的。但是,执行实际计算(工作)的服务软件必须用特定的编程语言编写。换句话说,Web服务是一个接口,它把用标准服务描述语言(例如,WSDL)描述的服务调用(远程调用)转换为编写服务软件的编程语言的函数调用(例如,C#或Java),如图3.1所示。3.2服务提供商:创建和托管服务

Web服务是平台无关的。但是,执行实际计算(11

图3.1服务调用转换成函数调用图3.1服务调用转换成函数调用12

原则上,我们可以用标准的WSDL接口手工包装任何函数,这将在第5章中讨论。本章使用工具自动生成XML格式的WSDL接口文件。这类似于写一个网页。你可以直接使用HTML语言写网页,也可以使用Web自动生成工具。

我们首先用C#和.Net开发Web服务。所需的系统和工具包括:

(1)操作系统。可以使用下列操作系统之一:

①WindowsXP专业版;

②WindowsVista和7商业版;原则上,我们可以用标准的WSDL接口手工包装任何函数,这13③Windows服务器2003、2008或更高版本;

④如果使用基于英特尔处理器的Mac,可以创建一个Windows分区。

(2)IIS(Internet信息服务),这是WindowsXP的一个可选组件。如果你没有安装,则需要添加这个组件。在Vista和7中,IIS是自动安装的,但是,需要按以下步骤打开它:

①打开控制面板,选择“程序”;

②选择“程序和特征”;

③在左边的菜单中选择“打开或关闭Windows特征”;

④打开IIS。③Windows服务器2003、2008或更高版本;

14

一旦安装了IIS,你应该会看到一个名为inetpub的文件目录。在inetpub中有一个名为wwwroot的子目录,它是计算机上托管你创建的Web服务的小型服务器。也可以在wwwroot目录下创建一个虚拟目录,该虚拟目录和保存你的Web服务可执行代码的物理目录相连接。

(3)VisualStudio.Net专业版2005或2008,也可以使用.NetC#速成版,可以在微软的网站/vstudio/express/免费下载。请注意,如果使用XP,在安装.Net之前必须安装IIS。因为根据计算机是否正在运行IIS,.Net的配置将有所不同。一旦安装了IIS,你应该会看到一个名为inetpub的文153.2.1使用ASP.Net创建Web服务

ASP.Net是VisualStudio和.Net框架公共语言运行库(CLR)内置的编程模板,它用于在服务提供者的服务器站点创建单个的Web服务,也可以在客户端创建使用Web服务的Windows窗体应用和Web应用。ASP.Net的Web服务教程可以在网站http://www.asp.Net/下载。

类似于创建C++或C#编程项目(Chen,2006),可以按如下步骤创建一个C#和ASP.Net的Web服务模板:

(1)在VisualStudio.Net的“文件”菜单中选择“新建”—“网站...”,打开一个对话窗口。3.2.1使用ASP.Net创建Web服务

ASP.N16

(2)选择“ASP.NetWeb服务”作为模板。在对话窗口的下半部分,选择你要用来开发服务的语言。我们可以使用VisualBasic、VisualC#和VisualJ#(Java)。在本节我们将使用C#。在对话窗口的下半部分,你可以选择或输入一个文件系统目录(硬盘驱动器),用来存放开发的Web服务。例如,如果键入[C:\myService],开发的服务名为Service.asmx,则这个服务位于此目录下。VisualStudio附带了一个开发服务器,它允许你把服务放在任何地方并测试运行该服务。点击确定,一个新的Web服务项目以及相关的一些文件将被创建。(2)选择“ASP.NetWeb服务”作为模板。在对话窗17

(3)服务模板在Service.cs文件中给出,服务中HelloWorld()的[WebMethod]的示例代码如下所示。

usingSystem;

usingSystem.Linq;

usingSystem.Web;

usingSystem.Web.Services;

usingSystem.Web.Services.Protocols;

usingSystem.Xml.Linq;

[WebService(Namespace="/")](3)服务模板在Service.cs文件中给出,服务中H18

[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile11)]

//ToallowthisWebServicetobecalledfromscript,usingASP.NetAJAX,uncommentthefollowingline.

//[System.Web.Script.Services.ScriptService]

publicclassService:System.Web.Services.WebService

{

publicService(){

//Uncommentthefollowinglineifusingdesignedcomponents

[WebServiceBinding(ConformsT19//InitializeComponent();

}

[WebMethod]

publicstringHelloWorld(){

return"HelloWorld";

}

}//InitializeComponent();

20

选择.Net菜单命令“调试—不调试开始执行”,将产生一个显示服务的Web页,如图3.2所示。在地址部分,localhost:51783显示了开发服务器中服务所在的位置。选择.Net菜单命令“调试—不调试开始执行”,将产生一个21

图3.2显示服务的Web页图3.2显示服务的Web页22

你可以修改[WebMethod]实现自己的功能,或添加更多的Web方法实现更多的功能。一旦你在模板中添加了代码,就可以使用VisualStudio提供的工具编译/构建项目、调试代码、执行代码。最后一步将启动Web服务。

你仍然必须手工编写你的服务中的代码以执行服务所需的操作,例如执行排序、加密、方程求解等等。然而,ASP.Net提供了一个带有预定义名字空间和类的模板帮助用户编写Web服务中的操作。下面代码显示在模板中添加了两个Web方法(突出显示的代码)。你可以修改[WebMethod]实现自己的功能,或添加更23publicclassService:System.Web.Services.WebService

{

publicService(){

//Uncommentthefollowinglineifusingdesignedcomponents

//InitializeComponent();

}

[WebMethod]

publicstringHelloWorld(){

return"HelloWorld";

}publicclassService:System.Web.24[WebMethod]//Thisismynewfunctiontoreturnpivalue

publicdoublePiValue()

{

doublepi=System.Math.PI;//calllibfunctionPI

return(pi);

}

[WebMethod]//Thisismynewfunctiontoreturnabsolutevalue

publicintabs(intx)

{[WebMethod]//Thisismynewfunc25if(x>=0)return(x);

elsereturn(-x);

}

}

程序模板在开始列出了在Web服务中使用的名字空间。在这个例子中,不是所有列出的名字空间都是必要的。添加两个操作后,这个Web服务有三种Web方法;如果它部署到能使用Web的服务器上,每种方法都提供了一个Web操作。这三个Web服务在Service类定义:if(x>=0)return(x);

else26stringHelloWorld()服务简单地返回一个字符串“HelloWorld”。

doublePiValue()服务返回一个表示pi的double值,例如,3.14159265358979。在C#中,pi值由System.Math.PI的库函数计算。

intabs(intx)服务需要一个整数作为输入值,并返回一个整型值,即x的绝对值。如果x为非负整数,它返回x,否则,它返回-x。stringHelloWorld()服务简单地返回一个273.2.2使用WCF创建Web服务

WCF是在VisualStudio中新的服务的开发平台。它提出了一种新的接口中定义的端点,其中包括地址,绑定和契约。

地址(Addressing):定义服务的网络地址,例如,http://www.webservicex.Net/uszip.svc或http://localhost:49187/Service.svc。

绑定(Binding):定义连接客户端和服务端之间,或两个服务之间的端点之间的通道。3.2.2使用WCF创建Web服务

WCF是在Visu28

契约(Contract):有不同类型的契约,服务契约定义了一个接口。该接口将被实现为一个类。操作契约定义了一个接口或端点。该端点将被实现为类的一个方法。数据契约定义将传入和传出服务操作的数据类型,这是传入的参数和返回值的方法的签名。

为了让我们把重点放在创建服务和托管服务的过程中,我们在此使用一个简单的猜数服务为例子。该服务定义了两个操作:返回所给区间中的一个随机暗码值和返回验证用户猜测的结果值。客户端将创建一个服务的代理和使用代理访问服务的操作。下面是创建该服务和调用该服务的客户程序。契约(Contract):有不同类型的契约,服务契约定义29

第1步:新建一个WCFWeb站点项目

通过选择文件→新建Web站点→WCF服务,新建一个Web站点项目。为了更好地仿照这个例子,我们使用默认的存储位置,但是要改变WCFService存储路径末尾的文件夹名称。

项目的解决方案同时被创建。在项目下面,你将看到两个C#文件:IService.cs和Service.cs。打开这两个文件中的一个,你可以看到一个代码模板。第1步:新建一个WCFWeb站点项目

通过选择文件→30

第2步:添加System.ServiceModel名字空间

我们需要名字空间System.ServiceModel中的一组库函数。此名字空间在VisualStudio2008默认条件下不被自动加载。我们在这一步添加此名字空间。

在解决方案资源管理器中,右键单击项目文件夹下的引用文件夹并选择“添加引用”,在添加引用对话框中选择.Net标签,然后向下滚动直到看到System.ServiceModel。选中它,并点击确定。

如果使用VisualStudio2010,这一步可省去。第2步:添加System.ServiceModel名字空31

第3步:定义服务契约

打开IService.cs文件,用下面的代码替换模板中给定的代码。

[ServiceContract]

publicinterfaceIService{

[OperationContract]

intsecretNumber(intlower,intupper);

[OperationContract]

stringcheckNumber(intuserNum,intsecretNum);第3步:定义服务契约

打开IService.cs文件32//TODO:AddyourserviceoperationshereorinService.csfile

}

从代码中可以看到,我们定义了两个简单操作的接口:返回所给区间的暗码值和返回验证结果值。

第4步:服务契约的实现

现在,我们将实现上一步中定义的接口。打开Service.cs文件,用下面的代码替换模板中的代码。该程序使用随机数来产生暗码值。//TODO:Addyourserviceoperatio33publicclassService:IService{

publicintsecretNumber(intlower,intupper){

DateTimecurrentDate=DateTime.Now;

intseed=(int)currentDate.Ticks;

Randomrandom=newRandom(seed);

intsNumber=random.Next(lower,upper);

returnsNumber;

}

publicstringcheckNumber(intuserNum,intsecretNum){

if(userNum==secretNum)publicclassService:IService{

34return"correct,congratulation!";

else

if(userNum>secretNum)

return"toobig";

elsereturn"toosmall";

}

}return"correct,congratulati35

第5步:构建并在浏览器中查看编译后的服务

构建(build)之后,右键单击Service.svc文件并选择“在浏览器中查看”,将生成一个服务网页,如图3.3所示。注意,ASP.Net服务的扩展名为.asmx,而WCF服务的扩展名为.svc。与ASP.Net服务不同,这里不生成测试页。我们必须编写一个客户端应用程序来测试这个服务。该服务已经发布到以下地址:

/WSRepository/Services/NumberGuess/Service.svc第5步:构建并在浏览器中查看编译后的服务

构建(bu36图3.3生成的服务网页图3.3生成的服务网页37

点击本地服务链接http://localhost:55143/NumberGuess/Service.svc?wsdl,或发布的服务链/WSRepository/Services/NumberGuess/Service.svc?wsdl我们将看到此服务的WSDL文件。ASP.Net服务和WCF服务使用相同的WSDL服务接口标准。

但是WCF服务的WSDL文件比ASP.Net服务的WSDL文件包含的信息更多。正如前面章节中讨论的,在客户端应用程序使用ASP.Net服务,选择添加Web引用(AddWebReference)。如果使用WCF服务,选择添加服务引用(AddServiceReference)。点击本地服务链接http://localhost:55138我们将用下面的例子来讨论如何使用WCF服务。

第6步:用客户端应用程序测试WCF服务

这里,我们将用一个图形界面来实现一个猜数游戏的客户端Web应用程序。该程序将使用已经开发好的猜数字服务来完成其功能。Web应用程序的界面如下图所示。游戏用户可输入暗码值的区间。然后,输入和提交猜数。如图3.4所示。我们将用下面的例子来讨论如何使用WCF服务。

第6步:用39

图3.4猜数游戏的界面

图3.4猜数游戏的界面40

我们将使用Windows格式应用(WindowsFormsApplication)模板来实现这个界面。

我们可以在同一解决方案中加新项目:右键单击当前资源管理器中的解决方案,选择“添加”,然后选“新建项目”。如下图所示,在添加新项目对话框中,选择C#。选择我们将使用Web格式应用(WebForms)模板。生成的解决方案资源管理器中的Default.aspx文件将用来设计用户界面。Default.aspx.cs文件将包含执行用户界面功能的C#代码。如图3.5所示。我们将使用Windows格式应用(WindowsFor41

图3.5添加新项目的界面图3.5添加新项目的界面42另一种方法是,重新建立一个解决方案:通过选择文件→新建项目→ANP.NetWeb应用,如图3.6所示。另一种方法是,重新建立一个解决方案:通过选择文件→新建项目43

图3.6重新建立解决方案的界面

图3.6重新建立解决方案的界面44

项目建好后,我们需要添加把猜数服务添加进来。右键单击NumberGuessClient项目,选择“添加服务引用”,注意添加WCF服务使用“添加服务引用”,而添加ASP.Net服务则使用“添加Web引用”。从下图中我们可以发现WCF服务的地址是:/WSRepository/Services/NumberGuess/Service.svc。我们也可以用本地服务地址http://localhost:55143/NumberGuess/Service.svc。

图中显示了添加服务引用的对话框窗口和服务的操作。我们把服务的代理命名为ProxyToGuessService。项目建好后,我们需要添加把猜数服务添加进来。右键单击Nu453.2.3测试Web服务

一旦在C#程序模板中添加了所有服务方法,就可以在.Net菜单中选择build(编译),然后用开始(不调试)菜单执行程序。

当程序执行时,它会立即启动.Net开发服务器的Web服务。一个封装你的服务并用于测试的网页将被创建,如图3.7所示。3.2.3测试Web服务

一旦在C#程序模板中添加了所46

图3.7在.Net开发服务器中启动Web服务图3.7在.Net开发服务器中启动Web服务47

点击一个服务,服务后的函数将被远程调用。例如,如果点击abs,就要求在输入面板中输入一个值作为参数,如图3.8左部分所示。例如输入值-1802,输入之后点击右下方的“Invoke”,Web服务abs将被远程调用。返回值将显示在另外的一个网页上,如图3.8右部分所示,返回值1802被封装在XML文本中。

虽然Web服务的返回值是可读的,但它的目的是让其他应用程序读取,而这个应用程序以更人性化的界面显示不同的值。图3.7中的Web页是测试模式。一旦服务部署在服务器上,Web服务只能通过它们的编程接口访问。点击一个服务,服务后的函数将被远程调用。例如,如果点击a48图3.8从Web浏览器中输入参数值图3.8从Web浏览器中输入参数值493.2.4作为服务提供商托管Web服务

有三种不同的方式托管服务,并允许远程访问Windows环境下创建的服务:.Net开发服务器、Windows下的IIS和Web服务器。

1..Net开发服务器

.Net包括一个开发服务器,它允许在同一台计算机上测试并访问Web服务,而无需连接互联网或者安装IIS。事实上,上一节所讨论的例子就是运行在.Net开发服务器上的。如果把图3.2所示的Web地址(http://localhost:51783/myService/Service.asmx)3.2.4作为服务提供商托管Web服务

有三种不同的方50复制到运行在同一台计算机上的应用程序中,则可以在应用中访问服务。3.4节将讨论在应用程序中访问Web服务。复制到运行在同一台计算机上的应用程序中,则可以在应用中访问服51

2.Windows下的IIS

IIS可以将计算机上的任何一个文件夹(目录)作为服务器。除了文件夹“C:\inetpub\wwwroot\”外,可以在IIS中创建虚拟目录(别名)并将其链接到文件系统中的任何一个物理目录上。一旦服务在wwwroot目录下或在IIS虚拟目录下,就可以用你的计算机IP地址取代IIS服务器创建的Web地址的“localhost”部分,从而获得服务的完整的Web地址。例如,如果你的计算机的IP地址是“07”,则服务的完整的Web地址就是:07/myService/Service.asmx。2.Windows下的IIS

IIS可以将计算机上的52

3.Web服务器或Windows服务器

如果正在服务器(例如WindowsServer2008)上开发Web或Windows服务,当按照3.2.3节所述步骤测试服务时,图3.7所示的窗口中将会创建完整的Web地址。

在大多数Web服务器上,IIS是一个服务运行环境。它可以安装在Windows操作系统中,使得部分文件系统成为服务器。IIS一直在运行,监听请求并处理请求排队。当远程客户激活服务器上的服务时,IIS把远程客户端的请求重定向到它托管下的正确服务上。IIS管理服务之间的共享资源。IIS使用安全套接字(SSL)验证远程调用者并保障服务器上数据的安全。3.Web服务器或Windows服务器

如果正在服务53

如果使用WindowsXP,IIS是可选的,需要插入XP光盘,并选择添加可选组件添加IIS。如果使用更高版本的Windows(Vista和7),IIS已安装,但还是需要按照以下步骤打开它:打开“控制面板”,选择“程序”,然后选择“程序和特征”,在窗口左侧的任务列表中点击“打开或关闭Windows特征”,然后就可以使用Web管理工具了。

当安装或打开IIS之后,会看到目录C:\inetpub\wwwroot\。要测试IIS是否正常工作,可以复制文件夹“myService”到C:\inetpub\wwwroot\],然后复制http://localhost/myService/Service.asmx到Web浏览器访问服务。注意.Net开发服务器的地址和IIS之间的区别:IIS的地址不包含“localhost”后面的数字。如果使用WindowsXP,IIS是可选的,需要插入XP54

下一步,我们将研究如何创建一个虚拟目录,使选择的物理目录成为一个Web服务器。

为了更好地组织文件和程序,不能把所有的服务都部署到C:\inetpub\wwwroot\。相反,如果使用WindowsXP,则可以按照以下步骤创建IIS虚拟目录:

(1)定位/决定服务(由VisualStudio创建)放在什么地方。假设包含服务的物理目录是C:\myService。

(2)使用控制面板中的IIS配置管理器创建一个命名的虚拟目录(别名)。例如,使用下面的步骤将“myIisService”链接到“myService”:下一步,我们将研究如何创建一个虚拟目录,使选择的物理目录55①打开你计算机上的“控制面板”。

②打开“系统管理工具“。

③打开Internet信息服务。

④鼠标右键点击“缺省Web站点”,选择“新建”,然后选择“虚拟目录…”。

⑤输入虚拟目录的名称,将其命名为myIisServce。

⑥指定虚拟目录链接到的物理目录。你可以通过浏览选择目录C:\myService。

⑦在完成上述步骤后,会看到IIS的默认Web站点myIisService。右键单击myIisService,并选择“转换到应用”。此步骤将服务注册到IISWeb管理服务(WAS),它列出IIS服务目录下的服务。①打开你计算机上的“控制面板”。

②打开“系统管理工56⑧为Web站点客户选择权限,至少应设置读的权限。为了使网页中嵌入的脚本可运行,就要允许客户在你的站点运行脚本,稳定性问题将在以后的章节中讨论。

(3)现在,目录C:\myService中的所有信息在互联网上可见。如果你想改变虚拟目录的设置和属性,右击“myIisServce”然后选择“属性”。

请注意,如果计算机设置了防火墙,对于外部访问,管理员须打开防火墙的HTTP端口。⑧为Web站点客户选择权限,至少应设置读的权限。为了使网57

在创建一个虚拟目录和注册(转换为应用程序)之后,就可以通过地址:http://localhost/myIisServce/service.asmx访问服务。用计算机的IP地址取代“localhost”,这将允许其他计算机通过互联网访问服务。可以按照下列步骤在已有的虚拟目录中发布服务:

①在成功地构建一个Web服务项目后,不要选择执行项目,而是在.Net菜单命令中选择“发布Web站点”。

②然后,将打开一个对话窗,选择计算机上的一个虚拟目录托管服务,例如,可以选择你创建的目录:C:\inetpub\wwwroot\myIisServce。在创建一个虚拟目录和注册(转换为应用程序)之后,就可以通58③一旦Web站点发布,将打开一个地址为http://localhost/myIisServce/Service.asmx的网页。

④用本地主机的IP地址取代“localhost”,Web服务就有了URL,例如07/myIisServce/service.asmx将是该服务的URL。③一旦Web站点发布,将打开一个地址为http://lo59

上一节讨论了服务提供者角色,它负责创建和托管服务。本节讨论服务中介角色,它提供服务目录并存储服务。有三种服务中介:目录服务、仓库服务、特别服务列表,每种都包含服务中介所期望的部分功能,如图3.9所示。3.3服务中介:服务的发布和发现

上一节讨论了服务提供者角色,它负责创建和托60

图3.9三种不同的服务中介图3.9三种不同的服务中介61

UDDI和ebXML由OASIS(OrganizationfortheAdvancementofStructuredInformationStandards)定义,这是一个不以营利为目的,致力于电子商务标准的开发、融合、使用的国际协会。成员自己制定OASIS技术议程,以明确定义的轻量级的开放过程促进业界的共识和各方的统一。相比较于其他组织,该协会不仅制定了很多Web服务标准,而且在安全性标准、电子商务、公共部门的标准化工作以及特定应用市场方面也做了很多工作。它成立于1993年,OASIS拥有来自600多个组织的3500多名会员,以及100多个国家的个人会员。

UDDI和ebXML由OASIS(Organizatio623.3.1具有全部所需特征的服务中介

为了更好地支持SOA软件的开发,本节讨论服务中介应具备的特征。

服务注册:这是服务中介的基本功能,它允许服务提供者注册他们服务的类型、描述、联系信息、访问点(如URL),并允许服务请求者基于他们拥有的部分信息发现想要的服务。

服务存储:托管服务的执行。为了支持大批量访问,托管服务器必须具有超级计算能力和高速的互联网连接。3.3.1具有全部所需特征的服务中介

为了更好地支持S63

服务规范和需求:如果某个服务请求者不能发现服务,可以发布规范或需求,从而使服务提供者可以开发以满足规范或需求的服务。服务需求使用自然语言书写,而服务规范用规格语言或接口定义语言如WSDL编写。

应用模板:不仅是服务,由多个服务和图形用户界面(GUI)组成的应用也可以使用SOC范型。应用模板指定了应用的工作流、参与服务的描述、服务接受的标准以及应用集成标准。应用构建者采用应用模板开发应用。

GUI模板:GUI是一个软件产品成功的关键。GUI模板的发布可以帮助应用构建者通过使用现有的GUI设计创建用户友好的高效率的GUI。服务规范和需求:如果某个服务请求者不能发现服务,可以发布64

合作协议和模板:合作协议和模板定义了应该用什么语言定义合作以及服务之间如何通信。合作协议和模板的发布规范了服务提供者如何定义应用、GUI模板和服务接口。因为合作协议和模板提供了可重用的合作模式,这种模式可在应用和服务开发中采用,因而缩短了开发周期。

策略:基于策略的计算建议把数据和计算分离。用来反映策略变化的数据项存储在配置文件或策略数据库中。策略的修改可以在运行时完成,无需中断程序的执行。为了重用,可以发布策略。另一方面,为了满足对服务中介的动态需求,服务中介应该用基于策略的计算实现。合作协议和模板:合作协议和模板定义了应该用什么语言定义合65

数据库和本体论:服务中介是一个为它的客户提供各种不同服务的服务。为了存储和管理大量数据和服务,数据库的支持是必不可少的。然而,传统的数据库并不足以支持服务中介,因为服务中介不仅需要检索数据,还要发现服务和应用模板。自动发现服务和应用模板是服务中介的需求。具有语义属性和推理能力的本体可以扩展传统数据库的能力,更好地支持自动化的服务发现。数据库和本体论:服务中介是一个为它的客户提供各种不同服务66

集成测试和评估工具:测试和评估,包括测试用例生成、测试结果(给定输入的正确输出)、验证、确认、可靠性评估和安全性评估,都是软件开发中的关键而又困难的步骤。服务中介可以提供工具,在绑定服务到应用之前,帮助应用构建者测试服务。

服务质量:服务中介可以跟踪并保存服务的性能和可信性数据是一项期望的功能,这些数据包括响应时间、吞吐量、可靠性、外部安全性以及成本效益。集成测试和评估工具:测试和评估,包括测试用例生成、测试结67

理想情况下,用SOA实现服务中介,从而可以使服务中介动态扩展和重新组合。图3.10是一个通用的服务中介的例子,它不仅允许规范、策略、服务和数据的发布,也允许中介的模型和工具的发布,例如可靠性评估工具、测试用例生成工具、排名工具。这样,可以评估中介系统使用的工具,并且如果有更好的工具还可以淘汰已有工具。理想情况下,用SOA实现服务中介,从而可以使服务中介动态68

图3.10一个可扩展和再组合的服务中介图3.10一个可扩展和再组合的服务中介69基于服务中介的特征,一个典型的SOA软件开发过程如图3.11所示。服务提供者可以通过服务中介了解需要哪些应用、GUI和服务,并就此开发和发布应用模板、GUI和服务以满足需求。服务提供者可以使用服务中介的测试工具测试服务,选择在服务中介或自己的服务器上托管服务。服务请求者或应用构建者可以简单地发布他们的需求,查询服务中介找到某些模板作为开发他们的需求、应用模板和GUI的基础。一旦完成了应用和GUI模板,他们开始查询所需的服务,填充模板中所需的组件。基于服务中介的特征,一个典型的SOA软件开发过程如图3.170

图3.11围绕服务中介的软件开发过程图3.11围绕服务中介的软件开发过程71

应用构建者(服务请求者)通过服务中介发现感兴趣的服务。一旦发现服务的API(应用编程接口),他们远程调用这些服务。图3.12是一个典型的服务请求者搜索服务的过程。功能需求封装到SOAP包中,进一步封装到HTTP包,然后发送给服务中介。服务中介拆封HTTP和SOAP包以获取功能需求。通常情况下,它通过具有语义属性的本体把需求和满足需求的最适合的服务相匹配。服务中介把服务的API返回给服务请求者。应用构建者(服务请求者)通过服务中介发现感兴趣的服务。一72

图3.12服务请求者搜索服务的过程图3.12服务请求者搜索服务的过程733.3.2UDDI服务注册

统一描述、发现和集成协议(UDDI,TheUniversalDescription,Discovery,andIntegration)是OASIS提出的标准,用于表示、模型化、发布Web服务(http://www.)。UDDI最初由IBM、Ariba和Microsoft提出。现在,已有300家公司参与,包括HP、Intel、Novell和SAP公司。UDDI基于已有的标准,包括XML、SOAP和WSDL。UDDI的主要功能是服务注册,它的注册信息大致分为三部分:

①白页包括服务提供者的姓名、身份(例如,DUNS号)和联系信息。3.3.2UDDI服务注册

统一描述、发现和集成协议74②黄页包括企业类型、产品和服务类型、地理位置。

③绿页包括和服务相关的绑定信息、服务实现的技术参考模型、指向各种文件的指针以及基于URL的发现机制。程序可以搜索并解释这些信息。

在数据组织层,UDDI注册表的数据从概念上被划分为五个数据模型,也称为数据结构,每个表示了UDDI的一个实体。每个实体分配一个统一唯一标识符(UUID),通过以下标识符,在UDDI注册表中总能找到这些实体。②黄页包括企业类型、产品和服务类型、地理位置。

③绿75 businessEntity

businessService

bindingTemplate

tModel

publisherAssertion

前两个条目分别是指白页和黄页,而第3和第4个条目与绿页有关。然而,虽然电话号码簿和UDDI条目在概念层类似,但在技术层,它们有很大区别。

我们给出每个数据结构的成员以及它的XMLSchema定义。XMLSchema(XMLS)是用来定义其他语言的语法和数据结构的语言。虽然XMLS将在下一章正式讨论,这里给出的这些定义还是很容易理解的。 businessEntity

busines761.businessEntity

这个数据结构包含公司自身(服务提供者)的信息,包括下列信息项:

公司的统一唯一标识符(可以有多个)(UUID),当公司在UDDI注册时,分配这一标识。

公司Web地址。

联系信息。

产业类别。

提供的服务列表。1.businessEntity

这个数据结构包含公77businessEntity的XMLS定义如下:

<elementname="businessEntity"type="uddi:businessEntity"/>

<complexTypename="businessEntity">

<attributename="businessKey"type="uddi:businessKey"use="required"/>

<attributename="operator"type="string"use="optional"/>businessEntity的XMLS定义如下:

<e78<attributename="authorizedName"type="string"use="optional"/>

<sequence>

<elementref="uddi:discoveryURLs"minOccurs="0"/>

<elementref="uddi:name"maxOccurs="unbounded"/>

<elementref="uddi:description"minOccurs="0"maxOccurs="unbounded"/>

<elementref="uddi:contacts"minOccurs="0"/>

<elementref="uddi:businessServices"minOccurs="0"/><attributename="authorizedNa79<elementref="uddi:identifierBag"minOccurs="0"/>

<elementref="uddi:categoryBag"minOccurs="0"/>

</sequence>

</complexType>

在上面定义的基础上,给出一个数据项实例,定义如下:

<businessEntity

businessKey="uuid:B1D2A3B4-E445-4F32-75BA-67D123451C39"<elementref="uddi:identifi80operator="/~ychen10/teaching/cse445/"

authorizedName=―CourseInstructor">

<name>ASUCSE445-598</name>

<description>WeprovidesampleservicesforSOCeducation</description>

<contacts>

<contactuseType="generalinformation">

<description>Email</description>operator="http://www.public81<personName>CourseInstructor</personName>

<phone>(480)9652769</phone>

<email>cse445598instructor@</email>

</contact>

<contactuseType="assignmentsandprojects">

<description>Email</description>

<personName>TeachingAssistant</personName>

<email>cse445598TA@</email>

</contact>

</contacts><personName>CourseInstruc82<businessServices>

SOCEducation,SOCsoftwaredevelopment,andSOCresearch

</businessServices>

<identifierBag>

<keyedReferencetModelKey=―uddi:02016094-9c03-47e9-a52b-1dec2d0c1454"name="D-U-N-S"value="913360445"/>

</identifierBag>

<categoryBag><businessServices>

SOCEduc83<keyedReferencetModelKey="UUID:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2"name="NAICS"value=―246359"/>

</categoryBag>

</businessEntity><keyedReferencetModelKey="U842.businessService

businessService数据模型表示了服务提供者提供和发布的一个Web服务。统一唯一标识符(UUID)用于该项的businessKey和serviceKey属性。根据UUID,所有UDDI注册中心的每个业务实体和业务服务是唯一确定的,在信息首次进入时,这个UUID由注册中心分配。bindingTemplates有一个引用,它保存与指定的业务服务相关联的技术服务描述信息。这个数据结构的XMLS定义和例子如下:

<elementname="businessService"type="uddi:businessService"/>2.businessService

business85<complexTypename="businessService">

<attributename="serviceKey"type="uddi:serviceKey"use="required"/>

<attributename="businessKey"

type="uddi:businessKey"use="optional"/>

<sequence>

<elementref="uddi:name"minOccurs="0"maxOccurs="unbounded"/>

<elementref="uddi:description"minOccurs="0"maxOccurs="unbounded"/><complexTypename="businessServ86<elementref="uddi:bindingTemplates"minOccurs="0"/>

<elementref="uddi:categoryBag"minOccurs="0"/>

</sequence>

</complexType>

例子:

<businessServiceserviceKey="uuid:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2businessKey="uuid:01F83FCE-54AC-4C39-B274-C4A390B8EE8C"><elementref="uddi:bindin87<name>Array2String</name>

<description>

Convertanarrayoffloatsintoastring,andastringbackintoanarrayoffloats

</description>

<bindingTemplate>...</bindingTemplate>

<categoryBag>…</categoryBag>

</businessService><name>Array2String</name>

883.bindingTemplate

bindingTemplate是businessService数据结构表示的Web服务的技术描述。同一个Web服务有多个bindingTemplate。每个bindingTemplate表示了Web服务的实际实现。例如,可用不同的语言(Java和C#)实现相同的服务规范,从而更好地支持使用不同语言的应用。虽然Web服务应该是与语言无关的,但如果Web服务使用了特定语言的数据结构,应用程序的语言就无法理解应用中创建的代理。使用多个bindingTemplate的另一个动机是为了灵活性及可靠性,允许服务能够绑定到不同的协议或不同的URL地址。3.bindingTemplate

bindingT89例如,除了SOAP绑定,还可以使用MIME绑定(MIME:MultipurposeInternetMailExtension)。这个数据结构的XMLS定义和例子如下:

<elementname="bindingTemplate"type="uddi:bindingTemplate"/>

<complexTypename="bindingTemplate">

<attributename="serviceKey"type="uddi:serviceKey"use="optional"/>

<attributename="bindingKey"type="uddi:bindingKey"use="required"/>

<sequence>例如,除了SOAP绑定,还可以使用MIME绑定(MIME:M90<elementref="uddi:description"minOccurs="0"maxOccurs="unbounded"/>

<choice>

<elementref="uddi:accessPoint"/>

<elementref="uddi:hostingRedirector"/>

</choice>

<elementref="uddi:tModelInstanceDetails"/>

</sequence>

</complexType>

<elementref="uddi:descri91例子:

<bindingTemplateserviceKey="uuid:c1acf26d-9672-4404-9d70-39b756e62ab4bindingKey="uuid:67153d5b-3659-afb4-8510-adda2c034649">

<description>SOAPBinding</description>

<accessPointURLType="http">

07/Array2String/service.asmx

</accessPoint>

<tModelInstanceDetails>

<tModelInstanceInfotModelKey="uddi:02016094-9c03-47e9-a52b-1dec2d0c1454">例子:

<bindingTemplateservice92<instanceDetails>

<overviewDoc>

<description>

referencestheWSDLservicedefinition

</description>

<overviewURL>

07/Array2String/service.wsdl

</overviewURL>

</overviewDoc><instanceDetails>

<o93</instanceDetails>

</tModelInstanceInfo>

</tModelInstanceDetails>

</bindingTemplate></instanceDetails>

</tMo944.tModel

tModel是一种描述类型的技术方式,这里类型是指存储在UDDI注册中心的业务、服务、模板结构等的类型。任何抽象概念都可以在UDDI注册为tModel。在UDDI注册的每个业务根据预先定义的服务类型(tModels)列表划分它的服务。注册时,可以选择属于现有tModel的类型(因此,必须与现有的规范一致),或定义一个新的tModel。例如,如果定义了一个新的WSDL接口,在UDDI内就可以定义一个表示该接口的tModel。然后,Web服务通过把tModel和业务服务的一个bindingTemplate相关联,实现该接口规范。tModel的XMLS定义及例子如下:4.tModel

tModel是一种描述类型的技术方95

<elementname="tModel"type="uddi:tModel"/>

<complexTypename="tModel">

<attributename="tModelKey"type="uddi:tModelKey"use="required"/>

<attributename="operator"type="string"use="optional"/>

<attributename="authorizedName"type="string"use="optional"/>

<elementname="tModel"type="u96<sequence>

<elementref="uddi:name"/>

<elementref="uddi:description"minOccurs="0"maxOccurs="unbounded"/>

<elementref="uddi:overviewDoc"minOccurs="0"/>

<elementref="uddi:identifierBag"minOccurs="0"/>

<elementref="uddi:categoryBag"minOccurs="0"/>

</sequence>

</complexType><sequence>

<elementre97

例子:

<tModeltModelKey="uddi:02016094-9c03-47e9-a52b-1dec2d0c1454"

operator="/~ychen10/teaching/cse445"

authorizedName="CourseInstructor">

<name>Array2StringPortType</name>

<description>

例子:

<tModeltModelKey="uddi98Aninterfaceforgeneralfloatarraytostringconversion

</description>

<overviewDoc>

<overviewURL>

07/Array2String/service.d.wsdl

</overviewURL>

</overviewDoc>

</tModel>Aninterfaceforgeneralfloata995.publisherAssertion

对于大型公司和企业,单一的业务条目不足以表示这些公司的业务。UDDI允许发布多个业务条目,代表部门或子公司。数据模型publisherAssertion使它们的关系在UDDI注册中心可见。为了避免某一发布者错误地声明了与另一发布者的关系,只有两个发布者发布同样的信息时,他们的关系才发布。5.publisherAssertion

对于大型公100publisherAssertion结构包括三个元素:fromKey(thefirstbusinessKey),toKey(thesecondbusinessKey),keyedReference,它用tModel内唯一被tModelKey引用的一对术语(keyName,keyValue),指出了宣称的关系的类型。这个数据结构的XMLS定义如下:

<elementname="publisherAssertion"type="uddi:publisherAssertion"/>

<complexTypename="publisherAssertion">

<sequence>publisherAssertion结构包括三个元素:f101<elementref="uddi:fromKey"/>

<elementref="uddi:toKey"/>

<elementref="uddi:keyedReference"/>

</sequence>

</complexType>

服务提供者和应用构建者提供的UDDIAPIs可以创建和访问UDDI数据条目。下面的API操作支持这一目标。

InquiryOperations:<elementref="uddi:fromKey"/>

102Find

find_business

find_service

find_binding

find_tModel

Getdetails

get_businessDetail

get_serviceDetail

get_bindingDetail

get_tModelDetail

get_registeredInfoFind

find_business

fin103PublishingOperations:

Save

save_business

save_service

save_binding

save_tModel

Delete

delete_business

delete_service

delete_bindingPublishingOperations:

Save

104delete_tModel

get_registeredInfo

Securityoperations:

get_authToken

discard_authToken

以find_business作为例子,它搜索和给定标准匹配的业务。这个API的语法定义如下:

<find_businessgeneric="2.0"[maxRows="nn"]xmlns="urn:uddi-org:api_v2">delete_tModel

get_registe105

[<findQualifiers/>]

[<name/>[<name/>]...]

[<discoveryURLs/>]

[<identifierBag/>]

[<categoryBag/>]

[<tModelBag/>]

</find_business>

[<findQualifiers/>]

[<n106该API的参数解释如下:

·maxRows:可选参数,指定返回的最大行数。

·findQualifiers:可选参数,重载默认搜索功能。例如,查找与企业名称完全相符的方法exactNameMatch。

·name:业务的全部或部分名称。UDDI2.0最多可以指定五个业务名称。

·discoveryURLs:可选参数,按发现的URLs进行搜索。

·identifierBag:可选参数,按标识符搜索。

·categoryBag:可选参数,按类搜索。例如,可以按NAICS代码进行搜索。该API的参数解释如下:

·maxRows:可选参107·tModelBag:可选参数,按tModel记录搜索。

目前,大型计算机公司,例如IBM,Microsoft和SAP,都有公共的可访问的UDDI服务,并提供UDDI服务软件,允许用户实现自己的UDDI服务并供企业内部或外部使用。UDDI是Windowsserver2003的一个标准组件。它的标准安装会安装微软的企业UDDI组件,这个组件允许服务提供者注册,也允许提供者开发的服务注册(更多的信息可以查看网址:/)。IBM的WebSphereSOA开发环境可以安装UDDI组件,该组件提供注册服务。·tModelBag:可选参数,按tModel记录108图3.13显示了微软企业UDDI组件的体系结构。它为手动注册、自动注册和注册表搜索提供了人机接口和编程接口。图3.13显示了微软企业UDDI组件的体系结构。它为手动109

图3.13Microsoft的UDDI服务器的体系结构图3.13Microsoft的UDDI服务器的体系结构110UDDI请求管理器接收来自ASP.Net页面或Web服务接口的请求,并调用UDDI类库中合适的服务。

UDDI类库把不同类型的函数封装成标准的Web服务,包括MSDE和SQL数据库提供的服务。

作为普通用户,可以手工注册为服务提供者、然后注册服务并搜索服务。

作为编程用户,可以通过.Net编程环境下的C#访问企业UDDI服务。在C#程序开头,你可以导入内嵌的UDDI名字空间/库,它提供了访问UDDI服务必需的类和函数:UDDI请求管理器接收来自ASP.Net页面或Web服务111usingMicrosoft.Uddi;

usingMicrosoft.Uddi.Services;

usingMicrosoft.Uddi.TModels;

然后,你可以使用下面的类和类的成员函数访问服务:UddiConnectionconn=

newUddiConnection("http://localhost/uddi/inquire.asmx");//1stFindServicefs=newFindService(txtName.Text);//2nd

ServiceListservList=fs.Send(conn);//3rdusingMicrosoft.Uddi;

usingMic112foreach(ServiceInfoservInfoinservList.ServiceInfos){//4th

MessageBox.Show("Service:"+servInfo.Names[0].Text

+""+servInfo.ServiceKey);

}

第一条语句创建了一个UddiConnection实例,用企业UDDI服务地址作为构造函数的参数。此语句建立了与被访问的UDDI的连接。

第二条语句创建了类“FindService”的一个对象,以便找到所需的业务。通过文本文件“txtName.Text”,搜索键被传给对象。foreach(ServiceInfoservInfoins113第三条语句调用对象FindService的Send方法(成员函数),以前创建的UddiConnection对象作为参数传递。Send方法返回一个ServiceList类型的可用服务列表。

第四条语句是一个for循环,在循环中显示找到的每个服务的服务名称和标识。

UDDI实体的访问在概念和语法上类似于数据库操作。本书第7章将详细讨论程序和数据库之间的接口以及数据库访问和操作的接口。第三条语句调用对象FindService的Send方法(1143.3.3ebXML服务注册和存放

用于电子商务的可扩展标记语言(ebXML,ElectronicBusinessusingeXtensibleMarkupLanguage)是一种规格说明/标准的模块化套件,这种规格说明/标准使任何地方任何规模的企业都可以通过互联网开展业务。使用ebXML,各公司就有一个标准的方法来交换业务信息、开展贸易关系、用共同的术语进行数据通信、定义并注册业务过程(http:///)。从服务中介的角度来看,它定义了比UDDI更多的功能。最显著的区别在于,ebXML除

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论