﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-疯狂的人-文章分类-soa</title><link>http://www.blogjava.net/jia8086/category/46623.html</link><description>细节决定一切</description><language>zh-cn</language><lastBuildDate>Sat, 16 Oct 2010 07:04:20 GMT</lastBuildDate><pubDate>Sat, 16 Oct 2010 07:04:20 GMT</pubDate><ttl>60</ttl><item><title>用J2EE设计面向服务结构框架</title><link>http://www.blogjava.net/jia8086/articles/335292.html</link><dc:creator>疯狂的人</dc:creator><author>疯狂的人</author><pubDate>Sat, 16 Oct 2010 04:44:00 GMT</pubDate><guid>http://www.blogjava.net/jia8086/articles/335292.html</guid><wfw:comment>http://www.blogjava.net/jia8086/comments/335292.html</wfw:comment><comments>http://www.blogjava.net/jia8086/articles/335292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jia8086/comments/commentRss/335292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jia8086/services/trackbacks/335292.html</trackback:ping><description><![CDATA[在本文中，您将学习如何利用 Java 2 Platform, Enterprise Edition (J2EE) 设计和开发 面向服务的体系结构（SOA）框架。通过采用 SOA 框架，企业可以最大程度地减少系统间的耦合，从而提高可重用性。本文从一个较高的层面概述了在 SOA 框架上进行的几次迭代过程，这个框架将满足一家虚构企业的需求。这里开发的示例框架可以很容易地进行修改以适合您的商业需求.<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>SOA 和 Web 服务：简介 <br />
</strong><br />
&nbsp;&nbsp;&nbsp; SOA 是一种分布式的<a style="color: #000000" title="软件" href="http://software.it168.com/" target="_blank">软件</a>模型。SOA 的主要组件包括 服务、动态发现和 消息。 <br />
<br />
&nbsp;&nbsp;&nbsp; 服务是能够通过<a style="color: #000000" title="网络" href="http://net.it168.com/" target="_blank">网络</a>访问的可调用例程。服务公开了一个接口契约，它定义了服务的行为以及接受和返回的消息。术语 服务常与术语 提供者互换使用，后者专门用于表示提供服务的实体。 <br />
<br />
&nbsp;&nbsp;&nbsp; 接口通常在公共注册中心或者目录中发布，并在那里按照所提供的不同服务进行分类，就像电话簿黄页中列出的企业和电话号码一样。客户（服务消费者）能够根据不同的分类特征通过动态查询服务来查找特定的服务。这个过程被称为服务的 动态发现。 <br />
<br />
&nbsp;&nbsp;&nbsp; 服务消费者或者客户通过 消息来消费服务。因为接口契约是独立于平台和语言的，消息通常用符合 XML 模式的 XML 文档来构造。<br />
<br />
&nbsp;&nbsp;&nbsp; 下面的 图 1说明了 SOA 中的不同角色。
<p><img border="0" alt="" src="http://tech.it168.com/sourcefiles/pic/2006-6-12/image/fig1(1).gif" width="354" height="153" /><br />
&nbsp;&nbsp;&nbsp; 图一</p>
<p>&nbsp;&nbsp;&nbsp;<strong> Web 服务作为 SOA </strong><br />
<br />
&nbsp;&nbsp;&nbsp; Web 服务建立在开放标准和独立于平台的协议的基础之上。Web 服务通过 HTTP 使用 SOAP（一种基于 XML 的协议），以便在服务提供者和消费者之间进行<a style="color: #000000" title="通信" href="http://tele.it168.com/" target="_blank">通信</a>。服务通过 WSDL（Web Service Definition Language）定义的接口来公开，WSDL 的语义用 XML 定义。UDDI 是一种语言无关的协议，用于和注册中心进行交互以及查找服务。所有这些特性都使得 Web 服务成为开发 SOA 应用程序的优秀选择。 <br />
<br />
&nbsp;&nbsp;<strong>&nbsp; 使用 J2EE 1.4 平台开发 SOA/Web 服务框架 </strong><br />
<br />
&nbsp;&nbsp;&nbsp; 1.4 版的 J2EE 平台通过新的 JAX-RPC 1.1 API 提供了完整的 Web 服务支持，这种 API 支持基于 servlet 和企业 bean 的服务端点。JAX-RPC 1.1 基于 WSDL 和 SOAP 协议提供了与 Web 服务的互操作性。J2EE 1.4 平台也支持 Web Services for J2EE 规范(JSR 921)，后者定义了 Web 服务的部署需求并利用了 JAX-RPC 编程模型。除了几种 Web 服务 API 之外，J2EE 1.4 平台还声称支持 WS-I Basic Profile 1.0。WS-I Basic Profile 标准让 Web 服务克服了不同编程语言、<a style="color: #000000" title="操作系统" href="http://product.it168.com/list/b/0501_1.shtml" target="_blank">操作系统</a>和供应商平台之间的障碍，从而使多种应用程序之间能够交互（关于 WS-I 的更多信息，请参阅 参考资料部分。）这意味着除了平台独立性和完整的 Web 服务支持之外，J2EE 1.4 还提供了跨平台的 Web 服务互操作性。 <br />
<br />
&nbsp;&nbsp;&nbsp; 在 J2EE 1.4 下，Web 服务客户可以通过两种方式访问 J2EE 应用程序。客户可以访问用 JAX-RPC API 创建的 Web 服务；在幕后 JAX-RPC 使用 servlet 来实现 Web 服务。Web 服务客户也可以通过 bean 的服务端点接口访问无状态会话 bean。Web 服务客户不能访问其他类型的企业 beans。第二种选择——公开无状态 EJB 组件作为 Web 服务——有很多优势： <br />
<br />
&nbsp;&nbsp;&nbsp; 利用现有的业务逻辑和流程：在许多企业中，现有的业务逻辑可能已经使用 EJB 组件编写，通过 Web 服务公开它可能是实现从外界访问这些服务的最佳选择。EJB 端点是一种很好的选择，因为它使业务逻辑和端点位于同一层上。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;并发支持：作为无状态会话 bean 实现的 EJB 服务端点不必担心多线程访问，因为 EJB 容器必须串行化对无状态会话 bean 任何特定实例的请求。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 对服务的<a style="color: #000000" title="安全" href="http://safe.it168.com/" target="_blank">安全</a>访问：企业 beans 允许在部署描述符中声明不同方法级别的安全特性。方法级别角色被映射到实际的主体域（principal domain）。使用 EJB 组件作为 Web 服务端点，把这种方法级别的安全性也带给了 Web 服务客户。 <br />
<br />
&nbsp;&nbsp;&nbsp; 事务问题：EJB 服务端点在部署描述符规定的事务上下文中运行。容器处理事务，因此 bean 开发人员不需要编写事务处理代码。 <br />
<br />
&nbsp;&nbsp;&nbsp; 可伸缩性：几乎所有 EJB 容器都提供了对无状态会话 bean 群集的支持。因此当负载增加时，可以向群集中增加机器，Web 服务请求可以定向到这些不同的<a style="color: #000000" title="服务器" href="http://server.it168.com/" target="_blank">服务器</a>。通过把 Web 服务模型化为 EJB 端点，可以使服务具有可伸缩性，并增强了可靠性。 <br />
<br />
&nbsp;&nbsp;&nbsp; 池与资源管理：EJB 容器提供了无状态会话 bean 池。这改进了资源利用和<a style="color: #000000" title="内存" href="http://product.it168.com/list/b/0205_1.shtml" target="_blank">内存</a>管理。通过把 Web 服务模型化为 EJB 端点，这种特性很容易扩展，使 Web 服务能够有效地响应多个客户请求。 <br />
记住所有这些优点，下一节将展示如何在体系结构中将无状态 EJB 组件公开为 Web 服务。 <br />
<br />
<strong>&nbsp;&nbsp;&nbsp; 设计 SOA/Web 服务框架 <br />
</strong><br />
&nbsp;&nbsp;&nbsp; 比方说有一家公司，它的各种系统（比如支付、财务和发票系统）需要彼此交互。此外，其中一些应用程序还需要对外界公开，以便不同的业务合作伙伴与它们进行交互。您还需要为各种应用程序（如输入发票的各种数据输入操作或者查看支付的状态）设计基于 Web 的解决方案。最佳选择就是设计一种松散耦合的基于服务的系统。这些服务应该得到开放标准的支持，这样任何业务合作伙伴都可以调用它们。 <br />
<br />
&nbsp;&nbsp;&nbsp; 这些方面的考虑将使您转向 Web 服务 /SOA 框架，通过无状态 EJB 组件把各种服务和业务流程公开为 Web 服务。下面的 图 2说明了企业内部应用的 SOA 框架。<br />
<br />
<img border="0" alt="" src="http://tech.it168.com/sourcefiles/pic/2006-6-12/image/066121476.gif" width="430" height="598" /><br />
&nbsp;&nbsp;&nbsp; 图二</p>
<br />
<br />
&nbsp;下面列出了 SOA 框架中进行交互的各种组件。这是一种典型的 MVC 2 框架。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 客户（Client）：用户通过 Web 浏览器与不同的应用程序交互，浏览器作为应用程序的客户。比如，出纳部门的用户可能要输入帐单细节并把信息提交给应用程序。可以使用 JSP 页面和 XHTML 来呈现客户页面。 <br />
<br />
&nbsp;&nbsp;&nbsp; 应用程序控制器（Application controller）：应用程序控制器是您的主控制器 servlet。它负责初始化、委派请求和响应请求处理程序。 <br />
<br />
&nbsp;&nbsp;&nbsp; 请求处理程序（Request processor）：这是一个 Java 类，通过调用相应的请求执行程序完成要求的处理，对请求进行预处理。这种调用采用命令模式。 <br />
<br />
&nbsp;&nbsp;&nbsp; 请求执行程序（Request handlers）：请求执行程序完成具体请求的活动，比如与服务交互，向不同的企业信息系统（enterprise information systems，EIS）增加或检索信息。请求执行程序依靠业务定位程序发现相应的服务，然后通过这些服务访问需要的 EIS 信息。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 业务定位程序（Business locators）：这些程序负责隐藏查找服务的复杂性，并提供缓存逻辑。业务定位程序可以采用多种形式，比如 Web 服务定位程序、EJB 组件定位程序或者 JMS 定位程序。 <br />
<br />
&nbsp;&nbsp;&nbsp; 会话 Facades（Session Facades）：通过聚合来自多个系统或服务的方法，简化复杂对象的视图。会话 facades 是 EJB Web 服务方法的包装器。 <br />
<br />
&nbsp;&nbsp;&nbsp; EJB Web 服务（EJB Web services）：根据 EJB 1.4 规范，Web 服务端点可以模型化为无状态的会话 bean。如前所述，这种技术有许多优势。 <br />
<br />
&nbsp;&nbsp;&nbsp; 数据访问接口（Data access interfaces）：使用不同的技术（比如 EJB-CMP、JDO、DAO）和不同的持久性技术访问 EIS，所使用的访问技术取决于接口需求以及获取、插入或更新的数据量。这一层负责与 EIS 进行交互，并以相应的 EJB Web 服务方法所期望的格式把数据返回给这些方法。 <br />
<br />
&nbsp;&nbsp;&nbsp; MQSeries/JCA/CCF：现有的基于主机的服务可以公开为 Web 服务，从而向外界展示它们。Web 服务客户使用基于 HTTP 的 SOAP 协议与 EJB Web 服务交互。EJB 方法通过 JMS 协议向 MQSeries 队列发送请求。（使用 MQSeries 是与基于主机的应用程序交互的一种方式。）主机端的 MQSeries <a style="color: #000000" title="服务器" href="http://server.it168.com/" target="_blank">服务器</a>触发相应的基于 COBOL 的程序，后者为与后台系统（比如 IMS DC）进行交互提供必要的逻辑。然后这些程序把响应返回到队列中，应用程序逻辑检索这些响应并返回给 EJB 方法。SOAP 消息可以通过不同协议进行传输，比如 HTTP、HTTPS 和 JMS，但为了统一起见，本例子只使用 HTTP 和 HTTPS。 <br />
这些组件提供了企业内部应用程序面向服务体系结构的基础。接下来讨论把服务向外界公开。 <br />
<br />
&nbsp;&nbsp;&nbsp;<strong> 向外界公开服务 </strong><br />
<br />
&nbsp;&nbsp;&nbsp; 如果准备向外部用户公开服务，您需要某种<a style="color: #000000" title="安全" href="http://safe.it168.com/" target="_blank">安全</a>约束来保证只有授权的用户才能访问服务。一种方法是提供另外的 Web 服务层，过滤掉禁用的 Web 服务请求，并提供登录和安全约束。这种过滤方式还应提供一种工具，向每一客户只公开授权给该用户的服务子集。 <br />
<br />
<img alt="" src="http://cms.it168.com/sourcefiles/pic/2006-6-12/image/066121462.gif" width="430" height="486" /><br />
&nbsp;&nbsp;&nbsp; 图 3说明了企业外部应用的面向服务体系结构。它向外界公开了细粒度的服务。
<p>&nbsp;&nbsp;&nbsp; 以下是这种体系结构的基本功能单元： <br />
<br />
&nbsp;&nbsp;&nbsp; 外部客户（External clients）：可以包括基于 Web 的客户、移动客户或者使用 .NET 环境、Perl 或其他编程语言编写的客户。所有这些客户都为不同的服务发送请求。只要遵循 WS-I Profiles 就不会出现互操作性的问题。 <br />
<br />
&nbsp;&nbsp;&nbsp; 企业防火墙（Corporate firewall）：根据其安全策略，这家公司在 intranet 和 Internet 之间架起了防火墙，对收到的分组信息进行限制。 <br />
<br />
&nbsp;&nbsp;&nbsp; Web 服务<a style="color: #000000" title="网关" href="http://product.it168.com/list/b/0474_1.shtml" target="_blank">网关</a>（Web Services Gateway）：本例中，我选择使用 WebSphere Application Server 5.0 中的 Web Services Gateway 产品作为公开外部服务的网关。（关于该产品的更多信息，请参阅 参考资料。） Web Services Gateway 是一种中间件产品，在调用 Web 服务时提供了 Internet 和 intranet 之间的中间框架。使用 Web Services Gateway，开发人员和 IT 经理可以安全地对外公开 Web 服务，防火墙之外的客户也能调用这些服务。它包括一个服务管理模型（部署、取消部署，等等）和过滤器（对流经网关的请求和响应起作用的自定义代码）。它只处理收到的 SOAP/HTTP 请求，通过网关的请求可能发送给 Java 类、EJB 组件或者 SOAP <a style="color: #000000" title="服务器" href="http://product.it168.com/files/0402search.shtml" target="_blank">服务器</a>（该服务器甚至还可能是另一个网关）。它可以为单个的 Web 服务方法提供保护（基本授权），也可以保护整个网关。使用 Web Services Gateway，来自客户的请求可以被转换成服务所要求的任何消息协议。例如，客户的请求可能是 HTTP 上的 SOAP，但在内部可以使用 JMS 协议上的 SOAP，Web Service Gateway 能够提供从一个协议到另一个协议的转换。 <br />
<br />
&nbsp;&nbsp;&nbsp; EJB 服务（EJB services）：EJB 服务没有任何变化。过程的其他部分和 图 2所示体系结构提供的基于 intranet 的服务类似。 <br />
<br />
&nbsp;&nbsp;&nbsp;<strong> 使用 EJB 组件实现粗粒度的服务 <br />
</strong><br />
&nbsp;&nbsp;&nbsp; 迄今所见到的过程都是向客户公开细粒度的 Web 服务。只要每个业务服务作为单个业务过程执行，这种设置就能很好地工作。但是假设客户要进行在线资金转移，这种情况下提供单一的、粗粒度的接口显然更加合理，让用户提供所有必要的信息，包括传输的金额、发出和接收的银行信息，等等。此外，这类情形中验证必须在执行任何业务逻辑之前完成。在设计 Web 服务方法时必须考虑到这些问题，还要记住除了<a style="color: #000000" title="网络" href="http://net.it168.com/" target="_blank">网络</a>调用之外还有解析与规划 XML 请求和响应的开销。 <br />
<br />
&nbsp;&nbsp;&nbsp; 考虑到这些因素，可以把 Session Facades 模型化为 EJB Web 服务端点。Session Facades 可以在把请求委派给相应的 Web 服务方法之前首先验证请求。这样，您就可以向 Web 服务客户提供粗粒度的服务。&nbsp;<br />
<br />
<img alt="" src="http://cms.it168.com/sourcefiles/pic/2006-6-12/image/fig4(1).gif" width="430" height="556" /><br />
&nbsp;&nbsp;&nbsp; 图 4说明了企业外部应用的面向服务体系结构的下一次迭代过程。这个版本的体系结构向外界公开粗粒度的服务。</p>
<p>&nbsp;&nbsp;&nbsp; 这里，主要的实现仍然和 图 3 中所示的相同。唯一的区别在于已经公开了 Session Facades 作为 Web 服务端点。EJB Web 服务可以模型化为本地接口而不是远程接口。使用会话 facades 和方法级安全性，可以限制要执行的服务。使用 Web Service Gateway 也能为 Web 服务客户施加安全措施。根据需要，可以实现粗粒度服务和细粒度服务的某种结合，通过调整 Web 服务网关中间件来向外部客户公开两种服务。（关于使用 Session Facades 与企业 Web 服务的更多信息，请参阅 参考资料。） <br />
<br />
&nbsp;&nbsp;&nbsp; <strong>结束语 </strong><br />
<br />
&nbsp;&nbsp;&nbsp; 采用 WSDL 文件形式的 Web 服务接口可以发布到商业注册中心，从而使客户能够动态查找这些接口。如果交易伙伴已经知道这些服务，也不一定要进入商业注册中心，但是全球服务需要公共注册中心，以便客户能够查找可用的服务。例如，各个航空公司可以把它们的机票价格服务放在注册中心，普通客户可以发现所有这类服务，并查找航空公司所提供的最低票价。 <br />
<br />
&nbsp;&nbsp;&nbsp; 我希望本文能够有助于您开始使用 Web 服务和新的 J2EE 1.4 规范所提供的特性构建面向服务的体系结构。您可以修改和调整本文所述的 SOA Web 服务框架以适应您的业务需要。</p>
<img src ="http://www.blogjava.net/jia8086/aggbug/335292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jia8086/" target="_blank">疯狂的人</a> 2010-10-16 12:44 <a href="http://www.blogjava.net/jia8086/articles/335292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面向服务的分析与设计原理</title><link>http://www.blogjava.net/jia8086/articles/335291.html</link><dc:creator>疯狂的人</dc:creator><author>疯狂的人</author><pubDate>Sat, 16 Oct 2010 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/jia8086/articles/335291.html</guid><wfw:comment>http://www.blogjava.net/jia8086/comments/335291.html</wfw:comment><comments>http://www.blogjava.net/jia8086/articles/335291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jia8086/comments/commentRss/335291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jia8086/services/trackbacks/335291.html</trackback:ping><description><![CDATA[面向服务的体系结构(SOA)和 Web 服务的基本观念是成为我们日常语言的一部分，并可看作是适于设计现代企业应用程序的体系结构形式。在这种背景下， 什么构成好的服务这个基本问题就成为确保成功实现 SOA 的关键。
<p>　　像 面向对象的分析与设计(Object-Oriented Analysis and Design，OOAD)、 企业体系结构(Enterprise Architecture，EA)框架和 业务流程建模(Business Process Modeling，BPM)这样的现有建模规则为我们提供了高质量的实践，可以长期帮助标识和定义体系结构内的适当抽象。然而经验表明，这些实践各自单独应用时达不到要求。</p>
<p>　　在本文中，我们将研究 OOAD、EA 和 BPM 中的适当原理。我们还将推动对混合方法的需求，这种方法把所有这些规则中的原理与许多独特的新原理组合起来。这样得到的交叉学科 OOAD 方法使成功地进行 SOA 开发更容易，我们称之为 面向服务的分析与设计(Service-Oriented Analysis and Design，SOAD)，它还有待正式定义。我们还只是刚刚跨入 SOAD 的殿堂。</p>
<p>　　<strong>面向服务的概念</strong></p>
<p>　　在发现新的商机或威胁的预期下，SOA 体系结构形式旨在提供企业业务解决方案，这些业务解决方案可以 按需扩展或改变。SOA 解决方案由可重用的服务组成，带有定义良好且符合标准的已发布接口。SOA 提供了一种机制，通过这种机制，可以集成现有的遗留应用程序，而不管它们的平台或语言。</p>
<p>　　从概念上讲，SOA 中有三个主要的抽象级别：</p>
<ul>
    <li>　　<strong>操作</strong>：代表单个逻辑工作单元(LUW)的事务。执行操作通常会导致读、写或修改一个或多个持久性数据。SOA 操作可以直接与面向对象 (OO) 的方法相比。它们都有特定的结构化接口，并且返回结构化的响应。完全同方法一样，特定操作的执行可能涉及调用附加的操作。
    <li>　　<strong>服务</strong>：代表操作的逻辑分组。例如，如果我们将 CustomerProfiling视为服务，则 按照电话号码查找客户、 按照名称和邮政编码列出顾客和 保存新客户的数据就代表相关的操作。
    <li>　　<strong>业务流程</strong>：为实现特定业务目标而执行的一组长期运行的动作或活动。业务流程通常包括多个业务调用。业务流程的例子有： 接纳新员工、 出售产品或服务和 完成订单。</li>
