SOA 架构及其实现

winder062

贡献于2012-12-28

字数:10172 关键词: WEB服务/RPC/SOA

SOA架构及其实现 一 SOA简介 SOA(Service-oriented architecture,面向服务架构)。1996年,Gartner最早提出SOA。2002年12月,Gartner提出SOA是"现代应用开发领域最重要的课题",还预计到2008年,SOA将成为占有绝对优势的软件工程实践方法,主流企业现在就应该在理解和应用SOA开发技能方面进行投资。 更好支持商业流程 SOA并不是一个新事物,IT组织已经成功建立并实施SOA应用软件很多年了,BEA、IBM、等厂商看到了它的价值,纷纷跟进。SOA的目标在于让IT变得更有弹性,以更快地响应业务单位的需求,实现实时企业(Real-Time Enterprise,这是Gartner为SOA描述的愿景目标)。而BEA的CIO Rhonda早在2001年6月就提出要将BEA的IT基础架构转变为SOA,并且从对整个企业架构的控制能力、提升开发效率、加快开发速度、降低在客户化和人员技能的投入等方面取得了不错的成绩。 SOA是在计算环境下设计、开发、应用、管理分散的逻辑(服务)单元的一种规范。这个定义决定了SOA的广泛性。SOA要求开发者从服务集成的角度来设计应用软件,即使这么做的利益不会马上显现。SOA要求开发者超越应用软件来思考,并考虑复用现有的服务,或者检查如何让服务被重复利用。SOA鼓励使用可替代的技术和方法(例如消息机制),通过把服务联系在一起而非编写新代码来构架应用。经过适当构架后,这种消息机制的应用允许公司仅通过调整原有服务模式而非被迫进行大规模新的应用代码的开发,使得在商业环境许可的时间内对变化的市场条件做出快速的响应。 SOA也不仅仅是一种开发的方法论--它还包含管理。例如,应用SOA后,管理者可以方便的管理这些搭建在服务平台上的企业应用,而不是管理单一的应用模块。其原理是,通过分析服务之间的相互调用,SOA使得公司管理人员方便的拿到什么时候、什么原因、哪些商业逻辑被执行的数据信息,这样就帮助了企业管理人员或应用架构师迭代地优化他们的企业业务流程、应用系统。 SOA的一个中心思想就是使得企业应用摆脱面向技术的解决方案的束缚,轻松应对企业商业服务变化、发展的需要。企业环境中单个应用程序是无法包容业务用户的(各种)需求的,即使是一个大型的ERP解决方案,仍然不能满足这个需求在不断膨胀、变化的缺口,对市场快速做出反应,商业用户只能通过不断开发新应用、扩展现有应用程序来艰难的支撑其现有的业务需求。通过将注意力放在服务上,应用程序能够集中起来提供更加丰富、目的性更强的商业流程。其结果就是,基于SOA的企业应用系统通常会更加真实地反映出与业务模型的结合。服务是从业务流程的角度来看待技术的--这是从上向下看的。这种角度同一般的从可用技术所驱动的商业视角是相反的。服务的优势很清楚:它们会同业务流程结合在一起,因此能够更加精确地表示业务模型、更好地支持业务流程。相反我们可以看到以应用程序为中心的企业应用模型迫使业务用户将其能力局限为应用程序的能力。 企业流程(enterprise process)是流经企业框架的空气,它赋予业务模型里的组件以生命,并更加清晰地定义了它们之间的关系。流程定义了同业务模型进行交互操作的专门方法。例如,会计可能是企业服务系统的一个组件--但是将发票寄给客户却是一个业务流程。服务被定义用来支持业务流程,因而贯穿整个流程始终的是:各种服务组件在流程和逻辑实现过程中的装配操作。理解业务流程是定制服务的关键所在。 有利于企业业务的集成 传统的应用集成方法(点对点集成、企业消息总线或中间件的集成(EAI)、基于业务流程的集成)都很复杂、昂贵,并且不灵活。这些集成方法难于快速适应基于企业现代业务变化不断产生的需求。基于面向服务架构 (SOA) 的应用开发和集成可以很好的解决其中的许多问题。 SOA 描述了一套完善的开发模式来帮助客户端应用连接到服务上。这些模式定制了系列机制用于描述服务、通知及发现服务、与服务进行通信。 不同于传统的应用集成方法,在 SOA 中,围绕服务的所有模式都是以基于标准的技术实现的。大部分的通信中间件系统,如 RPC、CORBA、DCOM、EJB 和 RMI,也同样如此。可是它们的实现都不是很完美的,在权衡交互性以及标准定制的可接受性方面总是存在问题。SOA 试图排除这些缺陷。因为几乎所有的通信中间件系统都有固定的处理模式,如RPC 的功能、CORBA 的对象等等。然而,服务既可以定义为功能,又可同时对外定义为对象、应用等等。这使得 SOA 可适应于任何现有系统,并使得系统在集成时不必刻意遵循任何特殊定制。 SOA 帮助企业信息系统迁移到"leave-and-layer"架构之上,这意味着在不用对现有的企业系统做修改的前提下,系统可对外提供 Web 服务接口,这是因为它们已经被可以提供 Web 服务接口的应用层做了一层封装,所以在不用修改现有系统架构的情况下,SOA 可以将系统和应用迅速转换为服务。SOA 不仅覆盖来自于打包应用、定制应用和遗留系统中的信息,而且还覆盖来自于如安全、内容管理、搜索等 IT 架构中的功能和数据。因为基于 SOA 的应用能很容易地从这些基础服务架构中添加功能,所以基于SOA的应用能更快地应对市场变化,为使企业业务部门设计开发出新的功能应用。 二 WS-BPEL BPEL V2.0 是一种功能强大的语言,可用于帮助开发由大量其他组件和 Web 服务组成的大型复杂应用程序。BPEL 允许您使用图形编辑器来描述长期运行的工作流程,从而在人类友好的图表上展现工作流程。本文将介绍如何使用 Eclipse BPEL 插件开发流程并与 Apache ODE 结合使用来执行流程。 WS-BPEL 是由 OASIS 开发的供应商中立的规范,它将把业务流程指定为 Web 服务之间的一套互动操作。OASIS 将把 WS-BPEL 定义为如下内容:“可以通过两种方法描述业务流程。可执行业务流程将为业务互动中的参与者的实际行为建模。抽象业务流程都是部分指定的流程,不适于执行。抽象流程可以隐藏一些必需的具体操作信息。抽象流程充当描述角色,具有多个可能的用例,包括可观测行为以及流程模板。WS-BPEL 的意图是为可执行流程和抽象流程的行为建模。   “WS-BPEL 为可执行业务流程和抽象业务流程的规范提供了一种语言。通过这样做,它将扩展 Web 服务互动模型并使它可以支持业务事务。WS-BPEL 将定义一个可互操作的综合模型,该模型应当有助于在企业内空间和 B2B 空间中扩展自动化流程整合。”   Apache Foundation 把它的 Web 服务业务流程执行语言(Web Services Business Process Execution Language,WS-BPEL)V2.0 实现称为 Orchestration Director Engine (ODE)。ODE 将执行 WS-BPEL 流程,这些流程能够与 Web 服务进行通信、发送和接收消息等。Eclipse BPEL 项目是一个相关的开源项目,该项目将为 WS-BPEL V2.0 流程的可视化开发提供一个 Eclipse 插件(如果您还不了解这项技术,请参阅 “WS-BPEL 是什么”)。   撰写本文时,ODE V1.1 和 Eclipse BPEL 项目里程碑 M3 是最新版本。本文将检验这些产品并介绍如何使用 Apache ODE 和 Eclipse BPEL 项目创建您自己的 BPEL 流程并将其集成到应用程序中。 如果您更为熟悉 BPMN,则可能需要查看由 Tyler Anderson 撰写并发表在 developerWorks 中的文章 “用 Eclipse 执行业务流程”,要处理业务流程,还需要查看使用 Eclipse STP BPMN Modeler 的教程。   软件安装   您的操作系统可以是近期版本的 Microsoft® Windows®、Linux® 或 Mac OS X。本文是使用 Linux 撰写的,因此您可能需要根据操作系统的风格调整文件位置。在为 Eclipse 安装 ODE 和 BPEL 之前,确保您的计算机已经安装了下列软件:   Java™ V5.0 或更高版本   Tomcat V5.5 或更高版本   安装了以下插件的 Eclipse V3.3.x:   EMF V2.3.x   GEF V3.3.x   DTP STK V1.5.x   WTP (Web Tools Platform) V2.0.x   请参考各个应用程序的安装指南进行安装。   Apache ODE 安装   下载 ODE。启动 Apache Tomcat Web 容器并使用 Tomcat Manager(应当会在您的计算机中的 http://localhost:8080/manager/html 找到)部署发行版归档中的 ode.war 模块。要检查是否成功,请访问 http://localhost:8080/ode/,该地址将显示您计算机的 ODE Web 服务的状态。   Eclipse 的 BPEL 支持   要安装 Eclipse BPEL 项目,请运行 Eclipse 应用程序,启动 Eclipse 更新管理器(通过单击菜单 Help > Software Update > Find & Install)并选择 New feature 来安装选项。单击 New Remote Site... 并把 URL http://download.eclipse.org/technology/bpel/update-site/ 添加到 New Update Site 对话框中,然后把站点命名为 BPEL。单击 Finish,选择最近的镜像,选择 BPEL Designer for Eclipse,同意许可证条款,单击 Select All 选项,然后单击 Next 和 Finish。Eclipse 将提醒所有潜在的复制冲突,然后警告 BPEL 正被取消签名。如果提供者是 Eclipse.org,单击 Install。安装完成时,Eclipse 将询问您是否重新启动计算机。 创建一个简单的 BPEL 流程   在此部分中,我们将创建一个简单的 BPEL 流程并尝试在 ODE 中运行它。此流程仅执行简单的字符串处理。记住,它只是一个简单示例,而且您可以使用 WS-BPEL V2.0 规范创建更加复杂的流程。   Eclipse BPEL 编辑器   要创建一个简单的 BPEL 流程,请运行 Eclipse 并单击 File > New > Other 菜单项,选择 BPEL 2.0 -> BPEL Project 选项并创建一个名为 HelloWorld 的新 BPEL 项目。创建了项目后,您就可以创建第一个 BPEL 流程了。再次单击 File > New > Other 菜单项并选择 BPEL 2.0 > New BPEL Process File 选项来启动 BPEL 流程创建向导。 图 1. 创建 BPEL 流程文件   让我们创建一个同样名为 HelloWorld 的同步流程。在向导的下一页中,您应当选择 BPEL 流程文件位置 —— 只需选择先前创建的项目并单击 Finish。系统将创建样例流程。 图 2. 创建一个同步流程   如示,新建流程有两个内部 BPEL 变量 —— input 和 output —— 以及带有一个接收元素和一个应答元素的序列。接收块负责接收输入的 BPEL 流程数据和变量输入的初始化。类似地,应答块旨在使用输出变量输出 BPEL 流程数据。 同样在创建 BPEL 流程期间,向导创建了一个 WSDL 文件。此文件将描述输入和输出数据类型以及表示 BPEL 流程的端口类型。输入和输出数据类型都只包含单个字符串字段。   我们已经准备好把一些数据处理添加到流程中。为此,请在 receiveInput 块和 replyOutput 块之间拖放一个 Assign 块。 图 3. 拖放 Assign 块   在放置了赋值块后,右键单击 Assign 块并选择 Show In Properties 上下文菜单项以显示 Properties 视图并选择 Details 选项卡。Assign 块应当会用一个初始的 XML 标记结构来初始化输出变量。它是大多数 BPEL 处理引擎必需的常用程序。单击 Detail 选项卡中的 New 按钮以开始创建第一个赋值程序。在 From 选择框中选择 Fixed Value 元素并在文本区域中输入下列行: >tns:HelloWorldResponse xmlns:tns="http://www.ibm.com/wd2/ode/HelloWorld">     >tns:result/>     >/tns:HelloWorldResponse>   接下来,在 To 选择框中选择 Variable 元素并在变量树中选择 output/payload 变量,如下所示: 图 4. 初始化输出变量   在初始化了输出变量后,我们可以创建一个新的赋值程序。对于样例流程,此程序将从输入变量中获取一个字符串值,把它与 “Hello” 问候语连接起来并把结果赋给输出变量字符串字段。为此,单击 New 按钮并在 From 选择框中选择 Expression 值。在下面显示的文本框中,输入以下表达式:concat("Hello ", $input.payload/tns:input)。在 To 部分中,选择 output/payload/tns:result 变量,如下所示: 图 5. 选择 output/payload/tns:result   查看原图(大图)   Assign 块已经就绪。正如您所见,Eclipse BPEL 插件将提供 XPath V1.0 突出显示功能和代码完成功能来简化 XPath 查询的创建操作。   WSDL 文件更改   BPEL 流程的 WSDL 文件应当描述 BPEL 流程中使用的类型以及端口类型、绑定和流程的服务。由向导自动创建的 WSDL 已经包含一个端口类型,而且为了使流程可以运行,我们需要为它创建绑定和服务。   在单独的编辑器中打开 WSDL 文件并查看端口类型图形化定义。 图 6. 查看端口类型图形化定义  要创建 Web 服务绑定,请右键单击 WSDL 编辑器中的任意空白区域并选择 Add Binding 选项。在 Properties 视图中,把新建绑定重命名为 HelloWorldBinding 并选择 HelloWorld 作为新绑定的端口类型。单击 Generate Binding Content 按钮将显示 Binding Wizard 对话框。 图 7. Binding Wizard 对话框   查看原图(大图)   在 Protocol 选择框中选择 SOAP 协议,在 SOAP Binding Options 部分中选中 document-literal 选项并单击 Finish。 图 8. 绑定选项   创建了绑定后,右键单击 WSDL 编辑器中的空白区域并选择 Add Service 菜单项来创建一个名为 HelloWorldService 的新绑定。然后把 HelloWorldPort 指定为绑定的端口名称并把 URL http://localhost:8080/ode/processes/HelloWorld 指定为绑定的地址。同时选择 HelloWorldBinding 作为新建服务的绑定。 图 9. HelloWorldBinding   WSDL 文件已经准备好被部署到 ODE 应用程序中。   部署描述符   在准备好部署流程之前需要做的最后一件事是创建 ODE 描述符。描述符必须名为 deploy.xml 且必须放在存储 BPEL 和 WSDL 文件的目录中。只需创建一个新的 deploy.xml 文本文件并把以下内容放置在该文件中。 清单 1. 创建 deploy.xml 文本文件 >?xml version="1.0" encoding="UTF-8"?>  >deploy xmlns="http://ode.fivesight.com/schemas/2006/06/27/dd"    xmlns:pns="http://www.ibm.com/wd2/ode/HelloWorld"    xmlns:wns="http://www.ibm.com/wd2/ode/HelloWorld">   >process name="pns:HelloWorld">    >active>true>/active>    >provide partnerLink="client">     >service name="wns:HelloWorldService" port="HelloWorldPort"/>    >/provide>   >/process>   >/deploy>   描述符将为可部署单元指定流程和服务列表。   使用 BPEL 流程   现在,当 HelloWorld BPEL 流程就绪时,我们可以把它部署到 ODE 应用程序中并测试该流程。   把 BPEL 流程部署到 ODE 中   ODE 支持热部署 BPEL 流程。要部署在先前部分中创建的流程,只需把包含流程的所有文件的文件夹复制到部署了 ODE 的 Apache Tomcat 的 webapps/ode/WEB-INF/processes 目录中。要监视部署流程,可以查看 Tomcat 根目录中的日志文件 logs/catalina.out,查找所有新输入。  测试已部署流程的一种简单方法是使用 Eclipse Web Services Explorer 工具。右键单击 HelloWorld WSDL 文件并选择 Web Services > Test with Web Services Explorer 弹出式菜单项。Eclipse 将启动 Web Services Explorer 测试工具。使用此工具,把一些文本输入到输入参数中并调用 Process 操作。如图 10 所示,Web 服务将向您刚输入的文本返回问候语。 图 10. 调用 WSDL 操作   查看原图(大图)   创建 BPEL 流程客户机   在拥有了执行 BPEL 流程的 Web 服务后,我们可以把此流程集成到客户机应用程序中。让我们使用 Eclipse WTP 插件来生成基于 Axis 的 Web 服务客户机。在生成客户机代码之前,需要把 Tomcat 服务器添加到 Eclipse 服务器的列表中。单击 File > New > Other 菜单项并从列表中选择 Server 选项。然后,执行向导步骤来为 Eclipse 工作空间创建新 Tomcat 服务器。   在创建了服务器后,右键单击 WSDL 文件并选择 Web Services > Generate Client 弹出式菜单项。此操作将启动 Web Service Client 向导,该向导将生成一个新项目,提供了处理 Web 服务所需的类。 图 11. 设置 Web 服务客户机  要使用生成的文件,请使用类似如下所示的代码: 清单 2. 创建 Web 服务客户机 HelloWorldServiceLocator locator = new HelloWorldServiceLocator();  HelloWorldRequest hwRequest = new HelloWorldRequest();  hwRequest.setInput("developerWorks!");      HelloWorldResponse hwResponse = locator.getHelloWorldPort().process(hwRequest);  String output = hwResponse.getResult();   在执行了代码后,输出变量应当包含 BPEL 流程工作的结果。   ODE 管理 API   ODE 通过 Web 服务提供对一些应用程序管理功能的访问。通过使用 ODE,您可以控制部署到 ODE 中的流程及其实例,这些实例目前是在服务器中执行的。所有操作都是在位于 Tomcat 应用程序的文件夹 webapps/ode/WEB-INF 中的 pmapi.wsdl 文件中描述的。不幸的是,pmapi.wsdl 将使用旧 RPC 文档样式,并且,很难通过 Eclipse Web Services Explorer 测试工具使用它。   访问管理 API 的最佳方式是使用 Axis2 库。特别是使用 ServiceClientUtil 类,该类是由 ode-axis2 库提供的。Axis2 将依赖于其他库,包括 Xerces、Stax 等。ode.war 归档中附带了大多数库,因此可以将其添加到项目依赖关系中。   以下代码将演示如何提取当前流程实例的信息。 清单 3. 提取当前流程实例的信息 ServiceClientUtil client = new ServiceClientUtil();  OMElement msg = client.   buildMessage("listAllInstances", new String[] {}, new String[] {});  OMElement result =   client.send(msg, "http://localhost:8080/ode/processes/InstanceManagement");     List>ProcessInfo> processes = new ArrayList>ProcessInfo>();  Iterator>OMElement> i = result.getChildElements();     while (i.hasNext()) {   OMElement omInstanceInfo = i.next();   OMElement omProcessName =    omInstanceInfo.getFirstChildWithName(     new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",     "process-name"));   OMElement omStatus =    omInstanceInfo.getFirstChildWithName(     new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",    "status"));   OMElement omStarted =    omInstanceInfo.getFirstChildWithName(     new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",    "dt-started"));   OMElement omLastActive =    omInstanceInfo.getFirstChildWithName(     new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",    "dt-last-active"));     ProcessInfo process = new ProcessInfo();   process.setProcessName(omProcessName.getText());   process.setStatus(omStatus.getText());   process.setStarted(omStarted.getText());   process.setLastActive(omLastActive.getText());   processes.add(process);   }   示例将使用 axiom 库来检索信息并把它存储为 ProcessInfo 对象列表。可以从应用程序的任何其他部分使用这些对象。   ODE 事件侦听程序   ODE 允许您为 ODE 应用程序内的任何操作(例如启动和停止流程实例)开发侦听程序。要创建您自己的事件侦听程序,需要实现 ode-bpel-api.jar 库中定义的 org.apache.ode.bpel.iapi.BpelEventListener 接口。以下代码将演示一个输出到标准输出流传入事件的简单实现和 startup() 及 shutdown() 侦听程序方法的调用。 清单 4. startup() 和 shutdown() 侦听程序方法 /**  * {@inheritDoc}  */  public void onEvent(BpelEvent event) {   System.out.println(event);  }    /**  * {@inheritDoc}  */  public void startup(Properties arg0) {   System.out.println(this.getClass() + " startup");  }    /**  * {@inheritDoc}  */  public void shutdown() {   System.out.println(this.getClass() + " shutdown");   }   当侦听程序类就绪后,需要把它放到 ODE 类路径中(您可以把带有侦听程序类的 JAR 文件放入 webapps/ode/WEB-INF/lib Tomcat 目录)。您还需要创建 webapps/ode/WEB-INF/conf/ode-axis2.properties 属性文件并将下列行添加到其中: ode-axis2.event.listeners=com.ibm.wd2.bpel.eventlistener.WD2EventListener   您的侦听程序类名称可以不同于上面的名称。   结束语   BPEL V2.0 是一种功能强大的语言,可用于帮助开发由大量其他组件和 Web 服务组成的复杂应用程序。BPEL 允许使用图形编辑器来描述长期运行的工作流程,从而在人类友好的图表上展现工作流程。您可以使用开源产品创建使用 Apache 和 Eclipse 社区的 BPEL V2.0 规范的应用程序 —— 可以结合使用两者,Eclipse BPEL 项目用于开发流程,Apache ODE 用于执行。如上所述,两个产品至少可以在简单的 BPEL V2.0 流程上成功运行。但是,在真实业务应用程序中使用这些开源工具之前,建议先在一个更复杂的应用程序上研究这些开源工具的优缺点。

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档