</ul>
<p>　　在 SOA 术语中，业务流程包括依据一组业务规则按照有序序列执行的一系列操作。操作的排序、选择和执行称为服务或流程 编排。典型的情况是调用已编排服务来响应业务事件。</p>
<p>　　从建模的观点来看，由此带来的挑战是如何描述设计良好的操作、服务和流程抽象的特征以及如何系统地构造它们。这些相关问题都是当前行业内和学术界最常讨论的问题。据我们所知，最近几乎所有的 SOA 项目或专题研讨会都将这样的服务建模方面作为重要的主题，并引起了许多的争论。因此，让我们更近地作一番审视。</p>
<p>　　<strong>为什么 BPM、EA 和 OOAD 还不够?</strong></p>
<p>　　早期的 SOA 实现项目经验表明，诸如 OOAD、EA 和 BPM 这样的现有开发流程和表示法仅仅涵盖支持 SOA 范式所需的部分要求。SOA 方法在加强已经制定的良好通用软件体系结构原则(如信息隐藏、模块化和问题分离)的同时，还增添了附加的主题，例如， 服务编排、 服务库和 服务总线中间件模式，在建模时需要对它们给予特别的关注。</p>
<p>　　图 1展示了现有的 EA、BPM 和 OOAD 建模方法的主要应用领域，也是我们随后讨论 SOAD 的出发点。图中的水平轴表示 项目生命周期阶段;垂直轴表示不同抽象层或 领域之间的区别，而建模活动通常就是在其上进行的。</p>
<p>　　图 1. BPM、EA 和 OOAD 的位置</p>
<p>　　<img alt="BPM、EA 和 OOAD 的位置" src="http://dev.yesky.com/imagelist/2007/354/szo0n1f594q9.gif" width="442" height="238" /></p>
<p>　　SOA 的远景是相当容易理解的，因为它的技术基础众所周知。例如，在任何 SOA 工作中，应用通用的软件体系结构原则和 OO 技术都是一个有效的开端。然而，正如我们已经提到的，早期采用者最常询问的问题是如何标识正确的服务。如前所述，OOAD、EA 和 BPM 在各自独立地应用时不能提供满意的答案，而这正是我们现在要说明的。</p>
<p>　　在由 Booch 和 Jacobson撰写的开创性的书(大约 10 年前出版的)中介绍的 OOAD 方法在定义 SOA 方面提供了非常好的起点。同样地，虽然许多年来在体系结构层次中应用 OOAD 技术和统一建模语言(Unified Modeling Language，UML)表示法是一个常见的实践，但是 OOAD 还是与像类和单独的对象实例这样的微观层次的抽象有关。由于每个问题域常常都创建单独的用况模型，因此，应用程序开发项目，这个企业的大方向在许多情况下变得模糊。此外，由于种种原因，用况模型并不总是与其对等的 BPM 保持同步。</p>
<p>　　诸如 Treasury 企业体系结构框架(Treasury Enterprise Architecture Framework，TEAF)、 面向特征的领域分析(Feature-Oriented Domain Analysis，FODA)和 Zachman这样的 EA 方法都将城市规划级的观点加在解决方案体系结构之上，但是并没有解决如何找到易于重用且具有持久性的高质量企业抽象的问题。</p>
<p>　　虽然 BPM 方法(如 BPMI)在功能工作单元之上提供了端到端视图，但是它们通常都没有触及体系结构和实现领域。例如，在像 用于 Web 服务的业务流程执行语言(Business Process Execution Language for Web Services，BPEL)这样的语言出现之前，BPM 表示法缺少操作语义。此外，我们还看到了许多流程建模与开发活动彼此分离的情况。</p>
<p>　　最后，现有的规则中没有一个可以解决如何为 SOA 启用 现有的应用程序的问题;大部分时间都采用自顶向下流程。现有的系统通常都存放有大量的重要数据和业务逻辑，并且不能简单地加以替代。因此，为了研究包装和重构策略，必须对这些系统进行自底向上的分析。因此，对现有应用程序的考虑会将我们带到中间相遇的流程。</p>
<p>　　由于这些原因的存在，所以需要混合 SOAD 建模方法。这种方法以最佳的方式组合了 OOAD、BPM 和 EA 中的原理，并且融入了一些具有创新性的原理。 图 2展示了这种新的方法的 SOAD 资源(原理和技术)：</p>
<p>　　图 2. SOAD 及其组成部分：OOAD、BPM 和 EA</p>
<p>　　<img alt="SOAD 及其组成部分：OOAD、BPM 和 EA" src="http://dev.yesky.com/imagelist/2007/354/b2q85nsxnhvv.gif" width="442" height="238" /></p>
<p>　　<strong>EA</strong></p>
<p>　　将企业应用程序和 IT 基础设施发展成 SOA 可能是一个大的负担，会影响多个业务线和组织单元。因此，需要应用 EA 框架和参考体系结构(如 开放组织体系结构框架(The Open Group Architecture Framework，TOGAF))以及 Zachman，以努力实现单独的解决方案之间体系结构的一致性。</p>
<p>　　根据过去的经验，大多数现有的 EA 框架都在一个或多个方面有限制。例如，如果主要的问题是表示技术设备的低级构块如何在宏观层次互连，则无法获得业务层流程或服务视图。然而，在 SOA 的背景下，这种考虑问题的方式必须转换为以表示业务服务的逻辑构件为中心，并且集中于定义服务之间的接口和 服务级协定(Service Level Agreements，SLA)。</p>
<p>　　此外，许多企业级参考体系结构和框架是相当普通的，并没有触及设计领域。这样的高级体系结构无法为架构师和开发人员提供具体的战术意见，并且常常导致企业体系结构和解决方案体系结构之间出现根本性的分歧。</p>
<p>　　SOAD 必须帮助 SOA 架构师定义服务前景的整体业务级视图。这是当今的 EA 框架所无法提供的，它们需要未来特定于 SOA 的增强; 按需操作系统(On Demand Operating Environment，ODOE) 是 IBM 针对这种趋势制定的主要战略。</p>
<p>　　<strong>BPM</strong></p>
<p>　　BPM 是一个不完整的规则，其中有许多不同的形式、表示法和资源。另一种常用的技术是定义表示概念性流程流的 事件驱动流程链，正如 Barker 和 Longman所定义的。这第二种技术使用了不同于 UML 的表示法。</p>
<p>　　此外，还有许多专用方法(如 BPM 技术)可能被咨询公司和企业资源规划(Enterprise Resource Planning，ERP)软件包厂商视为具有竞争优势。ARIS Implementation Platform 就是这样的产品的一个例子。其他的方法包括： Line of Visibility Enterprise Modeling(LOVEM) 和 IBM 的组件业务建模(Component Business Modeling，CBM)战略。</p>
<p>　　最近的趋势是定义表示可执行流模型(如 用于 Web 服务的业务流程执行语言(Business Process Execution Language for Web Services，BPEL) )的标准方法。BPEL 将流程的范围从分析扩展到实现。这样的可执行模型引发了一系列的新问题，其中包括：</p>
<ul>
    <li>　　哪些方面应该用 BPEL 描述，哪些方面应该用 WSDL 描述?流程模型和传统的编程模型之间的区别在什么地方?
    <li>　　如何将非功能性要求和服务质量特征这样的方面加入模型之中?
    <li>　　同更传统的编码(例如在 J2EE 中)相比，在 BPEL 引擎的编程语言扩展中执行多少逻辑?
    <li>　　如何评定可执行流程模型的质量，其应用的最佳实践是什么?
    <li>　　什么工作角色进行 BPEL 流管理;是业务专家(分析人员)，还是开发角色(软件架构师)?</li>
</ul>
<p>　　必须利用所有现有的 BPM 方法作为 SOAD 的起点;然而，必须使用流程模型中用于驱动 候选服务和它们的操作的附加技术来对其加以补充。此外，SOAD 中的流程建模必须与设计层用况建模保持同步，并且必须给出与 BPEL 有关的问题的答案。<br />
<br />
<strong>OO 范式与面向服务 (SO) 范式</strong> </p>
<p>&nbsp;</p>
<p>　　OO 分析是一种非常强大且广为赞誉的方法，同样，SOAD 应该尽可能多地利用 OO 分析技术。要将 OO 分析成功地应用于 SOA 项目，您就必须一次分析多个系统。用况模型必须继续扮演重要的角色。然而，SOAD 必须主要是 流程，而不是 用户驱动的。因此，SOAD 需要 BPM 和用况建模活动之间的强链接。</p>
<p>　　在 设计层，OO 的目标是能够进行快速而有效的设计、开发以及执行灵活且可扩展的应用程序。对象是软件构造，其行为就像它们建模的真实世界的实体。例如，顾客 (Customer) 将有名称和联系信息，并且还可能有一个或多个与之相关的帐户对象。从 OO 的角度看，每件事情都是对象。</p>
<p>　　OO的基本原则是：</p>
<ul>
    <li>　　<strong>封装</strong>：软件对象就是包含模拟真实世界的对象的物理属性(数据)和功能(行为)的离散包。例如，帐户对象保持收支平衡并且包含平衡中的借贷机制。
    <li>　　<strong>信息隐藏</strong>：结构良好的对象有简单的接口，并且不向外界显漏任何内部机制。真实世界信息隐藏的例子是，您不需要详细了解汽车的工作原理就能够驾驶它。
    <li>　　<strong>类和实例</strong>： 类是定义特定类型的软件对象具有什么类型的属性和行为的模板，而 实例是具有这些属性值的个别对象。创建类的新实例称为 实例化。利用生物学进行类比，人就是一个类。所有的人都具有一些属性，比如身高、体重、头发和眼睛颜色等等。我们中的每个人都是这个类 HumanBeing 的实例，具有一些特定的身高、体重以及其他的属性值。类是一直存在的，而实例具有有限的生命周期。
    <li>　　<strong>关联和继承</strong>：在 OO 中，表达类和对象之间的关联的能力是一个关键的概念;继承是关联的强形式，用于表达有关系：按照同样的方式，生物物种由这样的层次构成：界 (Kingdom)、门 (Phylum)、纲 (Class)、目 (Order)、科 (Family)、类 (Genus)、种 (Species)。我们常常发现软件对象的自然层次。例如，当您创建一个财务应用程序实体时，您可能需要构造像 经常帐户(CheckingAccount) 、 储蓄帐户(SavingsAccount) 和 贷款帐户(LoanAccount) 这样的对象。如果您看得更仔细一点(请参见 图 3)，您将发现这些类共享许多属性，比如都有收支平衡帐户、借方帐户和贷方帐户等等</li>
</ul>
<p>　　图 3. UML 类继承示例</p>
<p>　　<img alt="UML 类继承示例" src="http://dev.yesky.com/imagelist/2007/354/8qb85oq9rolm.gif" width="367" height="242" /></p>
<p>　　与其重复定义和管理这些属性的代码，不如创建一个通用的 帐户(Account) 类，该类具有现金收支平衡并且可以处理借贷事务。所有其他的类都是这个 帐户(Account) 对象的专门形式。例如， 贷款帐户(LoanAccount) 将在零和某个约定的最大值之间具有负平衡，而 储蓄帐户(SavingsAccount) 将具有负平衡，并且将展示增加利息的行为，等等。</p>
<p>　　<strong>消息传递</strong>：为了完成一些有用的工作，软件对象需要相互通信。它们通过相互发送消息来这样做。例如，假定我们想将 00 从经常帐户转到储蓄帐户，要达到此目的，可以将带有参数 00 的 借消息发送到 经常帐户(CheckingAccount) 实例，并且将相应的 贷消息发送到 储蓄帐户(SavingsAccount) 实例。当实例接收消息时，它执行相应的功能，称为 方法，它有与消息相同的名称。</p>
<p>　　<strong>多态</strong>：这个术语描述两个或两个以上的类接受相同的消息但是以不同的方式进行实现的情况。例如， 自由经常帐户(FreeCheckingAccount) 实例和 经常帐户(CheckingAccount) 实例将响应 借 (0) 消息，但是 自由经常帐户(FreeCheckingAccount) 实例将正好 00 记入它的帐户平衡的借方，而 经常帐户(CheckingAccount) 实例将 00 加上交易费记入它的帐户平衡的借方。</p>
<p>　　OO 支持应用程序分析、设计和开发的完整生命周期：</p>
<p>　　OOAD试图找到最优的对象和最自然的类继承来实现它们。</p>
<p>　　OO 开发集中于应用程序的渐进式开发，每次实现一个业务场景或用况。像 IBM WebSphere Studio Application Developer 这样的工具有助于开发人员快速地构造和测试 OO 应用程序。</p>
<p>　　OO 运行时环境，例如由 Java 虚拟机提供的，提供应用程序服务(如垃圾收集(删除因使用它们的对象已经被丢弃而不再使用的资源))以及框架(如 J2EE)来为驻留在不同的服务器上的对象提供相互通信的机制。</p>
<p>　　目前与 SO 有关的 OO 设计实践的主要问题在于，它的粒度级别集中在类级，对于业务服务建模来说，这样的抽象级别太低了。诸如继承这样的强关联产生了相关方之间一定程度的 紧耦合(因而具有依赖性)。与此相反，SO 范式试图通过 松耦合来促进灵活性和敏捷性。目前，在 SOA 中还没有服务 实例的跨平台继承支持和一流的表示法来避免需要处理服务生命周期维护管理问题(如远程垃圾收集)。</p>
<p>　　这些考虑事项使 OO 难以与 SO 体系结构样式直接保持一致。然而，对于设计已定义的服务中的底层类和组件结构，OO 仍然是一种有价值的方法。此外，许多 OOAD 技术(例如类、责任、协作(CRC)卡)也可以用于服务建模(如果它们提升到更高层次的抽象的话)。在本文后面，我们将回过头来讨论这一点。</p>
<p>　　图 4展示了可见性层次和 OO、 面向组件和 SO 设计提供的重点之间的对应关系。它还展示了在 SOA 和 SOAD 背景中它们之间的相互关系。</p>
<p>　　图 4. 设计层次</p>
<p>　　<img alt="设计层次" src="http://dev.yesky.com/imagelist/2007/354/5rv9l7ah4023.gif" width="274" height="194" /></p>
<p>　　至于表示法，统一建模语言(Unified Modeling Language，UML)——通过一些附加的定型(Stereotype)和概要加以增强——自然成为 SOAD 的重要基础。</p>
<p>　　在使用 Rational Unified Process (RUP)——被认为是支持迭代软件开发的分析与设计的主流 OOAD 流程之一——的流程方面，使用 UML 模型具有首要价值。然而，RUP 以 OOAD 的原则为基础，因而使其不容易与 SOA 设计保持一致。从 RUP 的角度来看，系统的体系结构是其通过已定义接口交互的主要组件的体系结构。此外，这些组件还由逐渐减小到类级粒度的更小组件组成。相反，在 SOA 中，系统的体系结构通常包括满足普通 业务服务需要的无状态、全封装且自描述的服务组成，它更接近于映射到 BPM，如 图 5所示。</p>
<p>　　图 5. SOAD 服务定义层次</p>
<p>　　<img alt="SOAD 服务定义层次" src="http://dev.yesky.com/imagelist/2007/354/32r2fgw3urto.gif" width="436" height="259" /></p>
<p>　　这些服务可能包括许多协作或编排服务。这并没有排除 RUP 采用的 OO 观点，而是在其上实现了另一个抽象层。这个超层的作用是封装作为正式的跨层接口结构中的 RUP 构件( 软件服务)设计的组件。<br />
<br />
<strong>SOAD 原理</strong> </p>
<p>&nbsp;</p>
<p>　　在这一部分中，我们将更详细地描述 SOAD 的需求，并且开始确定它的主题和原理。目的是将关于这个主题的讨论引到进一步的设计工作。进一步的工作无疑需要形式化 SOAD 方法。</p>
<p>　　<strong>SOAD 必须提供什么?</strong></p>
<p>　　已经为 SOAD 确定了下列需求：</p>
<p>　　正如任何其他的项目和方法一样，必须正式(至少半正式)地定义 流程和 表示法。通过选择和组合 OOAD、BPM 和 EA 原理，就可以在需要时确定额外的原理。</p>
<p>　　必须有结构化的方法来概念化服务：</p>
<p>　　OOAD 为我们提供了应用程序层上的类和对象，而 BPM 具有事件驱动的流程模型。SOAD 需要将它们结合在一起。</p>
<p>　　方法不再是面向用况的，而是由业务事件和流程驱动的。用况建模是在更低的层次上作为第二步进行的。</p>
<p>　　方法包括语法、语义和策略。这就需要特别的组合、语义代理和运行时发现。</p>
<p>　　SOAD 必须提供定义良好的品质因素和最佳实践(例如回答粒度问题)。必须回答 BPEL 提出的角色问题。例如，谁为哪部分工作负责：是开发人员、架构师，还是分析人员?</p>
<p>　　SOAD 活动还必须回答这样的问题：什么 不是好的服务?例如：不可重用的任何东西都不可能成为好的一流 SOA 成员(即服务)。另一个例子就是带有挑战性的非功能要求的嵌入式实时系统，它们不能承受任何 XML 处理开销。</p>
<p>　　SOAD 必须易于进行端到端建模，并且有全面的工具支持。假如 SOA 给业务带来了灵活性和敏捷性，就应该对从企业到体系结构和应用程序设计领域产生的支持方法有相同的期望。</p>
<p>　　<strong>品质因素</strong></p>
<p>　　一些通用原则或品质因素已经确定，并且可以作为 SOAD 中的设计基准：</p>
<ul>
    <li>　　构思良好的服务给业务带来了灵活性和敏捷性;它们通过松散耦合、封装和信息隐藏使重构更加容易。
    <li>　　设计良好的服务是有意义的，并且不只适用于企业应用程序;服务之间的依赖性减到最少，并且是显式声明的。
    <li>　　服务抽象是内聚、完整和一致的;例如，在设计服务和它们的操作签名时应该考虑 创建(Create)、 读取(Read)、 更新(Update)、 删除(Delete)和 搜索(Search)(CRUDS) 隐喻。</li>
</ul>
<p>　　常常声明的假定是，服务是无状态的(例如非对话式的);为了要求服务在特定的问题域和上下文中是无状态的，将削弱这种声明。</p>
<p>　　领域专家无需深奥的专业知识就可以理解服务命名。</p>
<p>　　在 SOA 中，所有的服务都遵循相同的设计体系(通过模式和模板连接的)和交互模式;底层体系结构形式可以容易地标识(例如在体系结构复审期间)。</p>
<p>　　服务和服务使用者的开发除了领域知识之外只需要基本的编程语言技能;中间件专业知识只有少数的专业人员才需要，在理想的情况下，这种知识是为工具和运行时厂商所用，而不是为制作像 SOA 这样的企业应用程序的公司所用。</p>
<p>　　<strong>服务标识和定义</strong></p>
<p>　　自顶向下的业务级建模技术(如 CBM)可以为 SOA 建模活动提供起点。但是正如我们在前面提到的，SOA 实现很少是在全新的项目中开始的;创建 SOA 解决方案几乎总需要涉及集成现有的遗留系统，方法是将它们分解成服务、操作、业务流程和业务规则(同时参见 图 6)：</p>
<p>　　将现有的应用程序和厂商软件包分解成表示相关操作组的离散服务集(自底向上方法)。</p>
<p>　　从应用程序中将业务流程和规则抽象为由业务编排模型管理的单独 BPM。</p>
<p>　　图 6. 服务分解</p>
<p>　　<img alt="服务分解" src="http://dev.yesky.com/imagelist/2007/354/09rb38u173i8.gif" width="440" height="139" /></p>
<p>　　所有的 OOAD 都同标识和定义服务有关;但是还需要具有更高层的观点。此外，当 SOA 致力于比经典开发项目层次更高的开发时，就有了发挥其他创造性思维的空间。</p>
<p>　　<strong>直接和间接业务分析</strong></p>
<p>　　通过项目相关人员的会谈和 CBM 来进行 BPM 和 直接需求分析是一个容易理解且非常合适的标识候选服务的方法。</p>
<p>　　过去的经验表明，这条主要的途径应该通过补充 间接技术来加以改进。在选择候选服务时，产品经理和其他业务领导应该进行协商。例如，什么是计划付款和开票模型?应该商议假定使用正在构建中的系统的企业的组织结构图。建议还考虑一下非 SOA 项目中任何现有的用况模型。用于对正在构造的系统进行营销介绍的术语是另一个很好的关于服务操作候选者的来源(特别是动词，很少关注营销动词!)。</p>
<p>　　<strong>域分解</strong></p>
<p>　　在 Endrei中定义的域分解、子系统分析、目标模型创建和相关技术是 SOA 流程构造方法或 服务概念化框架(它是基于 Levi and Arsanjani先前完成的工作构建的)最有希望的提议。来自 SEI的 FODA 工作也为这方面的讨论做出了贡献。</p>
<p>　　<strong>服务粒度</strong></p>
<p>　　选择正确的抽象级别是服务建模的一个关键问题。您常常会听到 进行粗粒度建模的建议。这有点过于简单化了。您应该将其改为在不损失或损害相关性、一致性和完整性的情况下 尽可能地进行粗粒度建模。在任何 SOA 中，都有细粒度服务抽象的空间(假定有业务要求的话)。由于 SOA 并不等同于 Web 服务和 SOAP，因此可以使用不同的协议绑定来访问抽象级别不同的服务。另一种选择就是将一些相关的服务捆绑成粗粒度的服务定义，这是门面模式的变种。</p>
<p>　　<strong>命名约定</strong></p>
<p>　　应该定义企业命名模式(XML 名称空间、Java 包名、Internet 域)。简单的例子就是始终用名词来命名服务，而用动词来命名操作。这种最佳实践来源于 OOAD 空间。</p>
<strong>第一类 SOAD 原理</strong>
<p>&nbsp;</p>
<p>　　除了组合 OOAD、BPM 和 EA 技术之外，还有几个重要的 SOAD 概念和方面有待充实：</p>
<ul>
    <li>　　服务分类和聚合
    <li>　　策略和方面
    <li>　　中间相遇流程
    <li>　　语义代理
    <li>　　服务获取和知识代理</li>
</ul>
<p>　　<strong>服务分类和聚合</strong></p>
<p>　　服务有不同的用法和用途;例如，软件服务可以不同于业务服务(如前面的 图 5所示)。此外，还可以将原子服务编排成级别更高、功能齐全的服务。</p>
<p>　　服务组合可以通过可执行模型(如 BPEL 建模的模型)来加以简化;这是传统的建模工具和方法不能处理的事情。</p>
<p>　　<strong>策略和方面</strong></p>
<p>　　服务具有语法、语义和 QoS 特征，所有这些都必须进行建模;正式的接口契约必须涵盖的比 Web 服务描述语言(Web Services Description Language，WSDL)的多。因此， Web 服务策略(WS-Policy) 框架是一个重要的相关规范。</p>
<p>　　除了已经制定的良好 体系结构可跟踪性原则之外， 业务可跟踪性也是一个理想的品质：应该有可能将所有的运行时构件直接与非技术领域专家可以理解的语言联系起来。这对于直接在业务和服务层公开的抽象非常重要。Sarbanes-Oxley (SOX) 法案是需要这种业务可跟踪性的业务驱动程序的一个例子。</p>
<p>　　<strong>流程：中间相遇</strong></p>
<p>　　在真实世界中，并没有全新的项目，必须始终考虑遗留系统( 遗留系统是现有系统的同义词)。因此，需要 中间相遇的方法，而不是单纯的自顶向下或自底向上的流程。</p>
<p>　　在设计取决于现有的 IT 环境而不是现在和将来的业务需要的情况下，自底向上的方法往往会导致不好的业务服务抽象。而自顶向下的方法可能会产生不足的非功能性需求特征，并且损害其他的体系结构品质因素(例如因域模型中缺乏标准化而导致的性能问题)，另外，也会在服务和组件中产生不匹配的不良问题。</p>
<p>　　<strong>服务获取和知识代理</strong></p>
<p>　　这是一个知识管理和生命周期问题：如何成功地准备好服务并且使其在概念化之后可以重用?</p>
<p>　　应该将重用看作是标识和定义服务最主要的推动标准之一。如果组件(或服务)不可能重用，就不无法将其作为服务进行部署。它可以连接到另一个与企业体系结构相关的服务，但是不能单独作为一个服务而存在。</p>
<p>　　然而，即使从开始就计划好了重用，还必须形式化服务获取流程。由多个使用者使用服务是明确的 SOA 设计目标。构建时服务注册中心(例如企业 UDDI 目录)可能能够解决部分问题。</p>
<p>　　<strong>示例：汽车工作订单</strong></p>
<p>　　汽车工作订单(Automotive Work Order)描述了一家汽车维修公司管理其顾客运营的流程。我们将通过这个领域中的问题来阐述 SOAD 的观点。</p>
<p>　　工作订单代表汽车服务公司和顾客之间的约定，以进行一系列例行维修或应急维修，例如例行 50,000 英里服务，更换刹车片或轮胎，或者换油。</p>
<p>　　业务场景(如 图 7所示)如下：</p>
<ul>
    <li>　　当顾客打电话预约时创建工作订单。
    <li>　　为每个计划的维修活动或操作创建一个独立的工作订单项，其中包括需要使用的零件、备件和劳务的详细情况。
    <li>　　在安排预约之前确保所有必需的零件都有库存。
    <li>　　需要为每个工作订单项安排具有适当的装备的维修间以及具备适当的条件的机器。
    <li>　　计算估计的总成本，接着顾客认可该预约;或者方案终止，随即取消工作订单。
    <li>　　在预约之前，立即在选定的维修间装配必需的零件、备件、工具和设备。
    <li>　　当顾客到达时，进行计划的活动以及在检查交通工具时显得有必要的任何其他活动。
    <li>　　记录所用的零件和备件的实际价值以及劳务。
    <li>　　在完成所有的维修时计算总费用。
    <li>　　创建发票并且将其交给顾客。</li>
</ul>
<p>　　图 7. 工作订单的宏流示例</p>
<p>　　<a href="http://dev.yesky.com/syscore/181/549681d_6.shtml" target="_blank"><img border="0" alt="工作订单的宏流示例" src="http://dev.yesky.com/imagelist/2007/354/286lu09qez1ls.gif" /></a></p>
<p>　　如果您将此作为一个独立的应用程序从头开始创建，您就可能创建一组如 图 8所示的类。</p>
<p>　　图 8. 工作订单的类图示例</p>
<p>　　<a href="http://dev.yesky.com/syscore/181/549681d_7.shtml" target="_blank"><img border="0" alt="工作订单的类图示例" src="http://dev.yesky.com/imagelist/2007/354/5t0qvb1ny0j3s.gif" /></a></p>
<p>　　如果您将工作订单构造为一个 OO 应用程序，这些软件对象将包含所有必需的业务规则，并且理解应该遵循的业务流程。</p>
<p>　　然而，这种方法在实践方面存在着一些缺点：</p>
<p>　　许多步骤涉及与现有遗留系统和数据库(例如帐单编制、日程安排以及库存系统)的连接，它们不可能遵循 OO 范式进行设计(在这样的情况下，应用适配器或仲裁器会有所帮助)。</p>
<p>　　为了使系统尽可能地灵活，将一些规则外化是有帮助的，这样就可以在不更改代码的情况下修改流程或工作流。例如像下面这样的规则：</p>
<ul>
    <li>　　标准的 24,000 英里服务包括四公升油。只是在使用四升以上的油或顾客要求优质油(如合成油)时才应该收取额外的邮费。
    <li>　　在遗留应用程序中有一套工业标准为普通汽车维修活动进行劳务估价。除非维修人员收取的费用超过该估价的 X% 并且报告产生差别的有根据的原因，否则顾客就应该支付标准的劳务费。
    <li>　　如果超过估价的 Y% 以上，就应该联系顾客以进行确认。</li>
</ul>
<br />
SOAD 为这些问题提供了极好的解决方案。由于它基于相关的行为对服务进行分组，而不是进行封装(行为及数据)，所以这组服务与业务对象略有不同。
<p>&nbsp;</p>
<p>　　例如，您可能将工作订单(Work Order)和工作订单项(Work Order Item)一起分到工作订单服务(Work Order Services)，并且创建日程安排(Scheduling)、目录(Catalog)和库存(Inventory)服务。另外，因为没有服务实例，所以没有与服务之间的关系等价的东西。工作订单的服务模型可能看起来如 图 9所示。</p>
<p>　　图 9. 工作订单的服务模型示例</p>
<p>　　<a href="http://dev.yesky.com/syscore/181/549681d_8.shtml" target="_blank"><img border="0" alt="工作订单的服务模型示例" src="http://dev.yesky.com/imagelist/2007/354/p4435290d88is.gif" /></a></p>
<p>　　与 OO 范式不同，这个模型并不表示功能系统。既没有考虑流，也没有描述业务事件或规则。在 SOA 范式中，在服务外面维护的业务流程编排决定了执行服务调用的顺序和时间。</p>
<p>　　从概念上讲，从第一次顾客联系到完成工作和帐单支付的整个业务表示单个宏观层次的工作单元，并具有数天到数周不等的生命周期。毕竟，从企业的角度来看，工作单元会产生收入。</p>
<p>　　然而，实际出现的情况是在一段相对长的时间内单独发生的一系列集中活动，例如，定义活动、安排预约、选择零件和备件、进行维修活动等等。在 IT 系统中，没有实际的 流程会持续几分钟以上;事件之间的业务流程状态以数据的形式保存在数据库中。</p>
<p>　　这种类型的流程可以用状态转换模型(例如 UML 中可用的)很好地进行表示。 图 10显示了用有限状态机(finite-state machine)方法如何对业务流进行建模的示例。它是在业务流程进行时工作订单的状态如何改变的高级视图。</p>
<p>　　图 10. 工作订单的业务流程模型</p>
<p>　　<img alt="工作订单的业务流程模型" src="http://dev.yesky.com/imagelist/2007/354/3173v27h81u4.gif" width="472" height="383" /></p>
<p>　　业务流程编排集中于状态之间的这些转变。单独的操作永久地记录相关的状态改变。</p>
<p>　　图 11显示了部分编排的示例，其中包括 图 10所示的业务场景中的步骤 1 到 5(例如，顾客定义他们的交通工作所需的工作，并且安排预约以进行实施)。</p>
<p>　　图 11. 工作订单的业务交互模型</p>
<p>　　<a href="http://dev.yesky.com/syscore/181/549681d_10.shtml" target="_blank"><img border="0" alt="工作订单的业务交互模型" src="http://dev.yesky.com/imagelist/2007/354/5oago2v12055s.gif" /></a></p>
<p>　　<strong>总结和展望</strong></p>
<p>　　在本文中，我们已经讨论和激发了对创新的中间相遇的方法的需求，这种方法搭建了业务和 IT 之间的桥梁，并且支持 SOA 项目的分析和设计阶段。我们还提议将这种新的交叉学科的 SOAD 方法作为一个整体的建模规则，它以现在构建良好且广为赞誉的 OOAD、EA、和 BPM 为基础。</p>
<p>　　在详细定义 SOAD 表示法和流程的同时，还确定了关键的原理，比如服务概念化(或标识)、服务分类或聚合、策略和方面、中间相遇流程、语义代理和服务获取(以供重用)。</p>
<p>　　SOAD 需要增强现有的软件开发方法，进一步提高企业应用程序开发项目的可用性和适用性。随着时间的推移，还将发展相关的最佳实践。</p>
<p>　　我们还认识到，UML 在流程的表示法选择方面将继续占支配地位;可能需要进行增强以满足更广泛的 SOAD 的要求。</p>
<p>　　完成 SOAD 方法的下一步就是定义所需的端到端流程和表示法，复审活动中的角色和它们的责任，并且继续检查所提议的方法在项目中的有效性。</p>
<img src ="http://www.blogjava.net/jia8086/aggbug/335291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jia8086/" target="_blank">疯狂的人</a> 2010-10-16 12:34 <a href="http://www.blogjava.net/jia8086/articles/335291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>