﻿<?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>C++博客-M-A-T [SOA] Space-随笔分类-技术文章</title><link>http://www.cppblog.com/zhangji198543/category/1470.html</link><description>Merlin--April--Tory</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 17:47:34 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 17:47:34 GMT</pubDate><ttl>60</ttl><item><title>7月5日-----这两天考试太多，郁闷中~</title><link>http://www.cppblog.com/zhangji198543/archive/2006/07/05/9433.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Wed, 05 Jul 2006 05:57:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/07/05/9433.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/9433.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/07/05/9433.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/9433.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/9433.html</trackback:ping><description><![CDATA[Java, VC, English, 邓论.快晕了。幸亏学院照顾我们这帮实习的，日语改在下学期开学考了，否则得累死~~。<br /><br />这些天心一直悬着，都等结果出来呢，考试也很闹心，郁闷。<img src ="http://www.cppblog.com/zhangji198543/aggbug/9433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-07-05 13:57 <a href="http://www.cppblog.com/zhangji198543/archive/2006/07/05/9433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6月19日----- 通过服务模拟来简化 SOA 开发</title><link>http://www.cppblog.com/zhangji198543/archive/2006/06/19/8718.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Mon, 19 Jun 2006 10:54:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/06/19/8718.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/8718.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/06/19/8718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/8718.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/8718.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<h1>
												<font size="3">
												</font> </h1>
										<img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
								</td>
								<td class="no-print" width="192">
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td width="100%">
										<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0">
												<tbody>
														<tr>
																<td width="10">
																		<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
																</td>
																<td>
																</td>
														</tr>
												</tbody>
										</table>
										<p> </p>
										<blockquote>通过用例和模拟对象简化 SOA 开发——特别在您的项目涉及多个团队时——并提高 SOA 应用程序质量。</blockquote>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<p>借助于可重用服务和需要很少的新代码的应用程序（因为可以依赖这些可重用服务），面向服务的体系结构 (SOA) 可以大幅度提高应用程序开发的速度。但是 SOA 还可能大大增加应用程序开发的复杂性，因为团队需要同时进行应用程序的不同部分的工作，而且要在最后成功地将各个部分组合起来。本文将探讨致使 SOA 开发变得困难的原因，并提供了一个可以对其进行简化的流程。各种组织可以使用此流程来极大地增加其 SOA 成功的几率。</p>
										<p>
												<a name="N10056">
														<span class="atitle">
																<font face="Arial" size="4">SOA 开发问题</font>
														</span>
												</a>
										</p>
										<p>使用 SOA 开发应用程序可提供更多的应用程序部署选项，但也使得开发工作变得越发困难。这是因为 SOA 将应用程序开发拆分为两个截然不同的部分：</p>
										<ul>
												<li>
														<b>SOA 服务提供程序（SOA Service Provider，SOA-SP） </b>——该层的代码实现服务。它具有服务 API，以对服务进行声明和为客户机提供调用服务的方法。 
</li>
												<li>
														<b>SOA 服务协调程序（SOA Service Coordinator，SOA-SC）</b>——该层的代码通过一个或多个 SOA-SP 中的服务提供用户功能。它可能具有 UI 或 GUI，以便同传统应用程序一样与 SOA-SC 进行交互。 </li>
										</ul>
										<p>例如，某个金融应用程序的 SOA 可能如<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/#fig1"><font color="#996699">图 1</font></a> 中所示。</p>
										<br />
										<a name="fig1">
												<b>图 1：个人金融应用程序和服务</b>
										</a>
										<br />
										<img height="165" alt="个人金融应用程序和服务" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/fig1.gif" width="481" />
										<br />
										<p>通常由独立的团队分别负责同时开发这两个独立的部分。一个团队负责开发 SOA-SC——对用户而言的应用程序。另一个团队负责开发 SOA-SP，或许存在多个负责此项任务的团队，而每个团队负责开发若干服务。虽然可能已经实现了一些提供程序，但可能仍然需要专门为此应用程序实现其他的提供程序。</p>
										<p>而这给我们提出了第一个问题：<i>如果某些提供程序尚未实现，协调程序开发团队如何开发其负责的应用程序部分呢？</i></p>
										<p>这两个团队——开发服务的团队和开发协调程序的团队——需要使其活动同步。他们必须就服务 API 达成一致；服务 API 可以是简单的 Java™ 接口或 Java Message Service (JMS) 消息格式和队列名称，但必须就此达成一致。但仅就接口达成一致是不够的；服务具有行为，因此团队必须就服务的行为达成一致。服务并不会始终成功地工作，因此团队还必须就错误情况和相应的响应达成一致。</p>
										<p>在理想的情况下，多个团队可以非常容易地协调工作，最初的决策可以稍后进行修改，而所造成的影响却非常小，并且评估工作非常灵活，此外还会不断地进行改进。在现实世界中，团队之间经常存在协作问题，往往较早地（甚至不成熟地）做出不可更改的决策，而且评估方法是固定的。</p>
										<p>这样就带来了第二个问题：<i>协调程序和提供程序团队如何较早而可靠地就服务如何工作达成一致？</i></p>
										<p>经常通过多个提供程序来实现服务冗余。这样就可以在提供程序之间提供负载平衡和故障转移功能，从而使得协调程序的服务体验更为一致和可靠。冗余可以通过多次部署同一服务实现来实现。不过，当不同的供应商部署了不同的提供程序时，服务几乎肯定具有不同的实现。尽管如此，对于协调程序，所有提供程序的全部实现的工作方式都必须一致，以便协调程序可以采用可交换的方式来调用提供程序。服务的不同实现（特别是来自不同供应商的不同实现）是由不同的团队开发的，而这些团队必须加以协调，以确保开发的是相同的服务。</p>
										<p>因此，第三个问题就是：<i>多个提供程序团队如何实现相同的服务，以确保他们的实现具有兼容性？</i></p>
										<p>以上是使用 SOA 进行开发的主要问题。必须实现尚未开发的服务来开发协调程序，协调程序团队和提供程序团队必须就服务如何工作达成一致，而且，多个提供程序团队也必须就服务如何工作达成一致。如果没有良好的流程，这就会导致一片混乱，如果不对其进行检查，将会导致 SOA 项目失败。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center"> <br /></td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/#main">
																												<b> </b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N100A1">
														<span class="atitle">
																<font face="Arial" size="4">SOA 开发流程</font>
														</span>
												</a>
										</p>
										<p>下面给出用于对协调程序和提供程序团队进行同步的简单流程，以帮助确保可重用服务以及使用这些服务的应用程序能够成功地进行开发：</p>
										<ol>
												<li>使用服务用例描述服务。 
</li>
												<li>开发体现服务用例的服务测试。 
</li>
												<li>开发通过服务测试的服务模拟。 
</li>
												<li>提供程序团队采用服务模拟作为原型，并将服务测试作为要求，从而实现服务。 
</li>
												<li>协调程序团队将服务测试作为服务使用者可以进行的工作的示例，并在实际的服务仍然处于开发过程的同时使用服务模拟对其代码进行测试。 </li>
										</ol>
										<p>这个简单的流程处理了以下问题：如何确定服务的范围以及如何保持团队的一致性和高效率，从而避免发生意外。公正地说，还有许多其他问题仍然没有通过此流程得到解决。该流程并没有涉及服务自身如何开发或协调应用程序如何开发的问题。它并不涉及服务的质量问题（即服务的可靠性问题），而是只定义服务如何提供必要的行为。该流程总体上也不处理传统独立应用程序如何使用 SOA 重新进行体系结构设计，以及如何发现或设计服务。所有这些问题都是必要的，但其并不在此流程的范围之内。</p>
										<p>此流程使协调应用程序和服务实现协同工作，并允许团队以相当独立的方式同时对这两个部分进行开发。这并非 SOA 项目所需的全部内容，但却是一个不错的起点。</p>
										<p>为了说明此流程，我将讨论如何实现一个简单服务。它就是大家都喜欢用的服务示例，即股票报价服务。为了让内容更丰富一些，我提供了以下三种类型的信息：</p>
										<ol>
												<li>简单的当前价格报价 
</li>
												<li>包含当前价格、当日最高价和最低价以及当天交易量的复杂报价 
</li>
												<li>包含过去某天的复杂报价的历史报价 </li>
										</ol>
										<p>此示例应该足以阐释该流程的工作过程。</p>
										<p>
												<a name="N100D3">
														<span class="atitle">
																<font face="Arial" size="4">服务用例</font>
														</span>
												</a>
										</p>
										<p>此 SOA 开发流程中的第一步是开发描述服务的服务用例。</p>
										<p>Alistair Cockburn 将<i>用例</i> 定义为“系统涉众之间有关系统的行为的协定”（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/#resources"><font color="#996699">参考资料</font></a>部分列出的 <i>Writing Effective Use Cases</i>）。用例必须适合所定义的系统范围，能够代表此情况下使用系统的主要参与者的观点，且能够在一致的抽象层次上表示参与者的系统使用情况。</p>
										<p>Alistair 给出的一个例子是网上的股票购买服务，其中，购买者使用与股票代理的网站协同工作的个人金融应用程序来购买股票。系统范围既包含金融应用程序，又包含代理的网站。购买者是主要的参与者。抽象级别为应用程序和网站之间的交互，而不是应用程序或网站内的详细信息。用例将描述主要成功方案（购买者根据这些方案购买股票）和一些可能出现错误的扩展。</p>
										<p>因此，用例是关于以下内容的文本描述：希望系统如何工作、将涉及到哪些人以及他们之间如何交互、系统在正常运行时如何工作，以及出现错误时应该如何处理。它关心的是系统将<i>做什么</i>，而不考虑将<i>如何</i> 实现。</p>
										<p>现在，假定所讨论的不是系统或应用程序，而是一个 SOA 服务。用例技术仍然适用。可以采用此技术来描述服务使用者与服务提供程序如何进行交互，说明服务做<i>什么</i> 而不用描述其<i>如何</i> 实现。<i>服务用例</i> 的最初草稿应将重点放在服务的行为上。由于这是必须调用的服务，因此后面的用例草稿还应该指定调用协议——将用于调用服务的技术、传输和数据格式。（用例纯粹主义者甚至可能说协议不属于用例的实现细节，他们是对的。但服务用例不仅描述服务，而且还要描述如何调用该服务，因此协议是使用者和提供程序参与者之间的协定的一部分，必须在某个地方加以指定。）</p>
										<p>因此，开发用例的第一步是对服务完成的操作进行充分的描述。此描述代表了使用者对提供程序必须提供的行为的要求，主要由协调程序开发团队创建，但同样以提供程序开发团队提供的输出为基础。这两种类型的开发团队必须对用例满意才行，因为这些用例是对所有团队开发其负责的应用程序部分的要求。</p>
										<p>服务不仅要在条件良好的情况下正常工作，而且还要能够恰当地处理出现错误的情况，这非常重要。因此，您的服务用例应该对错误情况和服务无法成功处理的错误输入加以处理。其中很多错误路径最终都表现为用例的备用路径。其他错误场景也可能非常极端，因而需要各自的错误用例。在这两种方法中，用例都必须记录服务如何像成功路径一样全面地处理错误。</p>
										<p>
												<a name="N10107">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">示例用例</font>
																</strong>
														</span>
												</a>
										</p>
										<p>例如，让我们看看股票报价示例的服务用例。它需要做三件事，因此需要以下三个服务用例：</p>
										<ol>
												<li>
														<b>简单报价：</b>使用者传入股票代码；提供程序返回指定的股票的当前价格。 
</li>
												<li>
														<b>复杂报价：</b>使用者传入股票代码；提供程序返回指定股票的当前价格，当前的最高价格、最低价格以及交易量。 
</li>
												<li>
														<b>历史报价：</b>使用者传入股票代码和日期；提供程序返回指定股票和日期的复杂报价。 </li>
										</ol>
										<p>即便对于这样的简单示例，仍然需要确定很多问题并将其添加到用例中，如下所示：</p>
										<ul>
												<li>如果股票代码无效，或者提供程序所属的交易所不支持该股票，该如何处理？ 
</li>
												<li>应该为价格使用何种格式？浮点数可能存在舍入误差。小数更为准确，但不标准。字符串效率较低，但更为明确。 
</li>
												<li>应该为复杂报价使用何种格式？逗号分隔值？数组？对象？XML 文档？SOAP 响应？ 
</li>
												<li>如果所请求的日期是当日或将来的时间，该如何处理？如果日期是过去的某个市场不开放的日期，该如何处理？对于交易所尚未开始进行股票交易的日期该如何处理？如果日期过早，而不存在相关记录了，该如何处理？如果股票代码或交易从那以后发生了变化，又该如何处理？ </li>
										</ul>
										<p>即使开发本文中的简单用例也不简单。用例非常麻烦，必须考虑周全才能圆满地完成开发工作。此时的细心工作是非常不错的一项投资；利用好的服务用例可以开发良好的服务测试和服务模拟，从而帮助开发团队正常进行开发工作。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center"> <br /></td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/#main">
																												<b> </b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10137">
														<span class="atitle">
																<font face="Arial" size="4">服务测试</font>
														</span>
												</a>
										</p>
										<p>此 SOA 开发流程的第二步是开发服务测试，以将用例系统编写为可执行格式。仅当服务恰当地实现了用例时，测试才能通过。</p>
										<p>Kent Beck 指出，<i>测试</i> 应该是自动而独立的，而且应该对可能出现问题的部分进行检查（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/#resources"><font color="#996699">参考资料</font></a>部分，以获得有关他的书籍 <i>Extreme Programming Explained</i> 和 <i>Test Driven Development</i> 的信息）。测试——通过测试开发工作软件——是 Beck 称为极限编程 (XP) 的方法所包含的十二项实践之一。它是测试驱动的开发 (TDD) 的核心——如果您只能遵循一个实践，该如何执行 XP 呢？当采用 XP 和 TDD 时，将首先开发测试，然后开发软件以通过测试，接着重复这些步骤，直到软件足够完善为止。</p>
										<p>应该测试什么？测试的概念源于许多地方，但用例是测试的最佳来源。用例文本和关系图描述用户对需求的理解。测试以更明确的方式表述这种理解，并以可靠和重复执行的代码加以表示。用例和测试是面向不同的受众（人和计算机）以不同形式表示相同内容的对等项。</p>
										<p>服务用例的<i>服务测试</i> 没有什么不同，不过更多地将其看作功能测试，而不是单元测试。服务测试不会验证服务如何实现；提供程序开发团队可以自行实现此用途的单元测试。服务测试验证服务是否提供了服务用例认为其应该提供的行为。这些测试还需要对错误路径进行测试。</p>
										<p>测试将最终定义服务的期望接口。此接口通常为 Web 服务的 Web 服务描述语言（Web Services Description Language，WSDL）文件、Java 接口或 Java 组件的 EJB 远程接口等等。如果首先开发接口，然后根据接口实现测试，可能会看起来更简单，不过更直接的方法是首先开发测试，然后开发接口，以使测试能够成功编译。</p>
										<p>
												<a name="code-hd">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">示例服务测试</font>
																</strong>
														</span>
												</a>
										</p>
										<p>可以使用简单的单元测试框架（JUnit 或 Cactus）来开发测试。该框架将充当服务的使用者，并进行使用者将进行的操作。下面是一些可能的测试：</p>
										<ul>
												<li>使用 <i>IBM</i> 调用 <code>simple quote </code>，以验证获得的结果是“$100.00”。 
</li>
												<li>使用 <i>MSFT</i> 调用 <code>simple quote</code>，以验证获得的结果是“$30.00”。 
</li>
												<li>使用 <i>BOGUS</i> 调用 <code>simple quote</code>，以验证获得的结果是 <code>invalid stock symbol</code> 错误。 </li>
										</ul>
										<p>对复杂报价和历史报价的测试将与此类似。另外，还有针对可能的基础结构错误的测试，如远程异常和 HTTP 400 错误。最后，测试应该对服务用例中指定的所有内容进行验证；如果在用例中指定了操作，但却不在一个或多个测试中进行检查，则意味着使用者不能期望提供程序将实际执行该操作。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center"> <br /></td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/#main">
																												<b> </b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="code-hd">
														<span class="atitle">
																<font face="Arial" size="4">服务模拟</font>
														</span>
												</a>
										</p>
										<p>此 SOA 开发流程的第三步是开发服务模拟——通过服务测试的模拟对象。这些服务模拟是实际服务提供程序的简单原型。</p>
										<p>Kent Beck 将<i>模拟对象</i> 描述为测试对象，该对象可以使用常量进行响应，从而实现开销大或复杂的资源的模仿版本。例如，模拟数据库是一个简单对象，但具有数据库的 API，可以接受一些已知的 SQL 字符串，并为每个字符串返回一组固定的结果。模拟对象允许您对组件进行测试，而不必依赖于外部资源。</p>
										<p>现在假定此外部资源是一个 SOA 服务。如果您的组件使用该服务，则测试此组件时也在测试该服务。如果服务工作不正常，或者不可用，则即使组件工作正常，测试也会失败。如果服务很慢（通过网络远程调用服务时就是这样），您的测试也会运行得很慢——这样就不能如您所愿频繁地运行测试了。而且，如果服务尚未实现，则根本就不能对您的组件进行测试。</p>
										<p>因此，一个不错的方法就是开发服务模拟，模拟对象是实际服务的简单仿真程序。服务具有与实际服务相同的 API；它会实现针对服务测试而开发的接口。服务模拟应该如何工作？它应该通过您已经开发的服务测试，这表明模拟真的和实际服务的工作方式一样。</p>
										<p>在某些情况下，服务模拟实际上比实际服务更适合用于进行测试工作。假定您的组件使用返回股票报价的服务。如果传入代码 <i>IBM</i>，您将获得什么样的结果呢？$50？$100？$150？具体取决于当前的股票价格，但这是测试的一个“鸡与蛋”问题。通过使用服务模拟，已硬编码的模拟将始终返回 $100，然后据此进行测试，与测试实际服务相比，这实际上更加可靠。</p>
										<p>谁开发服务模拟？提供程序团队（而非协调程序团队）应该开发服务模拟。服务模拟表示提供程序团队计划实际实现的内容的简单实现。如果相同的服务有多个提供程序团队，则他们必须进行协调，以产生一个他们都认可的模拟服务。</p>
										<p>
												<a name="code-hd">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">示例服务模拟</font>
																</strong>
														</span>
												</a>
										</p>
										<p>此示例服务模拟需要通过我前面编写的示例服务测试。因此，它的简单报价实现是一个 case 语句。如果服务只是一个传统 Java 对象（plain old Java object，POJO），则对应的模拟将为通用接口的特殊实现，如下所示：</p>
										<br />
										<a name="list1">
												<b>清单 1：作为通用接口的特殊实现的服务模拟</b>
										</a>
										<br />
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
																						<font face="Lucida Console">public class StockQuoteMock implements StockQuoteService
</font>
																				</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>简单报价则将为 StockQuoteService 中声明的一个方法，并在 StockQuoteMock 实现如下方法：</p>
										<br />
										<a name="list1">
												<b>清单 2：在 StockQuoteService 中声明并在 StockQuoteMock 中实现的简单报价方法</b>
										</a>
										<br />
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
																						<font face="Lucida Console">public String getSimpleQuote(String symbol) throws InvalidSymbolException {
	if (symbol == null) throw new InvalidSymbolException(symbol);
	if (symbol.equals("IBM")) return "$100.00";
	if (symbol.equals("MSFT")) return "$30.00";
	if (symbol.equals("BOGUS")) throw new InvalidSymbolException(symbol);
	throw new InvalidSymbolException(symbol);
}
</font>
																				</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>如果服务更复杂（如无状态会话 Bean 或 SOAP Web 服务），此 POJO 代码仍然可以作为更复杂的模拟实现的基础。在任何情况下，模拟实现肯定都不应该试图处理每个可能的股票代码或访问具有实时数据的数据库。模拟实现应该足以通过服务测试即可。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center"> <br /></td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/#main">
																												<b> </b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="code-hd">
														<span class="atitle">
																<font face="Arial" size="4">提供程序开发</font>
														</span>
												</a>
										</p>
										<p>此 SOA 开发流程的第四步是由提供程序开发团队实现通过服务测试的服务。</p>
										<p>此时，提供程序团队已经准备好，可以进行服务开发了。既然他们还没有开始实现服务，怎么可能进行服务开发呢？幸运的是，他们已经开发了描述服务应如何工作的服务用例，开发人员就是开发人员，他们已经开始考虑如何实现服务了。开发人员已经创建了服务测试，这些测试可说明服务的 API 是什么，并帮助演示服务的行为。他们已经开发了服务模拟，这些模拟是表示实际服务将如何工作的快速原型。 </p>
										<p>因此，开发人员已经非常明确如何实现服务，只是尚未实现其相关的任何代码而已。</p>
										<p>这几乎是毫无疑问的，但开发人员实现的服务必须通过服务测试。他们如何知道自己已经完成服务实现工作了呢？当服务通过了所有测试后，服务就已完全实现了。在开发期间，团队的开发活动可能会让他们添加要测试的其他功能。训练有素的团队不会放弃这些想法，而将对其进行捕获并添加到服务的测试集中。服务实现也必须通过这些测试。提供程序团队还应该向其他提供程序团队和协调程序团队通报这些添加的测试，以便所有团队的测试集保持同步。</p>
										<p>理想的情况下，提供程序团队将可以成功地实现通过测试的服务，而不必修改已达成一致的测试。不过，这经常被证明是不切实际的。当开发人员实现服务时，他们有时会发现需要更改服务的接口或行为。如果服务测试的质量良好，而开发人员更改了服务的工作方式，则测试就不能再通过了。为了使测试仍然有效，开发人员必须修改测试，使其可以验证新的设计。更改测试意味着服务模拟现在将不能通过测试，因此也必须对其进行更改，以实际模拟服务现在的工作方式。</p>
										<p>如果提供程序开发人员更改了服务测试或服务模拟，他们需要尽快通知协调程序开发人员和该服务的任何其他提供程序的开发人员。任何使用旧测试和模拟的人员都在根据一个现在已经过时的协议进行开发，因此各个团队需要根据新测试和模拟进行同步。如果其他团队拒绝接受新测试和模拟，则重新同步的工作就变成了团队之间的重新协商点。他们仍然有希望就服务用例达成一致，以从此处继续开展工作，从而开发一组一致认可的测试和模拟。</p>
										<p>
												<a name="code-hd">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">示例提供程序实现</font>
																</strong>
														</span>
												</a>
										</p>
										<p>提供程序开发团队将开发实现 <code>StockQuoteService</code> 的类或组件，其工作方式与 <code>StockQuoteMock</code> 类似，并使股票报价测试能够通过。模拟是一个包含硬编码响应的简单对象，而此提供程序是提供实际行为的组件。该实现应该执行以下操作：</p>
										<ul>
												<li>支持所有有效股票代码（至少支持提供程序的股票交易中涉及到的所有股票）。 
</li>
												<li>确保使用包含所支持股票的实时价格的数据库。 
</li>
												<li>将数据库使用的价格格式转换为服务返回的格式。 
</li>
												<li>将数据库针对无效代码的输入结果（如空查询结果）转换为服务希望的错误。 
</li>
												<li>实现服务的协议，如 EJB 远程接口、HTTP Web 服务或 JMS 请求和答复消息。 </li>
										</ul>
										<p>由于模拟和实际提供程序实现相同的接口——在此例中为 Java 接口 <code>StockQuoteService</code>，因此服务测试可以使用两个实现中的任何一个；只要使用要实例化的正确类对测试进行配置即可。为了运行测试，您还需要使用测试期望的股票价格对数据库进行配置。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center"> <br /></td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/#main">
																												<b> </b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="code-hd">
														<span class="atitle">
																<font face="Arial" size="4">协调程序开发</font>
														</span>
												</a>
										</p>
										<p>此 SOA 开发流程的第五步是由协调程序开发团队实现使用服务的应用程序。在实际服务实现就绪之前，应用程序都将使用服务模拟。</p>
										<p>此时，由于具有大量的服务模拟，因此协调程序团队可以继续进行其相关工作，就像已经实现并提供了服务提供程序一样。而且，协调程序团队不仅具有一组可以使用的服务（也就是模拟），而且也有了可以演示服务如何工作的和客户机如何使用服务的一组测试。该团队可以将这些测试作为可以如何实现其协调程序的简单原型使用。和提供程序团队一样，尽管尚未实现任何代码，但协调程序开发团队已经早就在进行协调程序的工作了。</p>
										<p>理想情况下，协调程序团队将可以使用达成一致的服务模拟来成功地实现他们的协调程序。不过有时候这样做有些困难。模拟并不提供某些需要的行为或希望的接口。协调程序客户还需要比模拟提供的服务更细粒度的服务。如果服务协调程序需要其他功能，则可以尝试自行实现此功能。如果协调程序需要不同的接口，则可以尝试实现一个适配器，来将其所希望的接口转换为模拟实现的接口。如果协调程序希望更细粒度的功能，则该团队需要对模拟及其测试进行修改。</p>
										<p>这些更改会使得有必要重新与提供程序团队进行同步。让我们假定协调程序团队实现了额外的功能或不同的接口来提高服务的可用性。如果添加的行为不是特定于协调程序，而是会涉及到服务，则添加的行为可以潜在地由其他服务使用者重用。因此应将其内置到提供程序中。提供程序所需的更改可以也应该建模为对模拟及其测试的更改。当协调程序团队必须修改模拟及其测试时——既可能是为了增强其他功能也可能是为了对功能进行进一步细化——必须将这些更改应用到提供程序和其他所有的工作内容。已更改的模拟和测试成为协调程序团队、提供程序团队以及其他协调程序提供团队之间的重新协商点。他们必须针对达成一致的一组新模拟和测试重新进行同步。</p>
										<p>
												<a name="code-hd">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">示例协调程序实现</font>
																</strong>
														</span>
												</a>
										</p>
										<p>协调程序开发团队将实现一个委托给 <code>StockQuoteService</code> 的实现的客户端组件。它的行为将与服务测试相似，不同的是，它将使用服务类为 GUI 或客户端应用程序提供真正的功能。协调程序实现只能使用 <code>StockQuoteService</code> 中经服务测试证明可用的功能。Java 编译器将确保协调程序代码只能调用服务接口声明的方法；保持协调程序实现与测试实现的一致可以确保服务按预期的要求工作。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center"> <br /></td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/#main">
																												<b> </b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="code-hd">
														<span class="atitle">
																<font face="Arial" size="4">将流程组合起来 </font>
														</span>
												</a>
										</p>
										<p>那么，该流程在实践中是如何工作的呢？</p>
										<p>第一步，开发服务用例。服务用例团队可以包括来自提供程序团队和协调程序团队的代表。或者，这个团队可以仅由那些专门进行需求收集和用例开发的分析人员组成。传统用例开发主要关注人们如何使用应用程序，而这个团队必须将重点放在组件如何集成上。他们不应关心提供程序将如何实现，也不用考虑协调程序可以如何实现。相反，他们应将重点放在服务是什么、它们完成什么工作以及如何对其进行调用上。</p>
										<p>第二步，将服务用例编写为服务测试。用例是人可读的，而服务测试表示相同的需求，但采用的却是计算机可执行的方式。这些测试必须由开发人员实现，而不是由开发用例的分析人员实现。测试开发人员可以是提供程序团队和协调程序团队的成员，也可以是可用且有能力实现测试的人员。在最终确定测试之前，每个团队的代表都必须对其进行认可，从而表示所有团队已就其达成了一致，而不考虑谁开发了哪个测试。</p>
										<p>第三步，开发通过测试的服务模拟。开发测试的团体通常也实现模拟。模拟证明测试可以通过，作为原型供提供程序团队使用，并支持协调程序团队继续进行开发。与测试一样，除非所有团队都认可模拟并表示同意，否则就不能认为已最终确定了模拟。换句话说，任何团队都不能强制别的团队接受一组测试和模拟，大家必须一致认可，否则迟早会出现混乱。</p>
										<p>第四步，提供程序团队部署提供程序，这些提供程序的行为与模拟相似，且均已通过了测试。如果将这些提供程序添加到测试和模拟，尤其是在更改了测试和模拟的情况下，则他们必须分发这些更改，以便其他团队重新进行同步。他们不能强制让其他团队接受这些修改；所有团队必须就此达成一致。</p>
										<p>第五步，协调程序团队必须使用模拟开发可以正常工作的协调程序。如果需要更改模拟，他们还需要对测试进行更新。他们需要随后将其更改分发给其他组，所有的团队必须找到一个大家都认可的点——一组共同的测试和模拟，并据此重新进行同步。</p>
										<p>这些步骤一起的确可以形成一个简单的开发流程。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center"> <br /></td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/#main">
																												<b> </b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="code-hd">
														<span class="atitle">
																<font face="Arial" size="4">解决 SOA 问题</font>
														</span>
												</a>
										</p>
										<p>那么，这个流程是否解决了我在本文开始时提出的问题？</p>
										<p>1. 如果某些提供程序尚未开发，则协调程序团队如何开发其负责的应用程序部分？</p>
										<p>模拟解决了此问题。模拟可以快速地进行开发。虽然实际提供程序的开发需要更长的时间，但协调程序团队可以使用模拟同步开发协调程序。只要满足了以下条件，此工作就可以顺利地进行：</p>
										<ol>
												<li>模拟的功能全面，即意味着其编写的测试和用例也全面。 
</li>
												<li>没有团队必须更改模拟。只要某个团队必须对模拟进行更改，他们就应该在进一步脱离同步之前尽可能快地重新进行同步。 </li>
										</ol>
										<p>2. 协调程序团队和提供程序团队如何较早而可靠地就服务如何工作达成一致？</p>
										<p>因为测试和模拟可以快速进行开发，而且它们是真正可以运行的实际代码，所以提供了早期验证，从而可以确保用例有意义，并且团队真的达成了一致。有了经验后，可以在前期投入更多的精力，以确保测试和模拟的全面性，这些构件需要更改的几率越小，剩下的开发过程中需要重新进行同步的几率也就越小。</p>
										<p>3. 实现相同服务的多个提供程序团队如何能确保他们的实现是兼容的？</p>
										<p>一组公共测试以及通过这些测试的模拟可以作为公共参考框架使用，以确保独立的提供程序实现始终兼容且可互换。早期的测试越前面，需要更改的几率就越小，从而团队需要重新同步的情况也就越少。</p>
										<p>这样一来，该流程就解决了多个团队实现 SOA 的不同部分时所面临的主要问题。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center"> <br /></td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-mocks/#main">
																												<b> </b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="code-hd">
														<span class="atitle">
																<font face="Arial" size="4">结束语</font>
														</span>
												</a>
										</p>
										<p>本文讨论了以下内容：</p>
										<ul>
												<li>在尝试使用 SOA 开发应用程序时，并行的独立团队可能遇到的常见开发问题。 
</li>
												<li>一个简单的五步开发流程，该流程通过使用服务用例、服务测试和服务模拟解决了这些问题。 </li>
										</ul>
										<p>您可以将此流程应用到您的组织中，从而大幅度提高使用 SOA 进行开发的成功几率。</p>
										<p> </p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/8718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-06-19 18:54 <a href="http://www.cppblog.com/zhangji198543/archive/2006/06/19/8718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6月7日-----用例建模指南</title><link>http://www.cppblog.com/zhangji198543/archive/2006/06/07/8228.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Tue, 06 Jun 2006 16:19:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/06/07/8228.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/8228.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/06/07/8228.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/8228.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/8228.html</trackback:ping><description><![CDATA[
		<blockquote>用例(Use Case)是一种描述系统需求的方法，使用用例的方法来描述系统需求的过程就是用例建模。用例方法最早是由Iva Jackboson博士提出的，后来被综合到UML规范之中，成为一种标准化的需求表述体系。用例的使用在RUP中被推崇备至，整个RUP流程都被称作是"用例驱动"(Use-Case Driven)的，各种类型的开发活动包括项目管理、分析设计、测试、实现等都是以系统用例为主要输入工件，用例模型奠定了整个系统软件开发的基础。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N10036">
						<span class="atitle">
								<font face="Arial" size="4">1. 什么是用例？</font>
						</span>
				</a>
		</p>
		<p>在介始用例方法之前，我们首先来看一下传统的需求表述方式-"软件需求规约"(Software Requirement Specification)。传统的软件需求规约基本上采用的是功能分解的方式来描述系统功能，在这种表述方式中，系统功能被分解到各个系统功能模块中，我们通过描述细分的系统模块的功能来达到描述整个系统功能的目的。一个典型的软件需求规约可能具有以下形式：</p>
		<br />
		<img height="294" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/1.gif" width="315" border="0" />
		<br />
		<p>采用这种方法来描述系统需求，非常容易混淆需求和设计的界限，这样的表述实际上已经包含了部分的设计在内。由此常常导致这样的迷惑：系统需求应该详细到何种程度？一个极端就是需求可以详细到概要设计，因为这样的需求表述既包含了外部需求也包含了内部设计。在有些公司的开发流程中，这种需求被称为"内部需求"，而对应于用户的原始要求则被称之为"外部需求"。</p>
		<p>功能分解方法的另一个缺点是这种方法分割了各项系统功能的应用环境，从各项功能项入手，你很难了解到这些功能项是如何相互关联来实现一个完成的系统服务的。所以在传统的SRS文档中，我们往往需要另外一些章节来描述系统的整体结构及各部分之间的相互关联，这些内容使得SRS需求更象是一个设计文档。</p>
		<p>
				<a name="N10056">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1.1 参与者和用例</font>
								</strong>
						</span>
				</a>
		</p>
		<p>从用户的角度来看，他们并不想了解系统的内部结构和设计，他们所关心的是系统所能提供的服务，也就是被开发出来的系统将是如何被使用的，这就用例方法的基本思想。用例模型主要由以下模型元素构成：</p>
		<ul>
				<li>参与者(Actor) <br />参与者是指存在于被定义系统外部并与该系统发生交互的人或其他系统，他们代表的是系统的使用者或使用环境。 
</li>
				<li>用例(Use Case) <br />用例用于表示系统所提供的服务，它定义了系统是如何被参与者所使用的，它描述的是参与者为了使用系统所提供的某一完整功能而与系统之间发生的一段对话。 
</li>
				<li>通讯关联(Communication Association) <br />通讯关联用于表示参与者和用例之间的对应关系，它表示参与者使用了系统中的哪些服务（用例），或者说系统所提供的服务（用例）是被哪些参与者所使用的。 </li>
		</ul>
		<p>这大三种模型元素在UML中的表述如下图所示。</p>
		<br />
		<img height="89" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image006.gif" width="341" border="0" />
		<br />
		<p>以银行自动提款机(ATM)为例，它的主要功能可以由下面的用例图来表示。ATM的主要使用者是银行客户，客户主要使用自动提款机来进行银行帐户的查询、提款和转帐交易。</p>
		<br />
		<img height="230" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image008.gif" width="261" border="0" />
		<br />
		<p>通讯关联表示的是参与者和用例之间的关系，箭头表示在这一关系中哪一方是对话的主动发起者，箭头所指方是对话的被动接受者；如果你不想强调对话中的主动与被动关系，可以使用不带箭头的关联实线。在参与者和用例之间的信息流不是由通讯关联来表示的，该信息流是缺省存在的（用例本身描述的就是参与者和系统之间的对话），并且信息流向是双向的，它与通讯关联箭头所指的方向亳无关系。</p>
		<p>
				<a name="N1009C">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1.2 用例的内容</font>
								</strong>
						</span>
				</a>
		</p>
		<p>用例图使我们对系统的功能有了一个整体的认知，我们可以知道有哪些参与者会与系统发生交互，每一个参与者需要系统为它提供什么样的服务。用例描述的是参与者与系统之间的对话，但是这个对话的细节并没有在用例图中表述出来，针对每一个用例我们可以用事件流来描述这一对话的细节内容。如在ATM系统中的"提款"用例可以用事件流表述如下：</p>
		<p>提款-基本事件流</p>
		<p>1. 用户插入信用卡</p>
		<p>2. 输入密码</p>
		<p>3. 输入提款金额</p>
		<p>4. 提取现金</p>
		<p>5. 退出系统，取回信用卡</p>
		<p>但是这只描述了提款用例中最顺利的一种情况，作为一个实用的系统，我们还必须考虑可能发生的各种其他情况，如信用卡无效、输入密码错、用户帐号中的现金余额不够等，所有这些可能发生的各种情况（包括正常的和异常的）被称之为用例的场景(Scenario)，场景也被称作是用例的实例(Instance)。在用例的各种场景中，最常见的场景是用基本流(Basic Flow)来描述的，其他的场景则是用备选流(Alternative Flow)来描述。对于ATM系统中的"提款"用例，我们可以得到如下一些备选流：</p>
		<p>提款-备选事件流</p>
		<p>备选流一：用户可以在基本流中的任何一步选择退出，转至基本流步骤5。</p>
		<p>备选流二：在基本流步骤1中，用户插入无效信用卡，系统显示错误并退出信用卡，用例结束。</p>
		<p>备选流三：在基本流步骤２中，用户输入错误密码，系统显示错误并提示用户重新输入密码，重新回到基本流步骤2；三次输入密码错误后，信用卡被系统没收，用例结束。</p>
		<p>…</p>
		<p>通过基本流与备选流的组合，就可以将用例所有可能发生的各种场景全部描述清楚。我们在描述用例的事件流的时候，就是要尽可能地将所有可能的场景都描述出来，以保证需求的完备性。</p>
		<p>
				<a name="N100CC">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1.3 用例方法的优点</font>
								</strong>
						</span>
				</a>
		</p>
		<p>用例方法完全是站在用户的角度上（从系统的外部）来描述系统的功能的。在用例方法中，我们把被定义系统看作是一个黑箱，我们并不关心系统内部是如何完成它所提供的功能的。用例方法首先描述了被定义系统有哪些外部使用者（抽象成为Actor），这些使用者与被定义系统发生交互；针对每一参与者，用例方法又描述了系统为这些参与者提供了什么样的服务（抽象成为Use Case），或者说系统是如何被这些参与者使用的。所以从用例图中，我们可以得到对于被定义系统的一个总体印象。</p>
		<p>与传统的功能分解方式相比，用例方法完全是从外部来定义系统的功能，它把需求与设计完全分离开来。在面向对象的分析设计方法中，用例模型主要用于表述系统的功能性需求，系统的设计主要由对象模型来记录表述。另外，用例定义了系统功能的使用环境与上下文，每一个用例描述的是一个完整的系统服务。用例方法比传统的SRS更易于被用户所理解，它可以作为开发人员和用户之间针对系统需求进行沟通的一个有效手段。</p>
		<p>在RUP中，用例被作为整个软件开发流程的基础，很多类型的开发活动都把用例作为一个主要的输入工件(Artifact)，如项目管理、分析设计、测试等。根据用例来对目标系统进行测试，可以根据用例中所描述的环境和上下文来完整地测试一个系统服务，可以根据用例的各个场景(Scenario)来设计测试用例，完全地测试用例的各种场景可以保证测试的完备性。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/#main">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100DB">
						<span class="atitle">
								<font face="Arial" size="4">2. 建立用例模型</font>
						</span>
				</a>
		</p>
		<p>使用用例的方法来描述系统的功能需求的过程就是用例建模，用例模型主要包括以下两部分内容：</p>
		<ul>
				<li>用例图(Use Case Diagram) <br />确定系统中所包含的参与者、用例和两者之间的对应关系，用例图描述的是关于系统功能的一个概述。 
</li>
				<li>用例规约(Use Case Specification) <br />针对每一个用例都应该有一个用例规约文档与之相对应，该文档描述用例的细节内容。 </li>
		</ul>
		<p>在用例建模的过程中，我们建议的步聚是先找出参与者，再根据参与者确定每个参与者相关的用例，最后再细化每一个用例的用例规约。</p>
		<p>
				<a name="N100F4">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2.1 寻找参与者</font>
								</strong>
						</span>
				</a>
		</p>
		<p>所谓的参与者是指所有存在于系统外部并与系统进行交互的人或其他系统。通俗地讲，参与者就是我们所要定义系统的使用者。寻找参与者可以从以下问题入手：</p>
		<ul>
				<li>系统开发完成之后，有哪些人会使用这个系统？ 
</li>
				<li>系统需要从哪些人或其他系统中获得数据？ 
</li>
				<li>系统会为哪些人或其他系统提供数据？ 
</li>
				<li>系统会与哪些其他系统相关联？ 
</li>
				<li>系统是由谁来维护和管理的？ </li>
		</ul>
		<p>这些问题有助于我们抽象出系统的参与者。对于ATM机的例子，回答这些问题可以使我们找到更多的参与者：操作员负责维护和管理ATM机系统、ATM机也需要与后台服务器进行通讯以获得有关用户帐号的相关信息。</p>
		<br />
		<img height="178" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image010.gif" width="456" border="0" />
		<br />
		<p>
				<b>2.1.1 系统边界决定了参与者</b>
		</p>
		<p>参与者是由系统的边界所决定的，如果我们所要定义的系统边界仅限于ATM机本身，那么后台服务器就是一个外部的系统，可以抽象为一个参与者。</p>
		<br />
		<img height="91" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image012.gif" width="341" border="0" />
		<br />
		<p>如果我们所要定义的系统边界扩大至整个银行系统，ATM机和后台服务器都是整个银行系统的一部分，这时候后台服务器就不再被抽象成为一个参与者。</p>
		<br />
		<img height="104" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image014.gif" width="370" border="0" />
		<br />
		<p>值得注意的是，用例建模时不要将一些系统的组成结构作为参与者来进行抽象，如在ATM机系统中，打印机只是系统的一个组成部分，不应将它抽象成一个独立的参与者；在一个MIS管理系统中，数据库系统往往只作为系统的一个组成部分，一般不将其单独抽象成一个参与者。</p>
		<p>
				<b>2.1.2 特殊的参与者――系统时钟</b>
		</p>
		<p>有时候我们需要在系统内部定时地执行一些操作，如检测系统资源使用情况、定期地生成统计报表等等。从表面上看，这些操作并不是由外部的人或系统触发的，应该怎样用用例方法来表述这一类功能需求呢？对于这种情况，我们可以抽象出一个系统时钟或定时器参与者，利用该参与者来触发这一类定时操作。从逻辑上，这一参与者应该被理解成是系统外部的，由它来触发系统所提供的用例对话。</p>
		<br />
		<img height="88" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image016.gif" width="262" border="0" />
		<br />
		<p>
				<a name="N1016E">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2.2 确定用例</font>
								</strong>
						</span>
				</a>
		</p>
		<p>找到参与者之后，我们就可以根据参与者来确定系统的用例，主要是看各参与者需要系统提供什么样的服务，或者说参与者是如何使用系统的。寻找用例可以从以下问题入手（针对每一个参与者）：</p>
		<ul>
				<li>参与者为什么要使用该系统？ 
</li>
				<li>参与者是否会在系统中创建、修改、删除、访问、存储数据？如果是的话，参与者又是如何来完成这些操作的？ 
</li>
				<li>参与者是否会将外部的某些事件通知给该系统？ 
</li>
				<li>系统是否会将内部的某些事件通知该参与者？ </li>
		</ul>
		<p>综合以上所述，ATM系统的用例图可表示如下，</p>
		<br />
		<img height="279" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image018.gif" width="403" border="0" />
		<br />
		<p>在用例的抽取过程中，必须注意：用例必须是由某一个主角触发而产生的活动，即每个用例至少应该涉及一个主角。如果存在与主角不进行交互的用例，就可以考虑将其并入其他用例；或者是检查该用例相对应的参与者是否被遗漏，如果是，则补上该参与者。反之，每个参与者也必须至少涉及到一个用例，如果发现有不与任何用例相关联的参与者存在，就应该考虑该参与者是如何与系统发生对话的，或者由参与者确定一个新的用例，或者该参与者是一个多余的模型元素，应该将其删除。</p>
		<p>可视化建模的主要目的之一就是要增强团队的沟通，用例模型必须是易于理解的。用例建模往往是一个团队开发的过程，系统分析员在建模过程中必须注意参与者和用例的名称应该符合一定的命名约定，这样整个用例模型才能够符合一定的风格。如参与者的名称一般都是名词，用例名称一般都是动宾词组等。</p>
		<p>对于同一个系统，不同的人对于参与者和用例都可能有不同的抽象结果，因而得到不同的用例模型。我们需要在多个用例模型方案中选择一种"最佳"（或"较佳"）的结果，一个好的用例模型应该能够容易被不同的涉众所理解，并且不同的涉众对于同一用例模型的理解应该是一致的。</p>
		<p>
				<a name="N101A3">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2.3 描述用例规约</font>
								</strong>
						</span>
				</a>
		</p>
		<p>应该避免这样一种误解――认为由参与者和用例构成的用例图就是用例模型，用例图只是在总体上大致描述了系统所能提供的各种服务，让我们对于系统的功能有一个总体的认识。除此之外，我们还需要描述每一个有例的详细信息，这些信息包含在用例规约中，用例模型是由用例图和每一个用例的详细描述――用例规约所组成的。RUP中提供了用例规约的模板，每一个用例的用例规约都应该包含以下内容：</p>
		<ul>
				<li>简要说明 (Brief Description) <br />简要介绍该用例的作用和目的。 
</li>
				<li>事件流 (Flow of Event) <br />包括基本流和备选流，事件流应该表示出所有的场景。 
</li>
				<li>用例场景 (Use-Case Scenario) <br />包括成功场景和失败场景，场景主要是由基本流和备选流组合而成的。 
</li>
				<li>特殊需求 (Special Requirement) <br />描述与该用例相关的非功能性需求（包括性能、可靠性、可用性和可扩展性等）和设计约束（所使用的操作系统、开发工具等）。 
</li>
				<li>前置条件 (Pre-Condition) <br />执行用例之前系统必须所处的状态。 
</li>
				<li>后置条件 (Post-Condition) <br />用例执行完毕后系统可能处于的一组状态。 </li>
		</ul>
		<p>用例规约基本上是用文本方式来表述的，为了更加清晰地描述事件流，也可以选择使用状态图、活动图或序列图来辅助说明。只要有助于表达的简洁明了，就可以在用例中任意粘贴用户界面和流程的图形化显示方式，或是其他图形。如活动图有助于描述复杂的决策流程，状态转移图有助于描述与状态相关的系统行为，序列图适合于描述基于时间顺序的消息传递。</p>
		<p>
				<b>2.3.1 基本流</b>
		</p>
		<p>基本流描述的是该用例最正常的一种场景，在基本流中系统执行一系列活动步骤来响应参与者提出的服务请求。我们建议用以下格式来描述基本流：</p>
		<p>1) 每一个步骤都需要用数字编号以清楚地标明步骤的先后顺序。</p>
		<p>2) 用一句简短的标题来概括每一步骤的主要内容，这样阅读者可以通过浏览标题来快速地了解用例的主要步骤。在用例建模的早期，我们也只需要描述到事件流步骤标题这一层，以免过早地陷入到用例描述的细节中去。</p>
		<p>3) 当整个用例模型基本稳定之后，我们再针对每一步骤详细描述参与者和系统之间所发生的交互。建议采用双向(roundtrip)描述法来保证描述的完整性，即每一步骤都需要从正反两个方面来描述:(1)参与者向系统提交了什么信息；(2)对此系统有什么样的响应。具体例子请参见附录。</p>
		<p>在描述参与者和系统之间的信息交换时，需指出来回传递的具体信息。例如，只表述参与者输入了客户信息就不够明确，最好明确地说参与者输入了客户姓名和地址。通常可以利用词汇表让用例的复杂性保持在可控范围内，可以在词汇表中定义客户信息等内容，使用例不至于陷入过多的细节。</p>
		<p>
				<b>2.3.2 备选流</b>
		</p>
		<p>备选流负责描述用例执行过程中异常的或偶尔发生的一些情况，备选流和基本流的组合应该能够覆盖该用例所有可能发生的场景。在描述备选流时，应该包括以下几个要素：</p>
		<p>1) 起点：该备选流从事件流的哪一步开始；</p>
		<p>2) 条件：在什么条件下会触发该备选流；</p>
		<p>3) 动作：系统在该备选流下会采取哪些动作；</p>
		<p>4) 恢复：该备选流结束之后，该用例应如何继续执行。</p>
		<p>备选流的描述格式可以与基本流的格式一致，也需要编号并以标题概述其内容，编号前可以加以字母前缀A(Alternative)以示与基本流步骤相区别。</p>
		<p>
				<b>2.3.3 用例场景</b>
		</p>
		<p>用例在实际执行的时候会有很多的不同情况发生，称之为用例场景；也可以说场景是用例的实例，我们在描述用例的时候要覆盖所有的用例场景，否则就有可能导致需求的遗漏。在用例规约中，场景的描述可以由基本流和备选流的组合来表示。场景既可以帮助我们防止需求的遗漏，同时也可以对后续的开发工作起到很大的帮助：开发人员必须实现所有的场景、测试人员可以根据用例场景来设计测试用例。</p>
		<p>
				<b>2.3.4 特殊需求</b>
		</p>
		<p>特殊需求通常是非功能性需求，它为一个用例所专有，但不适合在用例的事件流文本中进行说明。特殊需求的例子包括法律或法规方面的需求、应用程序标准和所构建系统的质量属性（包括可用性、可靠性、性能或支持性需求等）。此外，其他一些设计约束，如操作系统及环境、兼容性需求等，也可以在此节中记录。</p>
		<p>需要注意的是，这里记录的是专属于该用例的特殊需求；对于一些全局的非功能性需求和设计约束，它们并不是该用例所专有的，应把它们记录在《补充规约》中。</p>
		<p>
				<b>2.3.5 前置和后置条件</b>
		</p>
		<p>前置条件是执行用例之前必须存在的系统状态，后置条件是用例一执行完毕后系统可能处于的一组状态。</p>
		<p>
				<a name="N1021B">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2.4 检查用例模型</font>
								</strong>
						</span>
				</a>
		</p>
		<p>用例模型完成之后，可以对用例模型进行检查，看看是否有遗漏或错误之处。主要可以从以下几个方面来进行检查：</p>
		<ul>
				<li>功能需求的完备性 <br />现有的用例模型是否完整地描述了系统功能，这也是我们判断用例建模工作是否结束的标志。如果发现还有系统功能没有被记录在现有的用例模型中，那么我们就需要抽象一些新的用例来记录这些需求，或是将他们归纳在一些现有的用例之中。 
</li>
				<li>模型是否易于理解 <br />用例模型最大的优点就在于它应该易于被不同的涉众所理解，因而用例建模最主要的指导原则就是它的可理解性。用例的粒度、个数以及模型元素之间的关系复杂程度都应该由该指导原则决定。 
</li>
				<li>是否存在不一致性 <br />系统的用例模型是由多个系统分析员协同完成的，模型本身也是由多个工件所组成的，所以我们要特别注意不同工件之前是否存在前后矛盾或冲突的地方，避免在模型内部产生不一致性。不一致性会直接影响到需求定义的准确性。 
</li>
				<li>避免二义性语义 <br />好的需求定义应该是无二义性的，即不同的人对于同一需求的理解应该是一致的。在用例规约的描述中，应该避免定义含义模糊的需求，即无二义性。 </li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/#main">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1023B">
						<span class="atitle">
								<font face="Arial" size="4">3. 系统需求</font>
						</span>
				</a>
		</p>
		<p>RUP中根据FURPS+模型将系统需求分为以下几类：</p>
		<ul>
				<li>功能(Functionality) 
</li>
				<li>可用性(Usability) 
</li>
				<li>可靠性(Reliability) 
</li>
				<li>性能(Performance) 
</li>
				<li>可支持性(Supportability) 
</li>
				<li>设计约束等 </li>
		</ul>
		<p>除了第一项功能性需求之外的其他需求都归之为非功能性需求。</p>
		<p>
				<a name="N1025C">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3.1 需求工件集</font>
								</strong>
						</span>
				</a>
		</p>
		<p>用例模型主要用于描述系统的功能性需求，对于其他的非功能性需要用其他文档来记录。RUP中定义了如下的需求工件集合。</p>
		<ul>
				<li>用例模型：记录功能性需求 
<ul><li>用例图：描述参与者和用例之间的关系 
</li><li>用例规约：描述每一个用例的细节信息 </li></ul></li>
				<li>补充规约：记录一些全局性的功能需求、非功能性需求和设计约束等 
</li>
				<li>词汇表：记录一些系统需求相关的术语 </li>
		</ul>
		<p>在实际应用中，除了这些工件之外，我们还可以根据实际需求灵活选用其他形式的文档来补充说明需求。并不是所有的系统需求都适保合用用例模型来描述的，如编译器，我们很难用用例方法来表述它所处理的语言的方法规则，在这种情况下，采用传统的BNF范式来表述更加合适一些。在电信软件行业中，很多电信标准都是采用SDL语言来描述的，我们也不必用UML来改写这些标准（UML对SDL存在着这样的兼容性），只需将SDL形式的电信标准作为需求工件之一，在其他工件中对其加以引用就可以了。总之，万万不可拘泥于用例建模的形式，应灵活运用各种方式的长处。</p>
		<p>
				<a name="N1027D">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3.2 补充规约</font>
								</strong>
						</span>
				</a>
		</p>
		<p>补充规约记录那些在用例模型中不易表述的系统需求，主要包括以下内容。</p>
		<ul>
				<li>功能性 <br />功能性需求主要在用例模型中刻画，但是也有部分需求不适合在用例中表述。有些功能性需求是全局性的，适用于所有的用例，如出错处理、I18N支持等，我们不需要在所有的用例中描述这些功能性需求，只需要在补充规约中统一描述就可以了。 
</li>
				<li>可用性 <br />记录所有可用性相关的需求，如系统的使用者所需要的培训时间、是否应附合一些常见的可用性标准如Windows界面风格等。 
</li>
				<li>可靠性 <br />定义系统可靠性相关的各种指标，包括： <br /><ul><li>可用性：指出可用时间百分比(xx.xx%)，系统处于使用、维护、降级模式等操作的小时数； 
</li><li>平均故障间隔时间(MTBF)：通常表示为小时数，但也可表示为天数、月数或年数； 
</li><li>平均修复时间(MTTR)：系统在发生故障后可以暂停运行的时间； 
</li><li>精确度：指出系统输出要求具备的精密度（分辨率）和精确度（按照某一已知的标准）； 
</li><li>最高错误或缺陷率：通常表示为bugs/KLOC（每千行代码的错误数目）或bugs/function-point（每个功能点的错误数目）。 </li></ul></li>
				<li>性能 <br />记录系统性能相关的各种指标，包括： <br /><ul><li>对事务的响应时间（平均、最长）； 
</li><li>吞吐量（例如每秒处理的事务数）； 
</li><li>容量（例如系统可以容纳的客户或事务数）； 
</li><li>降级模式（当系统以某种形式降级时可接受的运行模式）； 
</li><li>资源利用情况：内存、磁盘、通信等。 </li></ul></li>
				<li>可支持性 <br />定义所有与系统的可支持性或可维护性相关的需求，其中包括编码标准、命名约定、类库、如何来对系统进行维护操作和相应的维护实用工具等。 
</li>
				<li>设计约束 <br />设计约束代表已经批准并必须遵循的设计决定，其中包括软件开发流程、开发工具、系统构架、编程语言、第三方构件类库、运行平台和数据库系统等等。 </li>
		</ul>
		<p>
				<a name="N102CF">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3.3 词汇表</font>
								</strong>
						</span>
				</a>
		</p>
		<p>词汇表主要用于定义项目特定的术语，它有助于开发人员对项目中所用的术语有统一的理解和使用，它也是后续阶段中进行对象抽象的基础。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/#main">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N102D8">
						<span class="atitle">
								<font face="Arial" size="4">4. 调整用例模型</font>
						</span>
				</a>
		</p>
		<p>在一般的用例图中，我们只表述参与者和用例之间的关系，即它们之间的通讯关联。除此之外，我们还可以描述参与者与参与者之间的泛化(generalization)、用例和用例之间的包含(include)、扩展(extend)和泛化(generalization)关系。我们利用这些关系来调整已有的用例模型，把一些公共的信息抽取出来重用，使得用例模型更易于维护。但是在应用中要小心选用这些关系，一般来说这些关系都会增加用例和关系的个数，从而增加用例模型的复杂度。而且一般都是在用例模型完成之后才对用例模型进行调整，所以在用例建模的初期不必要急于抽象用例之间的关系。</p>
		<p>
				<a name="N102E1">
						<span class="smalltitle">
								<strong>
										<font face="Arial">4.1 参与者之间的关系</font>
								</strong>
						</span>
				</a>
		</p>
		<p>参与者之间可以有泛化(Generalization)关系（或称为"继承"关系）。例如在需求分析中常见的权限控制问题（如下图所示），一般的用户只可以使用一些常规的操作，而管理员除了常规操作之外还需要进行一些系统管理工作，操作员既可以进行常规操作又可以进行一些配置操作。</p>
		<br />
		<img height="271" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image020.gif" width="289" border="0" />
		<br />
		<p>在这个例子中我们会发现管理员和操作员都是一种特殊的用户，他们拥有普通用户所拥有的全部权限，此外他们还有自己独有的权限。这里我们可进一步把普通用户和管理员、操作员之间的关系抽象成泛化(Generalization)关系，管理员和操作员可以继承普通用户的全部特性（包括权限），他们又可以有自己独有的特性（如操作、权限等）。这样可以显著减速少用例图中通讯关联的个数，简化用例模型，使之更易于理解。</p>
		<br />
		<img height="270" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image022.gif" width="325" border="0" />
		<br />
		<p>
				<a name="N1030F">
						<span class="smalltitle">
								<strong>
										<font face="Arial">4.2 用例之间的关系</font>
								</strong>
						</span>
				</a>
		</p>
		<p>用例描述的是系统外部可见的行为，是系统为某一个或几个参与者提供的一段完整的服务。从原则上来讲，用例之间都是并列的，它们之间并不存在着包含从属关系。但是从保证用例模型的可维护性和一致性角度来看，我们可以在用例之间抽象出包含(include)、扩展(extend)和泛化(generalization)这几种关系。这几种关系都是从现有的用例中抽取出公共的那部分信息，然后通后过不同的方法来重用这部公共信息，以减少模型维护的工作量。</p>
		<p>
				<b>4.2.1 包含(include)</b>
		</p>
		<p>包含关系是通过在关联关系上应用&lt;&lt;include&gt;&gt;构造型来表示的，如下图所示。它所表示的语义是指基础用例(Base)会用到被包含用例(Inclusion)，具体地讲，就是将被包含用例的事件流插入到基础用例的事件流中。</p>
		<br />
		<img height="80" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image024.gif" width="393" border="0" />
		<br />
		<p>包含关系是UML1.3中的表述，在UML1.1中，同等语义的关系被表述为使用(uses)，如下图。</p>
		<br />
		<img height="67" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image026.gif" width="333" border="0" />
		<br />
		<p>在ATM机中，如果查询、取现、转帐这三个用例都需要打印一个回执给客户，我们就可以把打印回执这一部分内容提取出来，抽象成为一个单独的用例"打印回执"，而原有的查询、取现、转帐三个例都会包含这个用例。每当以后要对打印回执部分的需求进行修改时，就只需要改动一个用例，而不用在每一个用例都作相应修改，这样就提高了用例模型的可维护性。</p>
		<br />
		<img height="229" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image028.gif" width="417" border="0" />
		<br />
		<p>在基础用例的事件流中，我们只需要引用被包含用例即可。</p>
		<p>查询-基本事件流</p>
		<p>1. 用户插入信用卡</p>
		<p>2. 输入密码</p>
		<p>3. 选择查询</p>
		<p>4. 查看帐号余额</p>
		<p>5. 包含用例"打印回执"</p>
		<p>6. 退出系统，取回信用卡</p>
		<p>在这个例子中，多个用例需要用到同一段行为，我们可以把这段共同的行为单独抽象成为一个用例，然后让其他的用例来包含这一用例。从而避免在多个用例中重复性地描述同一段行为，也可以防止该段行为在多个用例中的描述出现不一致性。当需要修改这段公共的需求时，我们也只需要修改一个用例，避免同时修改多个用例而产生的不一致性和重复性工作。</p>
		<p>有时当某一个用例的事件流过于复杂时，为了简化用例的描述，我们也可以把某一段事件流抽象成为一个被包含的用例。这种情况类似于在过程设计语言中，将程序的某一段算法封装成一个子过程，然后再从主程序中调用这一子过程。</p>
		<p>
				<b>4.2.2 扩展(extend)</b>
		</p>
		<p>扩展（extend）关系如下图所示，基础用例(Base)中定义有一至多个已命名的扩展点，扩展关系是指将扩展用例(Extension)的事件流在一定的条件下按照相应的扩展点插入到基础用例(Base)中。对于包含关系而言，子用例中的事件流是一定插入到基础用例中去的，并且插入点只有一个。而扩展关系可以根据一定的条件来决定是否将扩展用例的事件流插入基础用例事件流，并且插入点可以有多个。</p>
		<br />
		<img height="66" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image030.gif" width="327" border="0" />
		<br />
		<p>例如对于电话业务，可以在基本通话(Call)业务上扩展出一些增值业务如：呼叫等待(Call Waiting)和呼叫转移(Call Transfer)。我们可以用扩展关系将这些业务的用例模型描述如下。</p>
		<br />
		<img height="159" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image032.gif" width="356" border="0" />
		<br />
		<br />
		<img height="250" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/2.jpg" width="637" border="0" />
		<br />
		<p>在这个例子中，呼叫等待和呼叫转移都是对基本通话用例的扩展，但是这两个用例只有在一定的条件下（如应答方正忙或应答方无应答）才会将被扩展用例的事件流嵌入基本通话用例的扩展点，并重用基本通话用例中的事件流。</p>
		<p>值得注意的是扩展用例的事件流往往可以也可抽象为基础用例的备选流，如上例中的呼叫等待和呼叫转移都可以作为基本通话用例的备选流而存在。但是基本通话用例已经是一个很复杂的用例了，选用扩展关系将增值业务抽象成为单独的用例可以避免基础用例过于复杂，并且把一些可选的操作独立封装在另外的用例中。</p>
		<p>
				<b>4.2.3 泛化(generalization)</b>
		</p>
		<p>当多个用例共同拥有一种类似的结构和行为的时候，我们可以将它们的共性抽象成为父用例，其他的用例作为泛化关系中的子用例。在用例的泛化关系中，子用例是父用例的一种特殊形式，子用例继承了父用例所有的结构、行为和关系。在实际应用中很少使用泛化关系，子用例中的特殊行为都可以作为父用例中的备选流存在。</p>
		<br />
		<img height="148" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image034.gif" width="299" border="0" />
		<br />
		<p>以下是一个用例泛化关系的例子，执行交易是一种交易抽象，执行房产交易和执行证券交易都是一种特殊的交易形式。</p>
		<p>用例泛化关系中的事件流示例如下：</p>
		<br />
		<img height="312" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/3.gif" width="637" border="0" />
		<br />
		<p>
				<a name="N103EE">
						<span class="smalltitle">
								<strong>
										<font face="Arial">4.3 调整用例模型</font>
								</strong>
						</span>
				</a>
		</p>
		<p>用例模型建成之后，我们可以对用例模型进行检视，看是否可以进一步简化用例模型、提高重用程度、增加模型的可维护性。主要可以从以下检查点(checkpoints)入手:</p>
		<ul>
				<li>用例之间是否相互独立？如果两个用例总是以同样的顺序被激活，可能需要将它们合并为一个用例。 
</li>
				<li>多个用例之间是否有非常相似的行为或事件流？如果有，可以考虑将它们合并为一个用例。 
</li>
				<li>用例事件流的一部分是否已被构建为另一个用例？如果是，可以让该用例包含(include)另一用例。 
</li>
				<li>是否应该将一个用例的事件流插入另一个用例的事件流中？如果是，利用与另一个用例的扩展关系(extend)来建立此模型。 </li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/#main">
																				<b>回页首</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10406">
						<span class="atitle">
								<font face="Arial" size="4">5. 管理用例模型复杂度</font>
						</span>
				</a>
		</p>
		<p>一般小型的系统，其用例模型中包含的参与者和用例不会太多，一个用例图就可以容纳所有的参与者，所有的参与者和用例也可以并存于同一个层次结构中。对于较复杂的大中型系统，用例模型中的参与者和用例会大大增加，我们需要一些方法来有效地管理由于规模上升而造成的复杂度。</p>
		<p>
				<a name="N1040F">
						<span class="smalltitle">
								<strong>
										<font face="Arial">5.1 用例包</font>
								</strong>
						</span>
				</a>
		</p>
		<p>包(Package)是UML中最常用的管理模型复杂度的机制，包也是UML中语义最简单的一种模型元素，它就是一种容器，在包中可以容纳其他任意的模型元素（包括其他的包）。在用例模型中，我们可以用构造型(Sterotype)&lt;&lt;use case&gt;&gt;来扩展标准UML包的语义，这种新的包叫作用例包(Use Case Package)，用于分类管理用例模型中的模型元素。</p>
		<p>我们可以根据参与者和用例的特性来对它们进行分类，分别置于不同的用例包管理之下。例如对于一个大型的企业管理信息系统，我们可以根据参与者和用例的内容将它们分别归于人力资源、财务、采购、销售、客务服务这些用例包之下。这样我们将整个用例模型划分成为两个层次，在第一层次我们看到的是系统功能总共分为五部分，在第二层次我们可以分别看到每一用例包内部的参与者和用例。</p>
		<br />
		<img height="192" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image038.gif" width="272" border="0" />
		<br />
		<p>一个用例模型需要有多少个用例包取决你想怎么样来管理用例模型的复杂度（包括参与者和用例的个数，以及它们之间的相互关系）。UML中的包其实就类似于文件系统中的目录，文件数量少的时候不需要额外的目录，文件数量一多就需要有多个目录来分类管理，同样一组文件不同的人会创建不同的目录结构来进行管理，关键是要保证在目录结构下每一个文件都要易于访问。同样的道理存在于用例建模之中，如何创建用例包以及用例包的个数取决于不同的系统和系统分析员，但要保证整个用例模型易于理解。</p>
		<p>
				<a name="N1042F">
						<span class="smalltitle">
								<strong>
										<font face="Arial">5.2 用例的粒度</font>
								</strong>
						</span>
				</a>
		</p>
		<p>我的系统需要有多少个用例？这是很多人在用例建模时会产生的疑惑。描述同一个系统，不同的人会产生不同的用例模型。例如对于各种系统中常见的"维护用户"用例，它里面包含了添加用户、修改用户信息、删除用户等操作，这些操作在该用例的事件流可以表述成为基本流的子事件流(subflow)。</p>
		<br />
		<img height="88" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image040.gif" width="288" border="0" />
		<br />
		<p>维护用户-基本事件流</p>
		<p>该基本流由三个子事件流构成：</p>
		<p>1) 添加用户子事件流 <br />… </p>
		<p>2) 修改用户 子事件流 <br />… </p>
		<p>3) 删除用户子事件流 <br />… </p>
		<p>但是你也可以根据该用例中的具体操作把它抽象成为三个用例，它所表示的系统需求和单个用例的模型是完全一样的。</p>
		<br />
		<img height="189" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image042.gif" width="300" border="0" />
		<br />
		<p>应该如何确定用例的粒度呢？在一次技术研讨会上，有人问起Ivar Jacoboson博士，一个系统需要有多少个用例？大师的回答是20个，当然他的意思是最好将用例模型的规模控制在几十个用例左右，这样比较容易来管理用例模型的复杂度。在用例个数大致确定的条件下，我们就很容易来确定用例粒度的大小。对于较复杂的系统，我们需要控制用例模型一级的复杂度，所以可以将复杂度适当地移往每一个用例的内部，也就是让一个用例包含较多的需求信息量。对于比较简单的系统，我们则可以将复杂度适度地曝露在模型一级，也就是我们可以将较复杂的用例分解成为多个用例。</p>
		<p>用例的粒度不但决定了用例模型级的复杂度，而且也决定了每一个用例内部的复杂度。我们应该根据每个系统的具体情况，因时因宜地来把握各个层次的复杂度，在尽可能保证整个用例模型的易理解性前提下决定用例的大小和数目。</p>
		<p>
				<a name="N10478">
						<span class="smalltitle">
								<strong>
										<font face="Arial">5.3 用例图</font>
								</strong>
						</span>
				</a>
		</p>
		<p>用例图的主要作用是描述参与者和用例之间的关系，简单的系统中只需要有一个用例图就可以把所有的关系都描述清楚。复杂的系统中可以有多个用例图，例如每个用例包都可以有一个独立的用例图来描述该用例包中所有的参与者和用例的关系。</p>
		<p>在一个用例模型中，如果参与者和用例之间存在着多对多的关系，并且他们之间的关系比较复杂，如果在同一个用例图中表述所有的参与者和用例就显得不够清晰，这时我们可创建多个用例图来分别表示各种关系。</p>
		<br />
		<img height="265" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image044.gif" width="406" border="0" />
		<br />
		<p>如果想要强调某一个参与者和多个用例的关系，你就可以以该参与者为中心，用一个用例图表述出该参与者和多个用例之间的关系。在这个用例图中，我们强调的是该参与者会使用系统所提供的哪些服务。</p>
		<br />
		<img height="228" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image046.gif" width="308" border="0" />
		<br />
		<p>如果想要强调某一个用例和多个参与者之间的关系，你就可以以该用例为中心，用一个用例图表述出该用例和多个参与者之间的关系。在这个用例图中，我们强调的是该用例会涉及到哪些参与者，或者说该用例所表示的系统服务有哪些使用者。</p>
		<br />
		<img height="203" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image048.gif" width="369" border="0" />
		<br />
		<p>总之在用例建模过程中，你可以根据自己的需要创建任意多个用例图，用不同的用例来强调参与者和用例之间不同的关系。但是最重要的是要考虑整个用例模型的可理解性，如果可以用一个用例图把意思表述清楚，就不要再用第二个，因为越是简洁的模型越易于理解。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/8228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-06-07 00:19 <a href="http://www.cppblog.com/zhangji198543/archive/2006/06/07/8228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6月6日-----对SCA的理解清晰了一些了</title><link>http://www.cppblog.com/zhangji198543/archive/2006/06/06/8224.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Tue, 06 Jun 2006 13:03:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/06/06/8224.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/8224.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/06/06/8224.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/8224.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/8224.html</trackback:ping><description><![CDATA[看完了一些资料，对SCA的理解清晰了一些了。<br />SCA Module是包装SCA Component的，SCA Module上有对外的接口（这个接口可以是Java的，也可以是WSDL的），而且SCA Module可以放在WPS上进行测试，WPS上有自己设定的一些UI来帮助测试。如果有JSP之类的东西要访问SCA Component的话，要在SCA Module中建立一个StandAlone reference，之后JSP就通过StandAlone reference访问SCA Component。<br />SCA Component可以有多种实现方法，包括Java,Human Task,BPEL,Business rules等。比如业务流程中有5个服务，那么我们就可以建立6个SCA Module，其中的一个SCA Module中的SCA Component是用BPEL实现的，BPEL连接的5个业务模块是靠调用另5个SCA Module中的SCA Component来实现。而这5个SCA Component可以是不同的实现方法，比如分别为：Java,Business rules,Java,Human Task,Business rules。这样就可以实现一种面向服务的开发。每个SCA Component中可能包括1个或者多个再细分的服务，这就依情况而定了。<br /><br />呵呵，希望理解的到位一些了。<img src ="http://www.cppblog.com/zhangji198543/aggbug/8224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-06-06 21:03 <a href="http://www.cppblog.com/zhangji198543/archive/2006/06/06/8224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6月1日-----在WPS中用human task manager来实现对第三方Service的异步调用</title><link>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8036.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Thu, 01 Jun 2006 09:02:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8036.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/8036.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/8036.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/8036.html</trackback:ping><description><![CDATA[
		<p>
				<a name="IDAWCKDB">
						<span class="atitle">
								<font face="Arial" size="4">一、 引言</font>
						</span>
				</a>
		</p>
		<p>在developerWorks中，有许多文章介绍了WPS和WID在流程整合中的应用，比如BPEL开发、CEI监控和selector等等，那么，在实际的应用中，通常会有这样的场景：流程调用的一些第三方系统都是需要人工去审批，流程引擎发出调用第三方系统的请求后，是一个需要人审批的长流程（Long-runing process）。因此，这个调用是一个异步调用，只有第三方系统把审批结果传回给主流程，流程才能继续往下运行。这和直接在BPEL中直接实现的human task节点是不同的，因为用到了SCA组件的装配技术。</p>
		<p>本文将详细介绍如何在WPS中利用SCA的编程模型实现human task manager对第三方系统的调用，并通过实际的例子加以说明，使读者能够掌握使用SCA和human task manager来实现对第三方系统的异步调用。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="IDA3CKDB">
						<span class="atitle">
								<font face="Arial" size="4">二、产品及其基本技术框架简介</font>
						</span>
				</a>
		</p>
		<p>
				<a name="IDACDKDB">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1 WebSphere Process Server及其开发工具Integration Developer</font>
								</strong>
						</span>
				</a>
		</p>
		<p>WebSphere Process Server V 6.0（WebSphere流程服务器V 6.0）基于SOA体系架构并提供了统一的、简化的编程模型，是新一代的业务流程服务器，能够帮助我们基于SOA架构模型实现企业的业务流程转型。WebSphere流程服务器采用基于开放标准的技术来整合业务流程，实现自动化的流程服务器。采用WebSphere流程服务器可以通过统一的编程模型将企业的人员、工作流程、应用、系统、平台和基础设施整合在一起。</p>
		<p>基于Eclipse技术的WPS专用开发工具WebSphere Integration Developer V6.0则为快速组装、开发业务解决方案提供了新一代的开发工具。采用这一工具可以基于统一的编程模型通过BPEL（Business Process Execution Language， 业务流程执行语言）来描述各类流程。它易于使用，仅需要少量的相关技能即可使用，并且提供了开发、测试和将应用部署到流程服务器的功能。</p>
		<p>
				<a name="IDAJDKDB">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2 基本技术实现框架</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<strong>2.1 SCA(服务组件编程架构模型)</strong>
		</p>
		<p>为了使客户能够更加简单的实现向这种面向服务架构的转变，IBM在推出一系列WebSphere新产品的同时，提出了一种新的服务组件模型。这是一种全新的、跟语言无关的编程模型，它提供了一种统一的调用方式，从而使得客户可以把不同的组件类型，比如POJO, EJB, 流程组件，人工交互组件等都可以通过一种标准的接口来封装和调用。结合SDO的数据模型，这种服务组件的编程模型可以大大的简化客户的编程，提高应用的灵活性，这就是面向服务组件的架构（Service Component Architecture，SCA）。</p>
		<p>
				<b>2.2 human task</b>
		</p>
		<p>WPS V6中的人工任务管理器（Human Task Manager）模块实现了与人工任务相关的下列功能:</p>
		<ul>
				<li>让用户启动业务流程或者其他Service 组件 
</li>
				<li>实现业务流程中的Staff活动 
</li>
				<li>流程管理(Administration) 
</li>
				<li>动态创建含有与人工或者Service交互的任务</li>
		</ul>
		<p>人工任务管理器针对三种基本场景：机器-人(Machine-to-Human)，人-机器(Human-to-Machine)，和人-人（Human-to-Human）。相应的，人工任务有四种不同类型，见下图。</p>
		<br />
		<a name="IDA1DKDB">
				<b>图: 人工任务管理器</b>
		</a>
		<br />
		<img height="334" alt="图: 人工任务管理器" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/images/image001.jpg" width="554" border="0" />
		<br />
		<p>其中，机器-人场景中的人工任务（participants）是我们这篇文章要主要介绍的，它使流程调用的service的执行中能融入人工交互，典型的例子是一个业务流程为参与业务执行的人创建任务。pTask是一个标准的SCA 组件，可以被用在任何希望引入人工交互的应用中而不仅仅是业务流程。</p>
		<p>与其他工作流类的流程整合解决方案不同，WPS中引入了基于SCA service的人工任务，用户可以灵活地替换系统中基于SCA service的自动service和真正的人工实现。</p>
		<p>
				<b>2.3 Interface开发</b>
		</p>
		<p>在下面的实例中，我们是根据需求来确定出出第三方系统与主流程调用的接口（硬连接的方式），而在企业级应用中，也可以通过实施IBM WebSphere Message Broker来作为连接的应用接口，帮助WPS来连接企业应用。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="IDANEKDB">
						<span class="atitle">
								<font face="Arial" size="4">三、样例背景及解决方案概述</font>
						</span>
				</a>
		</p>
		<p>
				<b>3.1 方案背景</b>
		</p>
		<p>许多公司在不同时期都开发了企业内部的审批系统，某个部门内部的业务都各自有独立的系统来进行审批，而有的业务需要不同部门合作，那就只有通过人工来审批，手续相当繁琐，效率也不高。而为某项业务重新开发新的工作流引擎，又舍不得以前的IT投资，因此，企业就有了这样的需求：能否有这样的流程控制器可以将不同部门的独立系统统一的利用起来，实现跨系统的易更改工作流呢？</p>
		<p>在我们这篇文章所举的范例中，是一个基于BPEL的审批流程，其中涉及到财务系统，项目管理系统2个独立的系统。其中财务系统是由Deiphi + OCX控件实现的，由SQL server存储数据；项目管理系统是一个J2EE系统，用DB2 数据库存储数据。</p>
		<p>在需求中，项目管理系统必须依赖于财务系统才能进行审核等操作，需要把财务系统的数据传给项目管理系统，适当的时候，项目管理系统也要把相关数据传给财务系统。在此基础上，客户还可能有更高的需求，他们不但想要有流程的整合，还要有门户的整合，信息的整合。</p>
		<p>
				<b>3.2 IBM的解决方案</b>
		</p>
		<p>用WebSphere Process Server来做流程的整合，需要在不同的节点上完成与Deiphi和J2EE系统的异步调用，同时用Portal来做门户和信息的整合，并配置SSO， 用户只需要在Portal进行一次登陆，就可以相应的访问WPS系统、财务系统（DEiphi）、项目管理系统(J2EE)。相应用户登陆后可以看到自己的任务列表，如预算编制，项目建立，项目审批等。用户点击相应的任务，通过human task接口直接可以访问到第三方的系统，由第三方的系统得到与任务有关的数据，并直接组织数据发送给WPS.他们之间的通信方式是在SOAP协议上传输XML数据。</p>
		<p>
				<b>3.3 可行性分析</b>
		</p>
		<p>在WPS的装配图里可以实现的是，第三方的系统只需要提供一个接口，WPS就可以以异步或同步方式来访问组件。此需求里，客户要在系统里首先能看到自己的任务列表，点击不同的任务来决定到那个系统去。如客户任务列表里有一项的任务是"预算编制"，用户一点击"预算编制"，在Portal的另一个iframe就应把财务系统的相应界面调出来。Deiphi根据TaskID到WPS上把相应的数据取到本地并进行处理，用户进行适当的操作以后，Deiphi再把相应的数据发送给WPS，此过程可如下图所示：</p>
		<br />
		<a name="IDA4EKDB">
				<b>图：HumantaskManager调用第三方系统流程</b>
		</a>
		<br />
		<img height="415" alt="图：HumantaskManager调用第三方系统流程" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/images/image003.jpg" width="553" border="0" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="IDALFKDB">
						<span class="atitle">
								<font face="Arial" size="4">四、解决方案开发</font>
						</span>
				</a>
		</p>
		<p>这一章将论述实现这个解决方案的每一个大的步骤，但并不详细论述如何step by step的实现，比如怎样定义BO,定义接口等，他们已超出了本次主题。因此，本文的读者必须对WID和WPS有一定的了解。</p>
		<p>
				<b>4．1 定义BO</b>
		</p>
		<p>BO是工作流平台与外界进行数据交互的数据格式，第一步我们首先明确工作流平台与第三方系统进行数据交互的定义，根据业务流程的需要，在每一个流程节点，第三方系统需要向WPS工作流平台放入哪些数据项，想要从工作流平台得到什么数据，都要定义出来。 如下图所示：</p>
		<p>在BPEL每次调用第三方系统时，必须前期将输入输出的参数确定。主流程传出业务数据对象（BO），第三方系统接受后，进入自己的子流程，通过人工处理，将主流程需要的参数也以BO的方式传递给主流程，使流程能够继续运行。</p>
		<p>在我们的例子中，主流程与2个子系统每次交互中，我们都定义了两个BO作为数据输入输出的数据格式，分别是OperationNameIN和OperationNameOut。在下图中，对应"编制预算"这个操作，我们分别定义2个BO，即BudgetBuildIn和BudgetBuildOut.</p>
		<br />
		<a name="IDAXFKDB">
				<b>图：定义BO</b>
		</a>
		<br />
		<img height="269" alt="图：定义BO" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/images/image005.jpg" width="540" border="0" />
		<br />
		<p>
				<b>4.2 定义接口</b>
		</p>
		<p>这一步需要定义接口，如操作名称，输入数据及输出数据的定义，在WPS的开发流程里，每一个组件如果能在装配图里能被其他的组件所调用，就必须定义接口， Human Task 也不例外。</p>
		<p>每个操作的输入和输出数据（input和output）的数据类型可以用默认的数据类型，如int、boolean等，也可以用我们定义好的BO。在我们的例子中，由于每次与财务系统或者项目管理系统交互时，都是组合数据，因此都用定义好的BO作为数据类型。如下图所示，在BudgetBuild接口中，定义了编制预算的操作：其输入输出的数据类型分别为budgetBuildIn和budgetBuildOut。</p>
		<br />
		<a name="IDAJGKDB">
				<b>图：接口的定义</b>
		</a>
		<br />
		<img height="206" alt="图：接口的定义" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/images/image007.jpg" width="553" border="0" />
		<br />
		<p>
				<b>4.3 流程的具体定义</b>
		</p>
		<p>在Process里我们根据用户的具体业务需求，实现每一个节点，明确每一个节点是与那个系统进行交互的。整个Process有几次invoke，就表明与财务系统和项目管理系统有几次交互，即humantask实现的接口。 </p>
		<br />
		<a name="IDA0GKDB">
				<b>图：设计流程（BPEL）</b>
		</a>
		<br />
		<img height="397" alt="图：设计流程（BPEL）" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/images/image009.jpg" width="554" border="0" />
		<br />
		<p>
				<b>4.4 定义装配图</b>
		</p>
		<p>完成了所有的接口定义以后，我们需要在装配图里把他们都明确的用线连接起来，可以清楚地明确他们之间的调用关系及数据流向。如下图所示，把每个接口都拖入到装配图中，再分别用humantask来实现。最后，再把主流程Process拖到装配图中，通过"Wire to Existing"连接所有组件。</p>
		<br />
		<a name="IDALHKDB">
				<b>图：组件装配SCA</b>
		</a>
		<br />
		<img height="364" alt="图：组件装配SCA" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/images/image011.jpg" width="554" border="0" />
		<br />
		<p>
				<b>4.5 对外export 一个调用接口</b>
		</p>
		<p>所有的第三方系统通过这个component 来访问到WPS工作流平台。我们同样在装配图中建起连接。</p>
		<br />
		<a name="IDA2HKDB">
				<b>图：暴露调用接口（SCA）</b>
		</a>
		<br />
		<img height="261" alt="图：暴露调用接口（SCA）" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/images/image013.jpg" width="527" border="0" />
		<br />
		<p>
				<b>4.6 实现一个统一的调用接口</b>
		</p>
		<p>如图所示，财务系统需要从WPS工作流平台得到与这个任务相关的数据，有人工处理以后，要传回到WPS工作流平台，并complete 这个任务。这里我们实现一个web service, 并对外提供两个接口供所有第三方系统进行调用，如Deilhpi, MQ WorkFlow, J2EE等。</p>
		<p>该webservice的WSDL描述如下：</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">      
  &lt;wsdl:operation name="getHTInput"&gt;
         &lt;wsdlsoap:operation soapAction=""/&gt;
         &lt;wsdl:input name="getHTInputRequest"&gt;
            &lt;wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
			namespace="http://ForMIS.ibm.com" use="encoded"/&gt;
         &lt;/wsdl:input&gt;
         &lt;wsdl:output name="getHTInputResponse"&gt;
            &lt;wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
			namespace="http://ForMIS.ibm.com" use="encoded"/&gt;
         &lt;/wsdl:output&gt;
      &lt;/wsdl:operation&gt;
      &lt;wsdl:operation name="setHTOutput"&gt;
         &lt;wsdlsoap:operation soapAction=""/&gt;
         &lt;wsdl:input name="setHTOutputRequest"&gt;
            &lt;wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
			namespace="http://ForMIS.ibm.com" use="encoded"/&gt;
         &lt;/wsdl:input&gt;
         &lt;wsdl:output name="setHTOutputResponse"&gt;
            &lt;wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
			namespace="http://ForMIS.ibm.com" use="encoded"/&gt;
         &lt;/wsdl:output&gt;
      &lt;/wsdl:operation&gt;
      </font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>实现操作如下所述：</p>
		<p>实现getHTInput operation</p>
		<p>1) 得到HumanTaskManager实例</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">RelationshipService  relService = (RelationshipService) ServiceManager.INSTANCE
			.locateService("com/ibm/wbiserver/rel/RelationshipService");
		InitialContext ctx = new InitialContext();
		Object myObj = ctx.lookup(HTM_MANAGER_NAME);
		HumanTaskManagerHome myHome = (HumanTaskManagerHome) PortableRemoteObject.narrow
		(myObj, com.ibm.task.api.HumanTaskManagerHome.class);
	HumanTaskManager	humanTaskManager = myHome.create();
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>2） 根据taskID得到第三方系统的需要得到的数据</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">   ClientObjectWrapper input = null;
	input = humanTaskManager.getInputMessage(id);
   </font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>实现setOutput operation</p>
		<p>1) 得到HumanTaskManager实例</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">	
RelationshipService  relService = (RelationshipService) ServiceManager.INSTANCE
			.locateService("com/ibm/wbiserver/rel/RelationshipService");
		InitialContext ctx = new InitialContext();
		Object myObj = ctx.lookup(HTM_MANAGER_NAME);
		HumanTaskManagerHome myHome = (HumanTaskManagerHome) PortableRemoteObject.narrow(myObj,
		com.ibm.task.api.HumanTaskManagerHome.class);
	HumanTaskManager	humanTaskManager = myHome.create();
	</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>2) 根据taskID，把第三方上传的数据赋给WPS相应的Human Task</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">ClientObjectWrapper outputWrapper = humanTaskManager.createOutputMessage(id);
					BusObjImpl busObjImpl = (BusObjImpl) outputWrapper
							.getObject();
					busObjImpl.set(0, output);
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>3) 完成这个任务complete</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">humanTaskManager.complete(id,outputWrapper);
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<b>4． 7 试与部署</b>
		</p>
		<p>首先访问Http://localhost:9080/bpc 用bpc explorer进行测试,证明所有的节点都可以走通，就可以部署到WPS服务器上，与Portal及第三方系统（Deilphi, MQ WorkFlow, J2EE）进行互联测试。运行实例演示如下：</p>
		<p>4．7．1 下图是获取任务列表的演示效果：</p>
		<p>登陆系统后，用户将在系统中看到自己的任务列表，点中任务，就可以在下方的portlet中进行信息输入和审批。</p>
		<br />
		<a name="IDAISMUC">
				<b>图：任务列表和任务的人工处理</b>
		</a>
		<br />
		<img height="402" alt="图：任务列表和任务的人工处理" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/images/image015.jpg" width="553" border="0" />
		<br />
		<p>4．7．2． 与Deiphi进行交互的页面</p>
		<br />
		<a name="IDAXSMUC">
				<b>图：调用财务系统处理界面</b>
		</a>
		<br />
		<img height="408" alt="图：调用财务系统处理界面" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/images/image017.jpg" width="531" border="0" />
		<br />
		<p>流程进入财务系统后，将调用财务系统，在OCX控件中进行相应的操作和处理，然后再把流程往下运行所需要的数据再传回给process。</p>
		<p>4．7．3． 与MQ WorkFlow 的交互页面</p>
		<br />
		<a name="IDAHTMUC">
				<b>图：调用项目管理操作界面</b>
		</a>
		<br />
		<img height="392" alt="图：调用项目管理操作界面" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/images/image019.jpg" width="553" border="0" />
		<br />
		<p>与财务系统一样，当流程调用到项目管理系统时，也出现了项目管理所采用的MQ workflow的界面，进行相应处理和审批后，将数据传回给WPS，于是流程就可以继续往下运行。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0604_chenjing/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="IDAVTMUC">
						<span class="atitle">
								<font face="Arial" size="4">五． 结束语</font>
						</span>
				</a>
		</p>
		<p>本篇文章主要讲述了一个解决方案，即如何利用Human Task把第三方系统连接到WPS 里，并实现人工参与及异步通信。这里着重介绍了解决方案的大致步骤，而没有关注于细节的描述。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/8036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-06-01 17:02 <a href="http://www.cppblog.com/zhangji198543/archive/2006/06/01/8036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6月1日-----IBM WebSphere 开发者技术期刊: 使用服务组件体系结构（SCA）构建 SOA 解决方案——第 1 部分</title><link>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8035.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Thu, 01 Jun 2006 09:00:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8035.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/8035.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/8035.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/8035.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 引言														您可能认为，这太棒了，又出现了一个编程模型，但事实并非如此。Web 服务怎么样了？Enterprise JavaBeans 发生了什么？服务组件体系结构 (SCA) 并非要替换任何现有的编程模型或者与其抗衡。相反，SCA 向您提供一个以与技术无关的方式定义接口、实现和引用的模型，从而使您能够将这些元素绑定到所选择的某一技术的特定实现。		例如，我...&nbsp;&nbsp;<a href='http://www.cppblog.com/zhangji198543/archive/2006/06/01/8035.html'>阅读全文</a><img src ="http://www.cppblog.com/zhangji198543/aggbug/8035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-06-01 17:00 <a href="http://www.cppblog.com/zhangji198543/archive/2006/06/01/8035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6月1日-----IBM WebSphere 开发者技术期刊: 使用服务组件体系结构（SCA）构建 SOA 解决方案——第 3 部分</title><link>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8034.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Thu, 01 Jun 2006 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8034.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/8034.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/8034.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/8034.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在本系列的第 1 部分，我们引入了服务组件体系结构作为编程模型来构建和组装集成解决方案，简要介绍了什么是 SCA，以及一些相关术语的定义。在第 2 部分，我们讨论了引用和限定符，并说明了如何将各种组件连接到一起以创建 SCA 模块。在第 3 部分，我们将深入了解构建 SCA 模块的主要好处之一，即能以各种组件为基础垂直构建集成解决方案。		随着系统不断发展而变得更为复杂，有必要将各种解决方案进...&nbsp;&nbsp;<a href='http://www.cppblog.com/zhangji198543/archive/2006/06/01/8034.html'>阅读全文</a><img src ="http://www.cppblog.com/zhangji198543/aggbug/8034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-06-01 16:56 <a href="http://www.cppblog.com/zhangji198543/archive/2006/06/01/8034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6月1日-----SCA（Service Component Architecture）编程模型入门</title><link>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8031.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Thu, 01 Jun 2006 08:52:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8031.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/8031.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/06/01/8031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/8031.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/8031.html</trackback:ping><description><![CDATA[
		<p>
				<a name="N1003A">
						<span class="atitle">
								<font face="Arial" size="4">概览</font>
						</span>
				</a>
		</p>
		<p>目前业界主要的软件厂商都在大力推广面向服务的架构（Service Oritented Architecture，SOA）的概念，但是对于很多客户来说，SOA的概念还是显得相对抽象的。为了使客户能够更加简单的实现向这种面向服务架构的转变，IBM在推出一系列WebSphere新产品的同时，提出了一种新的服务组件模型。这是一种全新的、跟语言无关的编程模型，它提供了一种统一的调用方式，从而使得客户可以把不同的组件类型，比如POJO, EJB, 流程组件，人工交互组件等都可以通过一种标准的接口来封装和调用。结合SDO的数据模型，这种服务组件的编程模型可以大大的简化客户的编程，提高应用的灵活性，这就是面向服务组件的架构（Service Component Architecture，SCA）。目前IBM 对SCA的支持是在最近推出的WebSphere Process Server（WPS）中，但是以后该服务组件模型将作为一个IBM软件重要的编程模型被应用到底层平台当中。本文将介绍SCA编程模型中的基本概念，并以一个简单的例子来说明它的一些基本用法，期待能够抛砖引玉，并为读者以后深入了解SCA打下基础。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10043">
						<span class="atitle">
								<font face="Arial" size="4">1.1 SCA的起源</font>
						</span>
				</a>
		</p>
		<p>基于组件的编程一直是软件业简化编程和提高效率和质量的一个重要方法，但是往往对于不同语言我们有不同的组件模型，从而需要不同的调用方式。比如在J2EE技术领域，我们就有EJB，POJO，JDBC，JMS等，这对于开发人员来说是一个极大的挑战。为了给这些不同的接口提供一个统一的调用方式，IBM提出了WSIF （Web Service Invocation Framework，具体请参考<a href="http://ws.apache.org/wsif/"><font color="#5c81a7">http://ws.apache.org/wsif/</font></a> ），并将它贡献给Apache组织。WSIF作为Web Service领域的一个规范，提供了一种基于Java API统一调用各种服务的能力。但是WSIF没有形成一个基于组件的架构模型，因此IBM在此基础上推出了一个面向服务的组件模型（Service Oritented Architecture, SCA）。这个模型不但解决了统一调用的问题，还提出了一个基于组件的构建模型，并提供了许多面向企业计算的QoS能力。因此，从技术的角度来说，SCA是WSIF的延续和扩展。SCA的目的是使用户在构建企业应用时有一个不再直接面对具体的技术细节的层次，而是通过服务组件的方式来构建应用。这种方式也使得客户的企业应用具有良好的分层架构，能够很好的分离应用的业务逻辑和IT逻辑，不但易于应用的构建，也易于应用的更改和部署。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10050">
						<span class="atitle">
								<font face="Arial" size="4">1.2 SCA中的基本概念</font>
						</span>
				</a>
		</p>
		<p>服务组件模型（SCA）中提出了一些新的概念，比如服务组件，模块，共享库，导入和导出等。下面将分别解释这些服务组件中的基本概念。</p>
		<p>
				<a name="N10059">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1.2.1 服务组件</font>
								</strong>
						</span>
				</a>
		</p>
		<p>服务组件是SCA中的基本组成元素和基本构建单位，也是我们具体实现业务逻辑的地方。我们可以把它看成是构建我们应用的积木。我们可以非常容易地把传统的POJO，无状态会话BEAN等包装成SCA中的服务组件。 SCA服务组件的主要接口规范是基于WSDL（Web Service Description Language）的，另外为了给Java编程人员提供一个比较直接的接口，SCA的部分服务组件也提供了Java接口。因此，使用服务组件的客户端可以选择使用WSDL接口或Java接口。</p>
		<p>服务组件提供给别的服务调用的入口叫Interface（接口）。而服务组件本身可能也需要调用别的服务，这个调用出口叫Reference（引用）。无论是接口还是引用，其调用规范都是WSDL或Java接口。SCA服务组件的接口模型请参考图 1：</p>
		<br />
		<a name="N10067">
				<b>图 1： SCA 服务组件接口模型</b>
		</a>
		<br />
		<img height="333" alt="图 1： SCA 服务组件接口模型" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image002.gif" width="443" border="0" />
		<br />
		<p>WebSphere Process Server 充分利用了SCA的这种组件架构，并在产品中提供了一些与业务联系比较紧密的组件，比如业务流程，人工任务，业务状态机，业务规则等。这样用户就可以直接利用这些服务组件，构建自己的业务流程或其它业务集成的应用。在WebSphere Process Server V6.0.1中，服务组件及SCA在架构中的作用如图 2所示：</p>
		<br />
		<a name="N1007C">
				<b>图 2： WebSphere Process Server V6.0.1的架构环境</b>
		</a>
		<br />
		<img height="360" alt="图 2： WebSphere Process Server V6.0.1的架构环境" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image004.gif" width="479" border="0" />
		<br />
		<p>我们可以从图 2 中看到服务组件架构在WebSphere Process Server中的基础地位，也可以看到各种与业务相关的服务组件或技术相关的辅助服务组件的关系。关于WebSphere Process Server的体系架构这里不展开论述，具体请参考developerWorks专刊，2005年第三期的文章――WebSphere Process Srever V6体系结构概述。</p>
		<p>SCA服务组件与传统组件的主要区别在于：</p>
		<p>1． 服务组件往往是粗粒度的，而传统组件以细粒度居多。</p>
		<p>2． 服务组件的接口是标准的，主要是WSDL接口，而传统组件常以具体API形式出现。</p>
		<p>3． 服务组件的实现与语言是无关的，而传统组件常绑定某种特定的语言。</p>
		<p>4． 服务组件可以通过组件容器提供QoS的服务，而传统组件完全由程序代码直接控制。</p>
		<p>
				<a name="N1009E">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1.2.2 服务模块（Module）</font>
								</strong>
						</span>
				</a>
		</p>
		<p>服务模块（简称模块）由一个或多个具有内在业务联系的服务组件构成。把多少服务组件放在一个模块中，或者把哪些服务组件放在一起主要取决于业务需求和部署上灵活性的要求。模块是SCA中的运行单位，因为一个SCA模块背后对应的是一个J2EE的企业应用项目。这里之所以说是"背后"，原因是我们在开发工具WID（WebSphere Integration Developer V6.0）中，通过业务集成透视图看到都是SCA级别的元素。但是当你切换到J2EE透视图你就会发现这些SCA元素与实际J2EE元素之间的对应关系。因此，在WID中构建一个模块就相当于构建一个项目。另外，由于模块是一个独立部署的单元，这给应用的部署带来很大的灵活性。比如，只要保持模块接口不变，我们很容易通过重新部署新的模块而替换原有的业务逻辑，而不影响应用的其它部分。</p>
		<p>由于一个模块中往往会包含多个服务组件，那我们如何来构建这些服务组件之间的相互调用关系呢？在WID工具中，我们只要简单地通过接口与引用之间的连线，就可以指定它们之间的调用关系而不需要写一行代码。另外，我们可以在这些连线上面设定需要的QoS要求，比如事务，安全等。</p>
		<p>
				<a name="N100AA">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1.2.3 导入（Import）和导出（Export）</font>
								</strong>
						</span>
				</a>
		</p>
		<p>用户实际的应用经常是比较复杂的，因此实际的应用通常需要多个模块才能满足要求，而且这些模块之间又往往存在相互调用的关系。</p>
		<p>另外模块中服务组件除了调用别的服务组件之外，也需要调用已有的一些应用，或者是让一些已有的应用来调用模块的服务，而这些应用可能不是基于SCA架构的。为了解决上述问题，在模块中我们引入了两个特殊的"端点"，一个是导入（Import），它的作用是使得模块中的服务组件可以调用模块外部的服务。另一个是导出（Export），它的作用是使得模块外部的应用可以调用模块中的服务组件。</p>
		<p>由于涉及到模块内外的调用，因此需要指定专门的绑定信息。这些绑定信息包括了目标服务或源服务的调用方式，位置信息，调用的方法等。目前，在WebSphere Process Server V6.0中，导入端点提供了四种绑定方式，包括：JMS绑定，Web Service绑定，SCA绑定和无状态会话BEAN的绑定。导出端点提供了三种绑定方式，包括：JMS绑定，Web Service绑定和SCA绑定。对于SCA模块之间的调用，我们可以非常方便的把绑定方式设置为SCA绑定，但是对于非SCA模块与SCA模块之间的调用我们只能选择其它绑定方式。</p>
		<p>
				<a name="N100B9">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1.2.4 共享库（Library）</font>
								</strong>
						</span>
				</a>
		</p>
		<p>当我们在构建了多个模块的时候，如果有一些资源可以在不同模块之间共享，那么我们可以选择创建一份可以在不同模块之间进行共享的资源，而不是在不同模块中重复创建。共享库就是存放这些共享资源的地方。共享库可以通过与模块类似的方式在WID中创建，但是共享库包含的内容只有：数据定义，接口定义，数据映射和关系。与模块最大的区别使共享库不包含服务组件，因此也就不包含业务逻辑。从包含的功能来看，我们可以把共享库看作是模块的一个子集。当一个模块需要用到共享库中的资源的时候，我们只需要使模块依赖于共享库即可。从部署的角度，一个共享库会对应一个JAR包。在部署的时候，模块所对应的J2EE企业应用会会自动包含所依赖的共享库JAR包。这里特别要注意的是，这里的共享库概念与WebSphere应用服务器中的共享库不是一个概念，它们之间没有任何联系，因此不要混淆。</p>
		<p>
				<a name="N100C2">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1.2.5 Standalone Reference</font>
								</strong>
						</span>
				</a>
		</p>
		<p>模块中的服务组件是不能直接被外部Java代码使用的，为了外部的Java代码，比如JSP/Servlet使用模块中的服务组件，WID工具在模块中提供了一个特殊的端点，叫做Standalone Reference。这个端点只有引用（Reference），而没有接口（Interface）。只要把这个端点的引用连接到需要调用的服务组件的接口，外部的Java代码通过这个引用的名称来调用相应的服务组件了。具体如何调用请参考后面例子的实际代码。</p>
		<p>至此，与服务模块相关的主要概念已大概介绍完了，它们之间的关系如图 3 所示：</p>
		<br />
		<a name="N100D0">
				<b>图 3：服务模块总览图</b>
		</a>
		<br />
		<img height="349" alt="图 3：服务模块总览图" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image006.gif" width="464" border="0" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100E0">
						<span class="atitle">
								<font face="Arial" size="4">1.3 同步调用和异步调用</font>
						</span>
				</a>
		</p>
		<p>我们知道，常见的方法调用都是同步调用，这种调用方式是一种阻塞式的调用方式，即客户端（主调用方）代码一直阻塞等待直到被服务端（被调用方）返回为止。这种调用方式相对比较直观，也是大部分编程语言直接支持的一种调用方式。但是，如果我们面对是基于粗粒度的服务组件，面对的是一些需要比较长时间才能有响应的应用场景，那么我们就需要一种非阻塞式调用方式，即异步调用方式。</p>
		<p>SCA编程模式提供了三种方式的异步调用，它们分别是：</p>
		<p>1． 单向调用方式。</p>
		<p>2． 延迟响应方式。</p>
		<p>3． 请求回调方式。</p>
		<p>
				<b>单向调用</b>
		</p>
		<p>单向调用方式是最为简单的异步调用方式，在这种调用方式中，客户端发出请求之后就不再关心服务端的情况，包括是否执行成功，返回值是什么等等。我们可以用下面的图 4示来描述这种单向调用方式：</p>
		<br />
		<a name="N100FE">
				<b>图 4: 单向调用</b>
		</a>
		<br />
		<img height="292" alt="图 4: 单向调用" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image007.png" width="411" border="0" />
		<br />
		<p>单向调用方式是一种不管调用结果的方式，但是在很多情况下我们是需要知道调用结果的。我们需要知道调用是否成功，需要知道调用的结果，就算调用失败我们也希望知道错误代码等信息。在这种情况下，延迟响应和请求回调就是两种能够让我们知道调用结果的方式。</p>
		<p>
				<b>延迟响应方式</b>
		</p>
		<p>延迟响应方式是指客户端在发出调用请求之后继续执行，但是经过一段时间之后，客户端再调用相应的方法去检索返回结果，并通过参数指定如何根据调用的结果而执行进一步动作。由于是异步调用方式，因此，在第一次发出调用请求的时候，服务端需要返回一个称为票据（Ticket）的对象。这个对象会作为第二次发出检索结果请求时的一个参数。显然，这个Ticket对象的作用与WEB编程的SessionID非常类似。我们可以用图 5 来表示延迟相应调用方式：</p>
		<br />
		<a name="N1011A">
				<b>图 5：延迟响应调用方式</b>
		</a>
		<br />
		<img height="320" alt="图 5：延迟响应调用方式" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image009.png" width="376" border="0" />
		<br />
		<p>
				<b>请求回调</b>
		</p>
		<p>与延迟响应方式类似，请求回调方式也能得到服务端的响应，但是不同的是这个响应是由服务端通过回调方式来触发的，而不像延迟响应方式由客户端来主动检索的。请求回调方式的原理与许多编程语言中的回调机制类似，不同的是这里实现的层次比较高一点。我们可以用图6来表示请求调用方式：</p>
		<br />
		<a name="N10133">
				<b>图 6：请求回调方式</b>
		</a>
		<br />
		<img height="332" alt="图 6：请求回调方式" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image011.png" width="411" border="0" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10143">
						<span class="atitle">
								<font face="Arial" size="4">1.4 SCA客户端的两种调用方式</font>
						</span>
				</a>
		</p>
		<p>从接口的角度，SCA的客户端编程模型有两种方式：</p>
		<p>1． 静态调用方式</p>
		<p>2． 动态调用方式</p>
		<p>
				<b>静态调用方式</b>
		</p>
		<p>静态调用方式是一种类型安全的方式，也是在一般Java编程中最为常见的方式。所谓类型安全指的就是在编译的时候就做类型的检查，而不是等到运行的时候发现类型错误问题。说明示例如下：</p>
		<br />
		<img height="173" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image013.gif" width="558" border="0" />
		<br />
		<p>在SCA客户端编程中，静态方式就是直接拿到实际实现的接口类型，也即直接拿到Java接口。</p>
		<p>
				<b>动态调用方式</b>
		</p>
		<p>与静态调用方式相对，动态调用方式是一种非安全的方式。它的优点是调用非常灵活，但同时带来的不利之处是部分问题在编译的时候是发现不了的，只有等到运行的时候才能发现。说明示例如下：</p>
		<br />
		<img height="198" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image014.gif" width="516" border="0" />
		<br />
		<p>像上面例子所示，在动态调用方式中，客户端通过invoke方法的字符串参数的方式来指定具体要调用的方法名称。很显然，在这种方式下，如果方法名有误是不能在编译时发现的。</p>
		<p>关于动态调用方式另外要注意的一点是，在这种调用方式下，所有参数传递都是通过DataObject的方式，即SDO的方式。哪怕实际参数只是一个字符串，也需要包装成一个DataObject的方式。</p>
		<p>
				<b>接口类型与调用方式</b>
		</p>
		<p>实际上客户端采用哪种调用方式是与接口类型有密切的关系。当提供的接口类型是WSDL类型的，那么客户端的调用方式只能是动态调用方式。由于WSDL是SCA模型中主要的接口方式，这样就导致动态调用方式在SCA编程模型中非常普遍。但是如果提供的接口类型时Java类型的，那么客户端的调用方式可以是动态调用方式，也可以是静态调用方式。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10192">
						<span class="atitle">
								<font face="Arial" size="4">1.5 SCA的第一个例子――HelloWorld</font>
						</span>
				</a>
		</p>
		<p>与学习一种语言一样，在初步了解一些基本概念之后，您是不是迫不及待的想自己动手写点东西了？让我们一起来写一个"SCA版"的HelloWorld。我们需要的开发环境就是一个WebSphere Integration Developer V6.0（WID），与IBM的许多其它的开发工具类似，这也是一个基于Eclipse 3.0的开发工具。下面简单描述一下WID与IBM其它开发工具如Rational Application Developer（RAD），Rational Software Architecture（RSA），WebSphere Business Modeler等工具的区别。如果采用基于角色的开发方式，我们一般可以把集成项目的主要开发人员分为下面四大类：业务分析人员，集成开发人员，软件架构师，J2EE/JAVA应用开发人员。他们的主要职责、技术要求和推荐使用的工具可以参见下表：</p>
		<br />
		<img height="725" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/table1.gif" width="592" border="0" />
		<br />
		<p>由上表可知，WID是一个主要针对集成开发人员的工具。除了专门的集成功能之外，WID工具也包含了RAD中的大部分功能。为了便于集成应用的测试，这个开发工具集成了一个测试环境，即WebSphere Process Server V6.0的运行环境。</p>
		<p>这个例子的主要目的是帮助大家进一步理解前面描述的那些SCA基本概念。在HelloWorld应用模块中，我们会构建一个用Java实现的SCA组件，其接口为HelloWorldInterface.wsdl，其实现代码为HelloWorldImpl.java。为了使SCA模块外部的JSP文件可以调用这个SCA组件，需要一个Standalone Reference。在模块外部，我们构建一个index.jsp文件通过Standalone Reference来调用HelloWorld服务组件，并在页面上把调用结果显式出来。整个HelloWorld应用的基本图示如下：</p>
		<br />
		<a name="N101B4">
				<b>图 7： HelloWorld 应用</b>
		</a>
		<br />
		<img height="267" alt="图 7： HelloWorld 应用" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image016.gif" width="495" border="0" />
		<br />
		<p>
				<a name="N101C4">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1.5.1 构建的基本步骤</font>
								</strong>
						</span>
				</a>
		</p>
		<p>下面给出创建HelloWorld例子的基本步骤：</p>
		<p>1． 创建模块。打开WID，切换到Business Integration透视图，新建一个模块，名称为HelloWorld。</p>
		<p>2． 创建接口。通过点击HelloWorld模块左边的"＋"号展开，选择"Interface"，然后通过右键创建一个接口，名称为HelloWorldInterface。图示如下：</p>
		<br />
		<img height="450" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image017.png" width="385" border="0" />
		<br />
		<p>HelloWorld接口包含一个sengMessage操作，输入为一个名为message的字符串，输出一个名为status的字符串。可以通过点击接口编辑器上方的<img height="27" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image020.gif" width="27" border="0" />按钮来添加一个操作。通过<img height="23" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image022.gif" width="19" border="0" />和<img height="26" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image024.gif" width="19" border="0" />分别来添加输入和输出参数。图示如下：</p>
		<br />
		<img height="205" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image025.png" width="713" border="0" />
		<br />
		<p>3． 创建服务组件。双击打开HelloWorld模块的图形化编辑器，然后在控制面板上把Java组件图标<img height="29" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image027.png" width="33" border="0" /> 拖拉到编辑器中即生成一个Java服务组件，并把名称改为HelloWorld。如下图所示：</p>
		<br />
		<img height="301" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image030.png" width="616" border="0" />
		<br />
		<p>通过点击 <img height="21" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image032.png" width="20" border="0" />按钮为HelloWorld组件选择一个接口，即我们前面定义的HelloWorldInterface。</p>
		<p>通过双击上图中的HelloWorld组件，WID会自动生成HelloWorld组件实现类的基本框架HelloWorldImpl.java。如下图所示：</p>
		<br />
		<img height="460" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image034.png" width="714" border="0" />
		<br />
		<p>上图中高亮处显示的代码行就是我们可以给sendMessage方法添加业务代码的地方。比如，我们可以输入：return message + ". It's our first SCA example!";</p>
		<p>4． 创建standalone reference。在工具栏中把<img height="25" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image036.png" width="31" border="0" /> 图标拖拉到编辑器中即生成一个standalone reference。如下图所示：</p>
		<br />
		<img height="275" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image040.png" width="641" border="0" />
		<br />
		<p>然后把Standalone Reference端点与HelloWorld组件连接起来。工具自动会为Standalone Reference创建一个匹配HelloWorld组件接口的引用。这里要注意的是，向导在自动创建Standalone Reference的引用时会弹出一个窗口询问需要创建一个Java接口类型的引用还是WSDL接口类型的引用。不同类型的接口会使得我们的客户端代码（在本例中是一个名为index.jsp的JSP文件）需要采用不同的调用方式。下面会分析两种不同类型的实现。</p>
		<p>5． 生成JSP代码。如果我们在前面的引用接口类型中选择的是WSDL接口。那么Standalone Reference的属性如下图所示：</p>
		<br />
		<img height="191" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image042.png" width="279" border="0" />
		<br />
		<p>我们可以看到，引用的名称为HelloWorldInterfacePartner，接口为名称为HelloWorldInterface这个WSDL类型的接口。</p>
		<p>如果我们在前面的引用接口类型中选择的是Java接口。那么Standalone Reference的属性如下图所示：</p>
		<br />
		<img height="197" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image044.png" width="431" border="0" />
		<br />
		<p>我们可以看到，引用的名称为HelloWorldInterfacePartner，接口为名称为world.hello.hello.world.interface_.HelloWorldInterface这个Java类型的接口。具体JSP代码参考下面的客户端代码分析部分。</p>
		<p>6． 检查生成的项目。如果把WID切换到J2EE透视图的导航视图中，我们可以看到与HelloWorld模块对应的J2EE项目。J2EE企业项目为HelloWorldApp，其包含EJB项目HelloWorldEJB，Web项目HelloWorldWeb，J2EE客户端项目HelloWorldEJBClient。另外一个是名为HelloWorld的Java项目，这个项目的内容最终会以一个JAR文件的形式被HelloWorldApp应用使用。上一步中所提到的JSP文件需要在HelloWorldWeb项目中生成。具体如下图所示：</p>
		<br />
		<img height="420" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/images/image046.png" width="268" border="0" />
		<br />
		<p>
				<a name="N102A9">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1.5.2 JSP客户端代码片断分析</font>
								</strong>
						</span>
				</a>
		</p>
		<p>那么如何在JSP页面中来调用我们的HelloWorld服务组件呢？按照前面的介绍，我们需要通过Standalone Reference来调用。那么我们如何才能得到这个Standalone Reference的引用呢？这里涉及到SCA编程模式中很重要的一个概念，那就是ServiceManager。ServiceManager是一个SCA环境的核心类，全名为com.ibm.websphere.sca.ServiceManager。这个类的作用主要就是能够让客户端去定位一个服务提供方。一般调用的方式是通过ServiceManager的locateService(String serviceRefName)方法。拿到服务之后，客户端就可以调用服务中所提供的方法了。（熟悉J2EE编程的人员可以联系对比JNDI的Lookup方法。）下面分别根据Standalone Reference引用的接口类型来分析主要JSP代码片断。</p>
		<p>当接口类型是WSDL接口的情况</p>
		<p>1．首先需要在JSP中导入相关的类，主要如下：</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">&lt;%@ page import="com.ibm.websphere.sca.ServiceManager" %&gt;
&lt;%@ page import="com.ibm.websphere.sca.Service" %&gt;
&lt;%@ page import="commonj.sdo.DataObject" %&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>2．生成ServiceManager对象，并拿到相应的服务。</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">ServiceManager serviceManager = new ServiceManager();
Service service = (Service) serviceManager.locateService("HelloWorldInterfacePartner");
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这里locateService()方法中的参数是standalone reference的实际名称。从某种程度上我们可以把外部的JSP/Servlet的Java代码看成是Standalone reference的实现，这样来理解服务组件之间的相互调用。</p>
		<p>3．调用服务的方法。</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">String msg = request.getParameter("message");
DataObject resp = (DataObject) service.invoke("sendMessage",msg);
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>由于我们这里使用的是WSDL接口类型，因此返回结果是以DataObject的形式存在。</p>
		<p>4． 显式得到的结果。</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">&lt;%=resp.getString("status")%&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>通过调用DataObject的getString方法，我们拿到实际的返回结果，名为status的字符串。</p>
		<p>
				<b>当接口类型是Java接口的情况</b>
		</p>
		<p>1．首先需要在JSP中导入相关的类，主要如下：</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">&lt;%@ page import="com.ibm.websphere.sca.ServiceManager" %&gt;
&lt;%@ page import="com.ibm.websphere.sca.Service" %&gt;
&lt;%@ page import="world.hello.hello.world.interface_.HelloWorldInterface" %&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>2．生成ServiceManager对象，并拿到相应的服务。</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">ServiceManager serviceManager = new ServiceManager();
HelloWorldInterface service = 
(HelloWorldInterface) serviceManager.locateService("HelloWorldInterfacePartner");
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>由于Standalone Reference的接口变成了Java接口，因此这里返回的服务可以直接造型成HelloWorldInterface类型。</p>
		<p>3．调用服务的方法。 </p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">String msg = request.getParameter("message");
String resp = service.sendMessage(msg);
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>由于我们这里使用的是Java接口类型，因此调用的方式就是正常的Java接口调用。</p>
		<p>4． 显式得到的结果。</p>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">&lt;%=resp%&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>由于静态调用方式得到的就是实际定义的类型，因此这里字符串的显式比较简单。</p>
		<p>具体实际项目的代码请参考本文附的项目交换文件包。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-sca/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1032E">
						<span class="atitle">
								<font face="Arial" size="4">1.6 结束语</font>
						</span>
				</a>
		</p>
		<p>本文介绍了SCA的主要目的和一些基本的概念，并展示了一个最为简单的服务组件例子。从上面的讨论我们可以看到，SCA不但解决了统一调用的问题，而且提供了一个服务组件架构。这个服务组件架构将在构建面向服务的架构中起到举足轻重的作用，并在IBM的许多产品中会有所体现。</p>
		<p>后记，在这篇文章完成之后，传来了一个关于SCA的好消息。SCA得到了业界几个主要软件厂商的支持。IBM、Oracle、BEA、SAP、Siebel、Sybase、IONA等厂商联合发布了SCA规范的0.9版本。具体规范可参见IBM DW的网址：<a href="http://www.ibm.com/developerworks/library/specification/ws-sca/"><font color="#5c81a7">http://www.ibm.com/developerworks/library/specification/ws-sca/</font></a></p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/8031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-06-01 16:52 <a href="http://www.cppblog.com/zhangji198543/archive/2006/06/01/8031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5月10日-----将 WebSphere Business Integration Server Foundation V5.1.x 项目迁移到 WebSphere Process Server V6</title><link>http://www.cppblog.com/zhangji198543/archive/2006/05/10/6888.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Wed, 10 May 2006 12:10:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/05/10/6888.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/6888.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/05/10/6888.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/6888.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/6888.html</trackback:ping><description><![CDATA[
		<p>
				<a name="N10076">
						<span class="atitle">
								<font face="Arial" size="4">引言</font>
						</span>
				</a>
		</p>
		<p>IBM® WebSphere® Process Server v6（以下称为 Process Server）是 IBM 提供的下一代业务集成软件，它基于包含了开放标准的面向服务的体系结构 (SOA)。它取代了 WebSphere Business Integration Server Foundation v5.1.x（以下称为 Server Foundation）。集成开发环境 (IDE) 也从 WebSphere Studio Application Developer Integration Edition（以下称为 Application Developer）v5.1.x 发展到了新的 WebSphere Integration Developer v6（以下称为 Integration Developer）。Integration Developer 是作为 Process Server 的补充的一个工具，它基于 Eclipse 3.0 并带来了基于组件开发的一个完整的新范例。 </p>
		<table cellspacing="0" cellpadding="0" width="70%" summary="" border="1">
				<tbody>
						<tr>
								<th>先前称作</th>
								<th>现在称作</th>
						</tr>
						<tr>
								<td class="tb-row">WebSphere Business Integration Server Foundation v5.1.x</td>
								<td>WebSphere Process Server v6</td>
						</tr>
						<tr>
								<td class="tb-row">WebSphere Studio Application Developer Integration Edition v5.1.x</td>
								<td>WebSphere Integration Developer v6</td>
						</tr>
				</tbody>
		</table>
		<p>在将业务集成应用程序从 Server Foundation 迁移到 Process Server 时，您可以在以下两种方法中选择： 
</p>
		<ul>
				<li>一种方法是<i>运行时迁移</i>，将整个 Server Foundation 配置（包括已安装的应用程序和配置文件）迁移到 Process Server 配置文件。应用程序二进制文件并没有变化，它们“只是”像在 Server Foundation 中那样运行。WebSphere Process Server v6.0.0 并没有提供这种迁移方法，但是正在考虑将其用于该产品的未来版本。 
</li>
				<li>另一种方法是<i>源构件迁移</i>，它使用新集成开发环境中的迁移工具。<i>这是 v6.0.0 中提供的唯一迁移方法</i>。在这种情况下，将应用程序的源代码迁移到新编程模型并进行改写，以便您可以将迁移的应用程序部署到 Process Server。迁移向导将为您自动迁移所有 BPEL 文件和 BPEL WSDL 扩展，然后您必须执行一组手动迁移步骤以完成这一迁移。 </li>
		</ul>
		<p>
		</p>
		<p>本文描述了源构件迁移方法。您应该具有使用 Application Developer 的经验，并且对 Java™ 编程和业务流程相当了解。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100BB">
						<span class="atitle">
								<font face="Arial" size="4">源构件迁移概述</font>
						</span>
				</a>
		</p>
		<p>本文介绍了迁移一个简单服务项目（包含作为 EJB 公开并连接到 Java 服务的业务流程）的源构件的步骤。在本例中，业务流程只需调用 Java 服务，Java 服务反过来发送电子邮件。通过接收电子邮件，该操作帮助您了解应用程序何时成功执行。应用程序在 Application Developer 创建，在 Server Foundation 部署。我们向您展示了如何使用迁移向导将项目导入到 Integration Developer，如何重新连接组件，以及如何为在 Process Server 部署做好准备。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100C4">
						<span class="atitle">
								<font face="Arial" size="4">现有资源</font>
						</span>
				</a>
		</p>
		<p>现有的 <a href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#download"><font color="#996699">Application Developer 项目交换 zip 文件</font></a>包含构成企业应用程序的 6 个项目。应用程序的工作部分包含在 EmailService 服务项目中。EmailServiceCustomWeb 项目包括允许您从 Web 浏览器调用服务的 JSP。这两个项目都是在 EmailServiceEAR 定义的 EAR 中部署的。</p>
		<p>我们将使用 Integration Developer 来迁移服务项目和自定义 Web 项目，并使用迁移的 JSP 测试业务流程。除了解压缩项目交换 zip 文件以外，所有步骤都是在 Windows® 平台上的 Integration Developer v6.0.0 中执行的。</p>
		<p>将<a href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#download"><font color="#996699">项目交换文件</font></a>解压缩到一个临时文件夹。然后从 Windows 开始菜单启动 Integration Developer。选择 <b>Start -&gt; Programs -&gt; IBM WebSphere -&gt; Integration Developer V6.0 -&gt;WebSphere Integration Developer V6.0。</b></p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100DD">
						<span class="atitle">
								<font face="Arial" size="4">使用迁移向导</font>
						</span>
				</a>
		</p>
		<p>有两种方式访问迁移向导。当您第一次打开 WebSphere Integration Developer 时，欢迎屏幕将显示几个图标。单击绿色箭头图标以启动迁移向导，如图 1 所示。</p>
		<br />
		<a name="N100E8">
				<b>图 1. WebSphere Integration Developer 欢迎屏幕</b>
		</a>
		<br />
		<img height="388" alt="WebSphere Integration Developer 欢迎屏幕" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig17.gif" width="575" />
		<br />
		<p>
				<b>提示：</b>在使用迁移向导时，关闭 Integration Developer 中的项目自动构建选项。请转到 <b>Main Menu -&gt; Project</b>，然后取消选择 Build Automatically。如果您关闭该 AutoBuild 选项，请记住定期构建整个项目或者重新启用 AutoBuild 选项。</p>
		<p>下一屏幕向您呈现了 3 个源迁移选项。单击具有 5.1 和一个箭头的图标，如图 2 所示。</p>
		<br />
		<a name="N10103">
				<b>图 2. WebSphere Integration Developer 初始迁移屏幕</b>
		</a>
		<br />
		<img height="388" alt="WebSphere Integration Developer 初始迁移屏幕" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig18.gif" width="575" />
		<br />
		<p>另一种方式是通过 File Import 选项浏览 Integration Developer。要启动迁移向导，请使用主菜单：</p>
		<ol>
				<li>转到 <b>File -&gt; Import</b>。 
</li>
				<li>从导入窗口中选择 <b>WebSphere Studio Application Developer Integration Edition Service Project</b>，如图 3 所示，然后单击 <b>Next</b>。这将启动迁移向导。 <br /><br /><a name="N10128"><b>图 3. 导入窗口</b></a><br /><img height="521" alt="导入窗口" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig1.gif" width="470" /><br /></li>
				<li>单击 <b>Browse</b> 按钮，并转到您解压缩<a href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#download"><font color="#996699">项目交换 zip 文件</font></a>的临时文件夹。 
</li>
				<li>突出显示要导入的项目文件夹，并单击 <b>OK</b>。在本例中，导入图 4 中所示的 EmailService 项目。 
<p><b>提示：</b>该向导能够快速地填写它找到的模块名。如果它没有填写，请输入项目的模块名。我们建议您使用相同的原有项目名称。</p><br /><a name="N1014D"><b>图 4. 指定源构件</b></a><br /><img height="203" alt="指定源构件" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig2.gif" width="576" /><br /></li>
				<li>单击 <b>Next</b> 进入设置迁移选项的屏幕。 
</li>
				<li>请确保选择选项以<b>在注释中保留原有的 BPEL Java 代码段</b>。通过将它们包含在注释块中，保留所有现有的 Java 代码段。单击 <b>Finish</b>。 
</li>
				<li>迁移向导将创建一个新的“业务集成模块”项目，导入所有现有的 Application Developer 构件，并转换源构件。您会看到具有一些消息的 Migration Results 屏幕。 
<p>在本例中，您将看到 5 条信息消息。其中有 4 条信息表示：<i>“The following java package is not being migrated because it contains generated classes that are no longer valid”</i>。这些消息是安全无害的。Application Developer 已经自动生成 java 包以将应用程序绑定到 Server Foundation 运行时。新工具将生成新的绑定。单击 <b>OK</b>。</p><p><b>请注意：</b>如果出现错误，您可以突出显示某一消息行，然后单击 <b>Generate ToDo’s</b> 按钮以在代码中生成 TODO，这样您可以稍后修复这些错误。</p><p>如果您关闭了 AutoBuild 选项，可以再次打开（<b>Integration Developer Main Menu -&gt; Project -&gt; Build Automatically</b>）。</p></li>
		</ol>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10186">
						<span class="atitle">
								<font face="Arial" size="4">使用迁移的资源</font>
						</span>
				</a>
		</p>
		<p>现在您将使用迁移的资源。</p>
		<ol>
				<li>请转到 Integration Developer 中的 Business Integration 透视图。在导航窗格中，通过双击名为 EmailService 的 Assembly Diagram 图标，<img height="16" alt="Assembly Diagram 图标" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/assembly_view.gif" width="16" />，打开最新创建的 EmailService 项目。该项目将在 Assembly Editor 中打开。 
</li>
				<li>您将在画布中看到一个名为 EmailBusinessProcess 的项。这是服务组件体系结构（Service Component Architecture，SCA）组件，它的实现是在业务流程执行语言（Business Process Execution Language，BPEL）中实现的电子邮件业务流程 (Email Business Process)。 <br /><br /><a name="N101A0"><b>图 5. 显示一个业务流程组件的 Assembly Editor</b></a><br /><img height="153" alt="显示一个业务流程组件的 Assembly Editor" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig3.gif" width="576" /><br /></li>
				<li>Assembly Editor 左侧是工具面板。您需要第二个工具箱中的 Stand-alone References 工具，该工具箱由一个框式蓝色箭头图标表示。单击业务流程组件的左侧，然后单击工具并将其放在画布中。如果需要空间，可以将业务流程组件拖到右侧。 
</li>
				<li>在 Assembly Editor 工具面板中，单击绿色细线图标，<img height="16" alt="绿色细线图标" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/wire_obj.gif" width="16" />，然后单击 <b>Stand-alone References</b> 组件，最后单击 <b>Business Process Component (EmailBusinessProcess)</b>。 
</li>
				<li>弹出的消息将通知您<i>“a matching reference will be created on the source node. Do you want to continue?”</i>。不要选择“Always create without prompt”框。单击 <b>OK</b>。 
</li>
				<li>Select Interface 窗口弹出，如图 4 所示。您将看到可以创建引用的两个接口，即 ProcessPortType 和 MailSMTP。请选择 <b>MailSMTP</b> 并单击 <b>OK</b>。 <br /><br /><a name="N101D6"><b>图 6. 接口选择屏幕</b></a><br /><img height="327" alt="接口选择屏幕" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig4.gif" width="319" /><br /></li>
				<li>将提示您是否希望为 Stand-alone Reference 生成 Java 接口，而不是 Web 服务描述语言（Web Services Description Language，WSDL）接口。由于您要使用 JSP 和 Java 客户机访问流程，因此选择 <b>Yes</b>。 
</li>
				<li>单击 <b>Ctrl-S</b> 保存与图 7 相似的组装关系图 (Assembly Diagram)。观察每一个组件的细节以及 Properties 窗格的 Details 选项卡中的连接。 
</li>
				<li>请选择 <b>Stand-alone References Component</b>。在 Properties 视图中，记住 Details 窗格中的 Partner Reference 的名称。在本例中，名称为 <code>MailSMTPPartner</code>。在 Details 窗格中，您可以找到客户机使用的自动生成的 Java 接口的名称。如图 7 中所示，接口为 <code>com.scb.process.email.mail.smtp.MailSMTP</code>。 <br /><br /><a name="N10202"><b>图 7. 显示属性窗格和两个连接组件的组装关系图</b></a><br /><img height="471" alt="显示属性窗格和两个连接组件的组装关系图" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig5.gif" width="576" /><br /><p><b>请注意：</b>我们为什么向业务流程组件提供独立引用呢？独立引用允许非 SCA 客户机（如类似于 JSP 的 J2SE 或者 J2EE 客户机）访问 SCA 组件。如果您只计划使用 BPC 资源管理器或者组件测试框架 (Component Test Framework) 调用流程，则不需要独立引用，这是因为这些内置工具使用 BPC 和 SCA API 直接调用流程。</p></li>
				<li>回到 Assembly Editor，选择 EmailBusinessProcess 组件的引用连接器（由右侧具有 1:1 的小框表示）。右键单击该引用连接器，并从上下文菜单中选择 <b>Wire References to New -&gt; Components</b>。 
<p>该操作将在 EmailBusinessProcess 组件的右侧创建与接口 MailSMTP 同名的通用 SCA 组件。这会自动将业务流程组件连接到新的通用组件。</p></li>
				<li>单击 <b>Ctrl-S</b> 保存组装关系图。 
</li>
				<li>右键单击 <b>Generic Component MailSMTP</b>，并从上下文菜单中选择 <b>Select Implementation -&gt; Java</b>。该通用组件变成 Java 组件。在 Pick Implementation 屏幕的 Select entries 字段中，开始键入 <code>mailsm</code>，直到看到名为 MailSMTP 的类为止。突出显示这个类并单击 <b>OK</b>。 
<p><b>提示：</b>Qualifier 字段显示包的名称，该名称与包出现在原有的 Application Developer 服务项目中的名称相同。这就是在开始迁移流程之前您必须了解服务项目的结构的原因。</p><p>由于这个 Java 服务示例的输入/输出参数具有简单的类型（字符串和布尔型），因此 SCA 框架自动等同于 SCA 组件公开的 WSDL 接口和 Java 类的接口。例如，在 EmailService 项目中比较 MailSMTP.wsdl 和 MailSMTP.java。转到 Java 透视图查看 Integration Developer 中的这些文件。</p><p>如果您不确定 Java 接口是否与满足 Java 要求的 SCA WSDL 兼容，请不要选择 <b>Select Implementation</b>，而要选择 <b>Generate Implementation</b>。将要求您具有可以生成类的包。向导在组件公开的 WSDL 接口中生成与 SCA 兼容的 Java 接口。组件 MyComponent 的类名为 <code>MyComponentImpl.java</code>。</p><p>现在，检查每个方法的输入参数的类型及其返回类型，以确保它们都匹配 Java 类的接口。如果它们不匹配，您有两种选择。第一种选择涉及到修改原有 Java 类的接口。或者，可以将生成的骨架作为实现类并编写自定义代码，以在生成的 Java 骨架中调用每个方法的原有 Java 类。当操作的输入或者输出类型很复杂时（例如，Customer 对象具有地址、姓名之类的子对象），通常会出现问题，因为在 SCA 范例中，它们是以 commonj.sdo.DataObject 表示的。而在原有 Java 类中，参数是以 Java bean 表示的。</p></li>
				<li>通用 SCA 组件变成 Java 组件，业务流程组件与其连接。画布与图 8 类似。画布中唯一的显著变化是“J”，表示 MailSMTP 是一个 Java 组件。 <br /><a name="N10251"><b>图 8. 显示 3 个连接组件的组装关系图</b></a><br /><img height="201" alt="显示 3 个连接组件的组装关系图" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig6.gif" width="576" /><br /></li>
				<li>这就完成了。单击 <b>Ctrl-S</b> 保存组装关系图并关闭 Assembly Editor。 </li>
		</ol>
		<p>下一步要迁移 Application Developer 项目交换文件中包含的 Web 项目。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1026A">
						<span class="atitle">
								<font face="Arial" size="4">迁移用于调用业务流程的 JSP</font>
						</span>
				</a>
		</p>
		<p>在 Application Developer 项目交换文件中，EmailServiceCustomWeb 项目包含 JSP (index.jsp)，它从用户获得 4 个参数并使用 Facade Enterprise Java Bean (EJB) 调用业务流程。该 Facade EJB 是在 Application Developer 中生成的，它包含在 EmailServiceEJB 项目中。</p>
		<p>在 Integration Developer 中，没有生成 Facade EJB 的捷径，因为它使用 SCA 编程模型中的新抽象层。因此，您必须迁移 index.jsp 以使用 SCA 编程模型，而这将调用业务流程。</p>
		<ol>
				<li>首先，从<a href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#download"><font color="#996699">项目交换 zip 文件</font></a>导入 EmailServiceCustomWeb 项目。在 Integration Developer 中，转到 <b>File -&gt; Import -&gt; Project Interchange</b>。单击 <b>Next</b> 并浏览到该 zip 文件。选择图 9 中所示的 <b>EmailServiceCustomWeb</b> 并单击 <b>Finish</b>。 <br /><br /><a name="N1028E"><b>图 9. 项目导入屏幕</b></a><br /><img height="550" alt="项目导入屏幕" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig7.gif" width="477" /><br /><p>许多在 Application Developer 中有效的环境变量在 Integration Developer 中不再使用，因此我们需要确定 Web 项目的类路径。</p></li>
				<li>转到 Java 透视图，<b>Window -&gt; Open Perspective - &gt; Other -&gt; Java</b>，并选择 <b>EmailServiceCustomWeb</b> 项目。右键单击并选择 <b>Properties</b>。 
</li>
				<li>转到 Java Build Path，在 Projects 选项卡中，删除 EmailServiceEJBClient 上的依赖项。请确保 EmailService 上有一个依赖项，如图 10 所示。 <br /><br /><a name="N102B2"><b>图 10. Java 构建路径上的项目</b></a><br /><img height="473" alt="Java 构建路径上的项目" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig8.gif" width="576" /><br /></li>
				<li>在 Libraries 选项卡中，突出显示所有条目并单击 <b>Remove</b>，以从构建路径中删除所有 JAR 和类文件夹。 
</li>
				<li>单击 <b>Add Library</b>，突出显示 JRE System Library，然后单击 <b>Next</b>。在 Alternate JRE 字段中，使用下拉选择器选择 <b>WPS Server v6.0 JRE</b>。请<i>不要</i> 选择 WebSphere v6 JRE。单击 <b>Finish</b>。 
</li>
				<li>单击 <b>Add Library</b>，突出显示 WPS Server Target，然后单击 <b>Next</b>。选择“Configure wps server classpath”并单击 <b>Next</b>。您的属性屏幕将类似于图 11。<br /><br /><a name="N102E8"><b>图 11. Java 构建路径上的库</b></a><br /><img height="473" alt="Java 构建路径上的库" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig9.gif" width="576" /><br /></li>
				<li>单击 <b>Project References</b>。设置对 EmailService 项目的引用（如图 12 所示）并删除所有其他引用。<br /><br /><a name="N10300"><b>图 12. 项目引用设置</b></a><br /><img height="473" alt="项目引用设置" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig10.gif" width="576" /><br /></li>
				<li>单击 OK 保存新设置。这将清除所有错误（除 index.jsp 中的 JSP 编译错误之外）。Application Developer v5.1 在 J2EE 1.3 级别。您可以将 Web 应用程序迁移到 Integration Developer v6.0 中可用的 J2EE 1.4 级别。 
<p><b>提示：</b>只有在工作区启用高级 J2EE 功能后才可以使用迁移选项。为此，请转到 <b>Window -&gt; Preferences -&gt; Workbench -&gt; Capabilities -&gt; Advanced J2EE -&gt; Enterprise Java</b>，如图 13 所示。</p><br /><a name="N1031B"><b>图 13. 启用工作台的功能</b></a><br /><img height="483" alt="启用工作台的功能" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig11.gif" width="576" /><br /></li>
				<li>在导航窗格中，突出显示 EmailServiceCustomWeb 项目。右键单击并从上下文菜单中选择 <b>Migrate -&gt; J2EE Migration Wizard</b>。 
</li>
				<li>在 J2EE Migration Wizard 欢迎屏幕中，忽略警告并单击 <b>Next</b>。对于该场景，缺省设置是可以接受的。图 14 显示了缺省 J2EE 版本为 v1.4，目标服务器是 WebSphere Process Server v6.0。单击 <b>Finish</b>。 <br /><br /><a name="N1033C"><b>图 14. 项目的迁移设置</b></a><br /><img height="481" alt="项目的迁移设置" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig12.gif" width="530" /><br /></li>
				<li>查找消息“Migration finished successfully”。单击 <b>OK</b>。由于这只是一个简单的项目，因此 Details 窗格指示许多项不需要迁移。 
</li>
				<li>还有最后一步。您需要将该自定义 Web 项目添加到为 EmailService 业务集成模块生成的企业应用程序中。该操作是在 Integration Developer 的 J2EE 透视图中完成的，包括几个步骤。 
</li>
				<li>转到 J2EE 透视图，<b>Window -&gt; Open Perspective -&gt; J2EE</b>。在导航窗格中，转到 <b>Enterprise Applications -&gt; EmailServiceApp -&gt; Deployment Descriptor</b>。打开 EmailServiceApp 的部署描述符。 
</li>
				<li>在主窗口中，单击 <b>Module</b> 选项卡。在 Modules 下面，单击 <b>Add</b>，如图 15 所示。弹出的 Add Module 窗口将查找 EmailServiceCustomWeb 项目。选择该项目并单击 <b>Finish</b>。<br /><br /><a name="N1036C"><b>图 15. 项目引用设置</b></a><br /><img height="293" alt="项目引用设置" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig13.gif" width="576" /><br /></li>
				<li>单击 <b>Ctrl-S</b> 保存应用程序的部署描述符。 
</li>
				<li>在 Integration Developer 中，不能再为业务流程生成 Facade EJB。您必须手动迁移这些代码以使用 SCA 编程模型调用业务流程。这就是您需要修复 index.jsp 文件中的错误的原因。 
<p>在 J2EE 透视图中，编辑 index.jsp。在 Project Explorer 窗格中，转到 <b>Dynamic Web Projects -&gt; EmailServiceCustomWeb -&gt; Web Content -&gt;index.jsp</b>。双击 index.jsp 打开该文件进行编辑。选择 JSP 编辑器的 <b>Source</b> 选项卡。您将看到“if”代码块内的错误，如图 16 所示。</p><br /><a name="N1038E"><b>图 16. 编辑 index.jsp 文件</b></a><br /><img height="266" alt="编辑 index.jsp 文件" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/figCode.gif" width="576" /><br /></li>
				<li>使用下面的代码替换 if 代码块： <br /><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">com.scb.process.email.mail.smtp.MailSMTP service = 
      (com.scb.process.email.mail.smtp.MailSMTP)   
      com.ibm.websphere.sca.ServiceManager.INSTANCE.
      locateService("MailSMTPPartner");

boolean success = service.sendEmail(
      request.getParameter("server"), 
      request.getParameter("from"),
      request.getParameter("to"), 
      request.getParameter("contents"));
</font></code></pre></td></tr></tbody></table><br /></li>
				<li>保存对 index.jsp 和部署描述符的更改。 </li>
		</ol>
		<p>现在，您可以通过下面列出的三种方法进行测试，其中每一个测试都是相继测试应用程序的组件。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N103AF">
						<span class="atitle">
								<font face="Arial" size="4">使用 Integration Developer 集成测试客户机测试迁移的组件</font>
						</span>
				</a>
		</p>
		<p>现在您可以在 Integration Developer 中测试迁移的应用程序。通过使用嵌入式测试服务器运行应用程序，集成测试客户机允许您单独测试每一个组件。</p>
		<ol>
				<li>转到 Business Integration 视图中的导航窗格。右键单击 <b>EmailService</b> 项目。从上下文菜单中选择 <b>Test -&gt; Test Module</b>。对于要测试的组件，选择 <b>MailSMTP</b>。 
<p><b>请注意：</b>您可以选择调用的组件。在 MailSMTP 的第一个示例中，选择 Java 组件。稍后，确定 Java 组件正确工作后，您可以执行调用业务流程组件的更加全面的测试。</p><br /><a name="N103CC"><b>图 17. 调用事件</b></a><br /><img height="252" alt="调用事件" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/image037.gif" width="574" /><br /></li>
				<li>在 Events 屏幕中，输入 4 个输入请求参数的值（电子邮件服务器的名称、电子邮件地址以及用作电子邮件内容的文本），并单击 <b>Continue。</b></li>
				<li>Deployment Location 窗口弹出。请选择突出显示的 WebSphere Process Server v6.0 并单击 <b>Finish</b>。 
</li>
				<li>集成测试客户机将启动嵌入式 Process Server 测试服务器，安装并启动迁移的应用程序，并且使用您指定的参数调用 MailSMTP Java 服务。如果输入参数是正确的，您将看到返回结果的值为“true”，如图 18 所示。<br /><br /><a name="N103EC"><b>图 18. 返回结果</b></a><br /><img height="190" alt="返回结果" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/image039.gif" width="574" /><br /></li>
				<li>通过检查电子邮件是否已发送到收件人，验证是否成功调用 Java 服务，如图 19 所示。 <br /><br /><a name="N10401"><b>图 19. 测试电子邮件</b></a><br /><img height="333" alt="测试电子邮件" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/image041.jpg" width="575" /><br /><p>该测试展示了如何使用 Integration Developer 集成测试客户机调用 Java 组件 (MailSMTP)。</p></li>
		</ol>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10414">
						<span class="atitle">
								<font face="Arial" size="4">使用 Integration Developer 集成测试客户机测试更多迁移的组件</font>
						</span>
				</a>
		</p>
		<ol>
				<li>在 Business Integration 透视图中右键单击 <b>EmailService</b> 项目，回到 Events 屏幕，然后从上下文菜单中选择 <b>Test -&gt; Test Module</b>。 
</li>
				<li>在 Component 字段中，单击下拉箭头并选择名为 <b>EmailBusinessProcess</b> 的组件。它是实现为 BPEL 流程的业务流程组件。它调用刚才测试的 MailSMTP Java 服务。这是一个更加全面的测试，演示了如何在业务集成模块中增量测试组件。 
</li>
				<li>如上一个测试那样，输入 4 个请求参数的值，然后单击 <b>Continue</b>。 <br /><br /><a name="N10434"><b>图 20. 选择组件</b></a><br /><img height="333" alt="选择组件" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/image043.gif" width="575" /><br /></li>
				<li>这也将获得一个成功的测试。收件人获得了测试电子邮件，并且 Events 屏幕显示图 21 中所示的结果。<br /><br /><a name="N10449"><b>图 21. 成功的结果</b></a><br /><img height="246" alt="成功的结果" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/image045.gif" width="574" /><br /></li>
		</ol>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10459">
						<span class="atitle">
								<font face="Arial" size="4">使用迁移的 JSP 测试迁移的应用程序</font>
						</span>
				</a>
		</p>
		<p>现在您可以使用迁移的 JSP 测试迁移的应用程序。这是一个全面的测试，因为它表示一个端到端场景。</p>
		<ol>
				<li>转到 J2EE 透视图中的导航窗格。展开 Enterprise Applications 并右键单击 <b>EmailServiceApp</b> 项目。从上下文菜单中选择 <b>Run -&gt; Run on Server</b>。 
</li>
				<li>在 Server Selection 屏幕中，选择 <b>WebSphere Process Server v6.0</b>（如图 22 所示）并单击 <b>Finish</b>。<br /><br /><a name="N10479"><b>图 22. 定义新测试服务器</b></a><br /><img height="537" alt="定义新测试服务器" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig14.gif" width="488" /><br /></li>
				<li>Process Server 测试服务器启动后，应用程序发布到该测试服务器。在 Integration Developer 的主窗口中，Web 浏览器窗口打开。缺省情况下，它指向 <code>http://localhost:9080/EmailServiceCustomWeb/</code>，如图 23 所示。<br /><br /><a name="N10492"><b>图 23. WebSphere Integration Developer 内的 Web 浏览器</b></a><br /><img height="291" alt="WebSphere Integration Developer 内的 Web 浏览器" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig15.gif" width="576" /><br /></li>
				<li>在 Web 浏览器屏幕中，输入 4 个输入请求参数的值，然后单击 <b>Enter</b>。请记住输入电子邮件服务器的名称和您自己的电子邮件地址。（作者不希望得到所有这些测试电子邮件！） 
</li>
				<li>如果一切进展顺利，您将看到在 Web 页面下部输出的消息“Result is: true”。验证 JSP 是否成功调用了业务流程。JSP 调用您创建的独立引用，独立引用反过来调用迁移的业务流程和 Java 服务。当收件人接收到电子邮件时测试完成，如图 24 所示。 <br /><br /><a name="N104AD"><b>图 24. 测试电子邮件</b></a><br /><img height="274" alt="测试电子邮件" src="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/images/fig16.gif" width="576" /><br /><br /><p><b>请注意：</b>如果您关闭了 AutoBuild 选项，可以再次启用（<b>Integration Developer Main Menu -&gt; Project -&gt; Build Automatically</b>）。</p></li>
		</ol>
		<p>您已经通过三种不同方式成功测试了迁移的应用程序，这就在环境中为您准备了一个完整的端到端场景。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0509_iyengar/0509_iyengar.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N104CA">
						<span class="atitle">
								<font face="Arial" size="4">结束语</font>
						</span>
				</a>
		</p>
		<p>本文介绍了如何迁移发送电子邮件的简单业务流程，如何在 WebSphere Process Server 运行时运行该业务流程，以及如何测试迁移的流程。从 WebSphere Studio Application Developer Integration Edition v5.1.x 迁移一个简单的服务项目以使其在 WebSphere Integration Developer v6.0 中工作是相当简单的，当服务项目具有一个项目文件（如 EmailService 示例和一些简单的 Java 代码）时尤为如此。我们了解这不是一个典型的 BPEL 业务流程示例，但是使用它在 Integration Developer 中引入了迁移向导并体验了源构件迁移。我们希望实际的迁移项目使用迁移向导，但是它也会涉及到大量的手动迁移工作。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/6888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-05-10 20:10 <a href="http://www.cppblog.com/zhangji198543/archive/2006/05/10/6888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大赛推荐文章之二-----下一代模型驱动开发</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/21/6046.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Fri, 21 Apr 2006 11:46:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/21/6046.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/6046.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/21/6046.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/6046.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/6046.html</trackback:ping><description><![CDATA[
		<blockquote>本文跟踪了IBM Rational 自动化建模工具的发展历程，描述了IBM Rational Software Architect的高级能力，并且帮助读者决定他们是否可以从过渡到这个工具而获利。另外，文章中也讨论了在 IBM基于 Eclipse的软件开发平台(Software Development Platform)中使用集成工具的优势。 </blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<img height="173" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/cernosek/images/image001.jpg" width="260" align="right" border="0" />
		<p>在2004年10月， IBM 发布了 IBM® Software Development Platform, 包括新一代的建模和模型驱动开发 (MDD) 工具。IBM Rational® Software Architect是该次发布的设计和构建的中心，是一个为了建立构架良好的应用和服务，与 Unified Modeling Language (UML)一起支持MDD的广泛的、集成的设计和开发产品。</p>
		<p>Rational Software Architect 支持使用现代软件工业技术的应用和Web 开发（静态的和动态的），包括：</p>
		<ul>
				<li>Java 2, Enterprise Edition™ (J2EE) 和 Web services 技术 
</li>
				<li>对象管理组织 (OMG)的模型驱动体系架构 (MDA) 和面向服务的体系架构 (SOA) 
</li>
				<li>JavaServer™ Faces (JSF)支持快速应用开发的能力 
</li>
				<li>支持基于资产开发的可重用资产规范 (RAS) </li>
		</ul>
		<p>Rational Software Architect包括IBM Rational Application Developer for WebSphere Software (IBM WebSphere® Studio Application Developer产品的最新版本) 的所有能力，并且将他们增加到MDD技术中。结果：打包在单个产品中的一个集成的设计和开发解决方案。</p>
		<p>本文的目的是从发展演化的角度来讨论Rational Software Architect，这是一个支持显著区别于那些由先前MDD产品支持的工作流和使用情景的下一代MDD产品。请注意这并不是Rational Software Architect的使用指南；IBM Rational计划不久将出版一部指南。</p>
		<p>
				<a name="N10056">
						<span class="atitle">
								<strong>
										<font size="4">IBM Rational 建模工具的演化</font>
								</strong>
						</span>
				</a>
		</p>
		<p>为了理解Rational Software Architect 建模产品演化的规模，让我们简单回顾IBM Rational产品在这个方面的历史。</p>
		<p>
				<b>Rational Rose</b>
		</p>
		<p>IBM Rational Rose® 软件已经并且继续成为一个市场主导的可视化建模工具。它是一个独立的工具，在应用程序接口(API)层与市场主导的IDE结合，来支持各种编程语言和其它实现技术。然而，尽管Rational Rose已取得一定的成功，也推进了UML建模实践，但是仍然只有一小部分开发人员按照规定使用建模，Rational也已经尝试培训更多的人员。但是大多开发人员不想放弃他们的IDE而去使用额外的工具；他们想将可视化建模集成在IDE里面。</p>
		<p>
				<b>Rational XDE</b>
		</p>
		<p>为了满足这个需要，在2002年，IBM Rational推出了Rational XDE?软件，为当时出现的编程技术（Java 和 Microsoft .NET）提供了一个扩展的开发环境。我们把Rational XDE看成Rational Rose的下一代；严格地说，它并不是新版本的Rose（因而名字发生了变化），而且也未必取代Rose，因为我们有目的地限制Rational XDE只支持一定的IDE和实现技术。</p>
		<p>通过将Rational XDE构造成流行IDE的插件，我们鼓励大量开发人员采用建模和模型驱动开发。Rational XDE通过支持功能强大的引擎，允许基于模式的开发，也推进了MDD的发展；另外，也使得软件设计层复用达到一个新的高度。之后加入了具体的定制化的能力，为IBM Rational对 MDA提供了早期的支持（(请参见下面的"对于模型驱动的体系结构的支持")。</p>
		<p>2003年10月，合并到IBM之后，我们将Rational Rose 和 Rational XDE产品线加固到一个家族 -- IBM Rational Rose XDE Developer -- 这样，无论用户倾向于使用独立的建模工具还是一个直接集成在他们IDE的工具，他们都可以购买工具包，并根据自己的需要进行安装。</p>
		<p>
				<b>与Eclipse前所未有的结合的机会</b>
		</p>
		<p>即使在IBM并购Rational软件之前，这两个组织也是合作伙伴，致力于开发新的、更强大的方法来将MDD的能力集成进Eclipse框架和基于Eclipse的IDE 。这项工作早期的成果是在2003年添加到WebSphere Studio Application Developer中的轻量级作用的代码可视化和可视化编辑特性，这些特性是开发Java实施层模型的非常有效的方法。</p>
		<p>该技术现在是IBM开发MDD工具的基础。不再是简单地与Eclipse集成，我们正在Eclipse之上构建新的MDD能力。这为Java 和 C/C++开发提供了前所未有的支持，也为集成其它生命周期工具提供了全新的能力。我们在2004年10月发布了新的工具，基于Eclipse的IBM Software Development Platform的远景逐渐变成现实。我们现在提供了软件开发的完整的集成平台，充分满足开发团队中每个角色的需要。软件开发可以真正成为一个核心业务流程，为我们的客户提供竞争的优势，新的收益和市场机会。</p>
		<p>使用Eclipse我们现在能够为建模产品实现更深入和广泛的集成。我们能够影响基于角色的用户接口和工具扩展性；能够更好地将建模与生命周期的其它方面集成，比如需求管理。Rational Software Architect将先前定义的建模、开发和代码分析的实践转换成集成的、统一的设计和开发经验。在一个开放，而不是专有的环境中工作，所有的用户都可以更容易地根据需要定制他们的产品。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/cernosek/#main">
																				<b>
																						<font face="Verdana" color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10086">
						<span class="atitle">
								<strong>
										<font size="4">Rational Software Architect：集成的设计和开发</font>
								</strong>
						</span>
				</a>
		</p>
		<p>我们这个新的、基于Eclipse的Rational Software Architect是一个完整的设计和开发工具解决方案。如同我们前面所提及，它包括Rational Application Developer for WebSphere Software (WebSphere Studio Application Developer的新版本) 的所有能力，拥有代码可视化和可视化编辑特性；它是客户开始使用MDD的一个很好的入口。另外，它还包括Rational Web Developer for WebSphere Software (以前的 WebSphere Studio Site Developer) 全部的、更新的能力。</p>
		<p>Rational Software Architec在Rational Application Developer的特性上构建，增加了对MDD的全力支持，包括UML 2建模、代码生成、模式、模型转换，以及实现 MDA开发风格的新途径。它并不是一个全新的产品，是特别为想要应用MDD的客户而设计的，展示了自然的演化和在IBM Rational工具中已拥有的能力。它特别为试图广泛应用MDD的用户而打包。</p>
		<p>
				<b>结构检查和控制</b>
		</p>
		<p>我们已经从客户处了解到，无论你将应用系统设计和构建得多么好，也总会在实现阶段经历代码层的演化，出现未检查的现象，最终导致架构性能的降低，严重影响软件的质量。</p>
		<p>针对这个现象，软件架构师在实现之前检查已有的代码，以评估其真实的体系结构和质量。做这项工作的过程中，他们往往发现各种各样的问题：从设计到代码的不正确映射；代码级的改变引起设计和架构的依赖；编码标准、规则和样式方面不规范等。最终，应用系统的架构是由部署的代码来呈现的，所以软件架构师必须分析代码，以估计它的可维护性，并且在规则的辅助下，掌握架构的演化。</p>
		<p>为了给这样的分析提供更自动的支持，Rational Software Architect引入了"Java 应用结构的检查和控制"特性。它支持基于模板的规则，并且使用高级别的软件可视化技术，允许用户看到J2EE 和 J2SE实现的架构。用户可以更容易地发现架构的不足之处，或者"反模式"，比如循环依赖、集线器之类的一些已逐渐加入到应用程序源代码中的问题。</p>
		<p>通过代码可视化和开发人员级别的测试，进行自动结构的检查和控制之后，软件架构师能够显著地提高他们所设计和部署的应用系统的质量。我们在Rational Software Architect中引入的先进特性将开始改变架构师和开发人员考虑开发过程的方法。</p>
		<p>
				<b>运行时支持和语言支持</b>
		</p>
		<p>客户已经告诉我们，在应用的运行时支持环境中设计和开发工具所扮演的重要角色。Rational Software Architect在WebSphere应用服务器上为Java应用提供了极大的运行时支持；它也允许由开放工业标准支持的Java虚拟机和数据相互操作性的多平台执行支持。此外，因为Rational Software Architect 包括支持BEA WebLogic Server的Rational Application Developer，所以，使用Rational Software Architect部署的应用也是隐式的多平台。Eclipse C/C++ Development Tool (CDT)作为IBM Rational Software Architect的一部分而打包在内，同时也扩展了对C和C++开发的支持。基于Eclipse的解决方案允许我们在Rational Software Architect中复用一些特性，来支持上述语言和JAVA中的MDD。</p>
		<p>
				<b>培养现代建模生态系统</b>
		</p>
		<p>我们最近了所发布了一系列Rational Software Architect，为不需要代码生成或者可视化的用户着重建模和设计这两方面。Rational Software Modeler支持UML 2的所有建模特性，并且通过Eclipse Modeling Framework (EMF)提供高级扩展的特性。Eclipse框架的开放性和健壮的扩展性使Rational Software Modeler适合支持曾为Rational Rose的成功作出一些贡献的、支持与生态系统类似的客户和第三方扩展的建模"生态系统"。</p>
		<p>Rational Software Architect 和 Rational Software Modeler只是IBM Software Development Platform之后阐明策略的两个实例：帮助业务自动化并集成软件开发。我们希望各角色的实践者都能够拥有他们所创建和获得的单一的用户体验，通用的定义和资产的管理。团队的每个人都能够简单地选择与他们角色和责任相匹配的产品。IBM Software Development Platform是关于团队和组织生产率的。</p>
		<p>
				<b>对模型驱动架构的支持</b>
		</p>
		<p>MDD为使用模型开发软件展示了许多风格，其中，模型驱动体系架构（MDA）是由对象管理组织 (OMG).<a href="http://www-128.ibm.com/developerworks/cn/rational/cernosek/#1"><font color="#996699">1</font></a>创建的。MDA基于一些OMG标准之上，包括Unified Modeling Language (UML 2)，以及涌现出来的关于如何最好地将建模应用到软件开发过程的哲理。MDA在抽象层定义了模型，然后定义映射和管理模型与各种实现技术之间关系的转换。以下是一些有用的MDA建模层的定义：</p>
		<ul>
				<li>计算无关模型 (Computation-Independent Model , CIM) - 不考虑结构或者处理的情况下，处理系统环境和需求。 
</li>
				<li>平台无关模型 (Platform-Independent Model , PIM) - 不考虑与特定平台相关的细节，处理系统的操作。 
</li>
				<li>平台相关模型 (Platform-Specific Model, PSM) - 将PIM和与特定平台相关的细节结合起来。 
</li>
				<li>平台模型 (Platform Model, PM) - 对于使用 PIM 定义组成特定平台的技术概念、元素和服务。 
</li>
				<li>转化模型（Transformation Model, TM）- 定义并指定从特定PIM转换到PSM所需的转换。 
</li>
				<li>
				</li>
				<li>
				</li>
				<li>
				</li>
		</ul>
		<p>尽管MDA并不是一个标准，它明确提倡使用一些已有的OMG标准。MDA指定了：</p>
		<ul>
				<li>Meta-Object Facility (MOF)用于定义元模型。 
</li>
				<li>UML 2用于指定应用开发模型和转化。 
</li>
				<li>MOF Query / View / Transform (QVT)用于指定转化（一旦它被规范化）。 </li>
		</ul>
		<p>一些客户称他们已经在应用MDA很长时间，并且IBM Rational员工与他们中的许多一起工作 - 以及OMG - 将MDA演化成当前状态。Rational Software Architect支持MDA的理论，也支持MDA建立的基本标准。</p>
		<p>但是，我们不能将Rational Software Architect归为一个MDA工具，因为在某种程度上，MDA并不是一个标准，而且仍有一些争论。更重要的是，Rational Software Architect实际上支持一系列以代码为中心的、基于向导的设计和开发范例。换而言之，它支持MDA及其它的开发风格。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/cernosek/#main">
																				<b>
																						<font face="Verdana" color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100F3">
						<span class="atitle">
								<strong>
										<font size="4">Rational Software Architect是否适合于你？</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Rational Software Architect是IBM用于建模和模型驱动开发的最完整、最健壮的解决方案。但是它是否适合你？以下选择将帮助你回答这个问题。</p>
		<p>
				<b>你是否从事软件架构的工作？</b>
		</p>
		<p>我们近期发布的产品区分软件架构师与软件开发人员，以及软件架构师与数据架构师这几个角色。例如，这个更大的粒度反映在高度面向角色的IBM Software Development Platform的所有工具中。构建进我们产品名称中的角色定义和区别可以帮助用户基于他们的活动和责任，决定哪些工具最好地适合于不同的员工。但是，角色名字在企业、组织甚至项目线中变化，所以你应该把我们新产品的名称当作决定什么工具对开发团队的哪些人员最有用的起点。</p>
		<p>软件架构师是开发团队中负责作出主要技术决定的人员。有时，是由一个人来负责，而这个人常常是项目的开发的领导人；有时，几个人，可能有一个来充当主要架构师，共同来承担这个角色；还有的时候，团队的所有开发人员在架构能力的同一时间操作-一个增长的趋势。经常地，较之他们的工作职位，架构师的概念往往与开发者关联更多些。 </p>
		<p>软件架构师的职责包括识别并记录应用架构的方面，包括需求、设计、实现和部署。这些方面需要不同的，但相关的应用视图。当然，在开始的架构设计和实际构建架构（真正在代码中运行的架构）之间也有区别。我们认为软件架构师需要一个帮助他们定义所需架构的工具，允许他们发现应用系统的真实架构，并且帮助他们协调两种视图。</p>
		<p>Rational Software Architect能够完成这些所有的工作。它包括开发和查看实现中的帮助，以及维护和控制实现来保持架构集成。</p>
		<p>如同我们上面所提到的，做架构工作的人员往往并不是架构师。可以从使用Rational Software Architect过程中获益的团队人员有：</p>
		<ul>
				<li>需要开发代码的软件架构师。 
</li>
				<li>需要理解并参与代码和模型工作的开发人员。 
</li>
				<li>想要充分应用MDD能力的人员 
</li>
				<li>那些负责检查和确认已有的架构或者想要看到架构演化的实施过程的人员 
</li>
				<li>想在Eclipse 之上应用MDD的C++开发人员。 </li>
		</ul>
		<p>请记着，Rational Software Architect包括Rational Application Developer的全部能力，一个完全的IDE。客户得到打包进一个产品的完整的设计和构建解决方案。针对那些要求UML 2建模能力而不需开发架构的用户，我们提供了Rational Software Modeler。</p>
		<p>
				<b>你是否使用IBM Rational的其它建模产品？</b>
		</p>
		<p>如果你已在使用IBM Rational软件，建议你有必要时，考虑移植到Rational Software Architect 或者 Rational Software Modeler。这些新产品的优点包括：</p>
		<ul>
				<li>Eclipse 集成 
</li>
				<li>通过EMF的高级建模和工具扩展性。 
</li>
				<li>更容易使用。 
</li>
				<li>UML 2, 最新的建模技术。 
</li>
				<li>Rational Software Architect中的新的结构检查和控制特性。 
</li>
				<li>Eclipse之上，使用C++的MDD。 
</li>
				<li>建立复杂转化的能力。 
</li>
				<li>以静态次序图表方法可视化代码的能力。 
</li>
				<li>代码检查的能力。 
</li>
				<li>在Rational Software Architect中使用Java IDE和MDD工具。 </li>
		</ul>
		<p>如果你的团队当前在使用Rational Rose 或者 Rational XDE，那么对你而言，移植到Rational Application Developer也是有道理的。WebSphere Studio Application Developer的代码可视化和可视化编辑特性已升级到UML 2并且在Rational Application Developer中继续存在。尽管它不支持通用建模或者完全的MDD，却支持UML入门级的使用。如果你正使用Rational Rose 或者 Rational XDE，主要为了从代码中截取图形文档，那么这个级别的UML支持就有可能满足了你的需要。</p>
		<p>对于Java和Web开发，我们鼓励用户从当前建模工具过渡到Rational Software Architect。除了移植到基于Eclipse的工具的技术优势，IBM还提供了一系列移植和升级的途径。请参照<a href="http://www.ibm.com/software/awdtools/architect/swarchitect/support/index.html"><font color="#5c81a7">http://www-306.ibm.com/software/awdtools/architect/swarchitect/support/index.html</font></a> 以了解最新升级的支持信息。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/6046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-21 19:46 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/21/6046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大赛推荐文章之一-----以服务为中心的企业整合</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/21/6045.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Fri, 21 Apr 2006 11:43:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/21/6045.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/6045.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/21/6045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/6045.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/6045.html</trackback:ping><description><![CDATA[
		<p>
				<a name="N10059">
						<span class="atitle">
								<strong>
										<font size="4">引言</font>
								</strong>
						</span>
				</a>
		</p>
		<p>本文讨论企业整合(集成)的新发展：以服务为中心的集成（Service-Oriented Integration，简称 SOI）。 您将了解到什么是 SOI，推动 SOI 发展的因素以及SOI 带来的价值。作者讨论了 SOI 解决方案所涉及的要素，和这些要素相关的技术、标准以及IBM的产品支持，最后作为总结将它们包括在 IBM 的集成参考架构中，指出如何实现各种集成需求。本文还讨论了在企业集成实践中需要重点注意的事情，如战略规划和IT管理。本文的姊妹篇<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soi2/"><font color="#5c81a7">"以服务为中心的企业整合－案例分析"</font></a>，用一个实际案例来说明基于 IBM 产品的实际 SOI 应用，帮助读者感性地理解 SOI。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soi1/#main">
																				<b>
																						<font face="Verdana" color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10066">
						<span class="atitle">
								<font size="4">
										<strong>1. 企业集成的新方向： SOI</strong>
								</font>
						</span>
				</a>
		</p>
		<p>
				<a name="N1006C">
						<span class="smalltitle">
								<strong>什么是"以服务为中心的集成"？</strong>
						</span>
				</a>
		</p>
		<p>"以服务为中心的集成"是英文词语"Service-Oriented Integration"的中文翻译，简称 SOI。 它可以定义为：在"以服务为中心的体系架构"（Service-Oriented Architecture，SOA）中，通过服务的交互来集成各企业的 IT 资源，如分布的应用或者数据，帮助企业 IT 部门将已有但老旧而不灵活的系统集成起来，释放其中功能或数据为可重用的服务与业务流程。</p>
		<p>
				<a name="N10075">
						<span class="smalltitle">
								<strong>为什么需要"以服务为中心的集成"？</strong>
						</span>
				</a>
		</p>
		<p>
				<strong>企业集成的推动因素。</strong>推动"企业应用集成"（Enterprise Application Integration, EAI ）的因素，来自商务和技术两个方面。从商务的角度，今天企业要在全球化的经济环境中求生存和发展，就必须努力适应越来越强的竞争和越来越快的变化，这意味着一个企业的业务模型要变得灵活以快速应变，也就是随需应变。在一个企业的业务模型变得灵活的转型过程中，需要将业务流程不断地自动化，然后跨部门横向集成它们，并且管理和优化它们，这意味着支撑这些流程的技术基础，即 IT 应用和数据资源等，需要在企业范围内集成。所以，业务灵活应变的能力是 SOI 的驱动因素之一。</p>
		<p>在技术方面，IT 部门面临着业务部门越来越高的期望值，就是用更少的钱做更多的事情，但要做得更快、更好，这迫使 IT 部门考虑如何最大程度地重用已有应用的功能和数据资源，来支持新应用的开发。但这种重用面临着如何将高度异构、分布的各个应用集成起来的难题，SOI是目前最有效的解决之道。在 SOI 中，首先各个应用的功能被封装为基于标准来描述和供访问的服务；其次，借助于 SOI 的通用连接能力，这些来自不同应用的服务，不需要关心对方的位置和实现技术，以松散耦合的方式相互交互来完成集成，所以只要服务的接口描述不变，服务的使用者和提供者双方可以自由发生变化而互不影响；最后，通过服务组合，服务可以按不同的方式来组合成为不同的业务流程。当某个业务流程发生变化的时候，大多数时候，我们调整组装服务的方式来满足这种变化。总之，这种通过重用粗粒度服务而不是在底层编程来开发新应用以满足业务新需求的方法，使得 IT 组织能够以更少的投入、更快的速度、更好的质量来开发应用。综上所述，可以灵活应变的重用方式，是 SOI 的另一个驱动因素。</p>
		<p>
				<b>集成解决方案的发展沿革。</b>集成企业应用的方法各种各样，初级一点的借助于简单的机制如应用编程接口，管道、共享目录和文件，或者某些传输协议如 FTP 来交换数据和互操作；高级一点的则使用各种消息中间件来提供消息的传输、转换、合并、路由和分发、事件的发布和订阅等；分布式计算技术，如 CORBA，COM 等，也有较广的使用。</p>
		<p>在初期实践中，应用之间的连接拓扑大多数情况下是点对点的，硬编码的，所使用的协议是非标准的，功能的提供者和使用者之间是紧耦合的，功能的粒度通常较细，数据的表示也不统一。随着集成复杂度的增长，和实践经验的总结，开始出现一些从好的实践中总结出来的集成模式，如消息中枢（Message Backbone）、信息总线、应用集成中心（Application Integration Hub），这些模式从不同的角度以不同的方式来管理集成的复杂性，但都或多或少地尝试提供一个集成基础设施来简化应用之间日趋复杂的连接拓扑，提供异构数据和功能访问方式之间的转换，甚至提供一致的数据和功能表示与访问方式。通过元数据和应用相关的领域知识，这些集成基础实施提供了很多中介和转换的机制与模式来实现高级的功能，如路由、动态选择等能力。</p>
		<p>随着互联网络技术的发展、普及和应用，相关技术和标准，如 XML 和 Web Service，被广为接受，这给应用集成带来了新的发展。企业应用架构的风格开始朝着以服务为中心的方向发展，而企业应用集成也转向以服务为中心的集成，服务的描述和访问基于开放一致的标准（如 WSDL），连接应用的基础设施继承了过去发展的成果，并通过支持开放标准，来提供通用的连接服务，包括基本的服务如消息传输、转换，事件的发布和订阅，服务的中介（选择、路由），和高级的服务如安全、事务、服务质量，以及可管理性，来使得服务在一个标准、开放、可靠、安全、可管理、满足服务质量要求的环境下，以松散耦合的方式相互交户，根据需求动态地进行企业应用集成，达成非常高程度的灵活应变能力和重用能力。SOI 是对现有集成技术与实践的总结和标准化。</p>
		<p>
				<b>SOI 的好处。</b>SOI 继承和发展了传统的 EAI，比较而言，SOI 的好处在于:</p>
		<ul>
				<li>定义良好而又基于标准的接口 - 服务的描述易于理解，而且标准一致 
</li>
				<li>实现技术和位置的透明 - 提供服务功能的应用，它的位置以及所使用的实现技术被接口所屏蔽，事实上，不需要一个固定的服务提供者 
</li>
				<li>灵活性 - 只要服务的接口不变，服务的提供者和服务的使用者都可以变化而不影响彼此，从而将变化带来的影响减少到了最少 
</li>
				<li>重用能力 
</li>
				<li>渐进式集成 - 在 SOI 中，通过将若干已有系统的相关功能转化为服务来进行集成。随着这些项目的进行，可重用的服务越来越多，最终，新的集成需求将绝大多数可以通过已有的服务来完成。所以，我们可以从当前重要的集成需求开始来封装已有系统的功能和开发必要的新服务，以渐进的方式逐步地扩展到整个企业范围内的集成。更重要的是，由于服务的灵活性，即使已有系统迁移到新的技术平台，甚至是被替代，都不会影响到依赖于这个应用所提供功能的那些应用，从而保证了集成对变化的适应能力，使得业务灵活性有一个坚实的基础。这也意味着从传统规模大、投入大、周期长、见效慢、风险高、专有技术，转向小步快跑、见效迅速、风险低、基于标准的集成方式。这对于如今面对业务需求快速变化的 IT 机构来说，SOI 在投入和工程方面的好处，是非常吸引人的 </li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soi1/#main">
																				<b>
																						<font face="Verdana" color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100A5">
						<span class="atitle">
								<font size="4">
										<strong>2. SOI解决方案</strong>
								</font>
						</span>
				</a>
		</p>
		<p>
				<a name="N100AB">
						<span class="smalltitle">
								<strong>2.1. SOI解决方案的要素</strong>
						</span>
				</a>
		</p>
		<p>通常，完整的SOI 解决方案包括如下要素：</p>
		<ul>
				<li>代表应用的功能和数据资源的服务； 
</li>
				<li>提供连接服务的基础设施即企业服务总线（Enterprise Service Bus, ESB），连接已有应用的连接器（Connector）和适配器（Adapter）； 
</li>
				<li>元数据及其管理如服务描述和服务注册管理（Service Registry）等； 
</li>
				<li>将服务组合成业务流程的引擎如 BPEL4WS 引擎； 
</li>
				<li>业务流程管理和业务绩效管理的部分； 
</li>
				<li>一个基于标准的编程模型以及支持它的建模、开发和组装、测试、部署和管理的端到端工具环境； </li>
		</ul>
		<p>IBM的 Websphere 业务集成参考架构(见图1，以下称参考架构)是典型的以服务为中心的企业集成架构，本文接下来的讨论都将以此参考架构为背景进行。</p>
		<br />
		<img height="337" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soi1/images/1.gif" width="483" border="0" />
		<br />
		<p>以服务为中心的企业集成采用"关注点分离"(Separation of Concern)的方法规划企业集成中的各种架构元素，同时从服务视角规划每种架构元素提供的服务，以及服务如何被组合在一起完成某种类型的集成。这里架构元素提供的服务既包括狭义的服务（WSDL描述），也包括广义的服务（某种能力）。从服务为中心的视角看来，企业集成的架构按图1所示的方式划分为六大类：</p>
		<ul>
				<li>业务逻辑服务(Business Logic Service)：包括用于实现业务逻辑的服务，和执行业务逻辑的能力。这其中包括业务应用服务(Business Application Service)、业务伙伴服务(Partner Service)以及应用和信息资产(Application and Information asset)。 
</li>
				<li>控制服务(Control Service)：包括实现人(people),流程(process)和信息(information)集成的服务，以及执行这些集成逻辑的能力。 
</li>
				<li>连接服务(Connectivity Service)：连接服务通过提供企业服务总线提供分布在各种架构元素中服务间的连接性。 
</li>
				<li>业务创新和优化服务(Business Innovation and Optimization Service)：用于监控业务系统运行时服务的业务性能，并通过及时了解到的业务性能和变化，采取措施适应变化的市场。 
</li>
				<li>开发服务(Development Service)：贯彻整个软件开发生命周期的开发平台，从需求分析，到建模、设计、开发、测试，维护全面的工具支持。 
</li>
				<li>IT服务管理(IT Service Management)：支持业务系统运行的各种基础设施管理能力或服务，如安全服务、目录服务、系统管理和资源虚拟化。 </li>
		</ul>
		<p>
				<a name="N100F5">
						<span class="smalltitle">
								<strong>2.2. 连接服务 - 企业服务总线</strong>
						</span>
				</a>
		</p>
		<p>企业服务总线(Enterprise Service Bus)，以下简称ESB, 是过去消息中间件的发展，ESB 采用了"总线"这样一种模式来管理和简化应用之间的集成拓扑结构，以广为接受的开放标准为基础来支持应用之间在消息、事件和服务的级别上动态地互联互通。</p>
		<p>ESB 的基本特征和能力包括：描述服务的元数据和服务注册管理；在服务请求者和提供者之间传递数据，以及对这些数据进行转换的能力，并支持由实践中总结出来的一些模式如同步模式，异步模式等；发现、路由、匹配和选择的能力，以支持服务之间的动态交互，解耦服务请求者和服务提供者。高级一些的能力，包括对安全的支持、服务质量保证、可管理性和负载平衡等。</p>
		<p>ESB 所提供的基于标准的连接服务，将应用中实现的功能或者数据资源转化为服务请求者能以标准的方式来访问的服务；当请求者来请求一个服务时，ESB 中这种中介转化过程可能简单到什么也没有，也可能要很复杂的中介服务支持，包括动态地查找、选择一个服务，消息的传递、路由和转换、协议的转换。这种中介过程，是 ESB 借助于服务注册管理以及问题域相关的知识（如业务方面的一些规则等）自动进行的，不需要服务请求者和提供者介入，从而实现了解耦服务请求者和提供者的技术基础，使得服务请求者不需要关心服务提供者的位置和具体实现技术，双方在保持接口不变的情况下，各自可以独立地演变。</p>
		<p>所以，ESB 采用总线结构模式简化了应用之间的集成拓扑，通过源自实践的模式，提供了基于标准的通用连接服务，使得服务请求者和服务提供者之间可以以松散耦合、动态的方式交互，从而在不同层次上使得SOI 解决方案是一个松散耦合、灵活的架构。</p>
		<p>需要注意的是，ESB 是一种架构模式，不能简单地等同于特定的技术或者产品，但实现 ESB 确实需要各种产品在运行时和工具方面的支持。IBM 有很好的产品支持，运行时支持包括 WebSphere ESB 和 WebSphere Message Broker；而工具方面 IBM 则有 WebSphere Integration Developer，支持用户以图形界面的方式来完成相关的开发任务，如发布服务，使用各种模式，转换消息，定义路由等等。</p>
		<p>
				<a name="N1010A">
						<span class="smalltitle">
								<strong>2.3. 业务逻辑服务</strong>
						</span>
				</a>
		</p>
		<p>
				<strong>整合已有应用 - 应用和信息访问服务。</strong>已有应用和信息是实现业务逻辑和业务数据的重要资产。通过集成已有的应用和信息将可以在已有企业系统上实现更多增值服务，所以集成已有应用和信息是企业集成中重要的一环。</p>
		<p>以服务为中心的企业集成通过应用和信息访问服务(Application and Information Access Service)来实现对已有应用和信息集成。它通过各种适配器技术将已有系统中的业务逻辑和业务数据包装成企业服务总线支持的协议和数据格式。通过企业服务总线，这些被包装起来的业务逻辑和数据就可以方便的参与上层的业务流程，从而已有应用系统的能力可以得以继续发挥。这里的已有应用包括遗留应用、预包装的应用和各种企业数据存储。在参考架构中，主要有两类访问服务：</p>
		<ul>
				<li>可接入服务(On-Ramp Service): 通过各种消息通信模式(单向、请求/应答和轮询)将业务逻辑和业务数据包装成企业服务总线可以访问的功能。 
</li>
				<li>事件发现服务(Event Detect Service) : 提供事件通知服务将已有应用和数据中的变化通过事件框架发布到企业服务总线上。 </li>
		</ul>
		<p>
				<b>整合新开发的应用 - 业务应用服务。</b>和已有应用和数据类似，新开发的应用也作为重要的业务逻辑成为企业集成的目标。以服务为中心的企业集成通过业务应用服务(Business Application Service)实现新应用集成。一方面业务应用服务帮助程序员开发可重用、可维护和灵活的业务逻辑组件，另一方面，它也提供运行时的集成提供对业务逻辑组件的自治管理。在参考架构中，有三类业务应用服务：</p>
		<ul>
				<li>组件服务(Component Service)：为可重用的组件提供应用的运行时容器管理服务，如对象持久化、组件安全管理和事务管理等。 
</li>
				<li>核心服务(Core Service)：提供运行时的服务，包括内存管理、对象实例化和对象池、性能管理和负载均衡、可用性管理等。 
</li>
				<li>接口服务(Interface Service)：提供和其他企业系统集成的接口，如其他企业应用，数据库、消息系统和管理框架。 </li>
		</ul>
		<p>
				<b>整合客户和业务伙伴（B2C/B2B）－伙伴服务。</b>以服务为中心的企业集成通过伙伴服务提供与企业外部的B2B的集成能力。因为业务伙伴系统的异构性，伙伴服务需要支持多种传输协议和数据格式。在参考架构中，提供如下服务：</p>
		<ul>
				<li>社区服务(Community Service): 用于管理和企业贸易的业务伙伴，支持以交易中心(Trade Hub)为主的集中式管理和以伙伴为中心的自我管理。 
</li>
				<li>文档服务(Document Service)：用于支持和业务伙伴交换的文档格式，以及交互的流程和状态管理，支持主流的RosettaNet、EDI和AS1/AS2等。 
</li>
				<li>协议服务(Protocol Service)：为文档的交互提供传输层的支持，包括认证和路由等。 </li>
		</ul>
		<p>
				<a name="N10143">
						<span class="smalltitle">
								<strong>2.4. 控制服务</strong>
						</span>
				</a>
		</p>
		<p>
				<strong>数据整合－信息服务。</strong>企业数据的分布性和异构性是应用系统方便访问企业数据和在企业数据之上提供增值服务的主要障碍。数据集成和聚合技术在这种背景下诞生，用于提供对分布式数据和异构数据的透明访问。</p>
		<p>以服务为中心的企业集成通过信息服务提供集成数据的能力，目前主要包括如下集中信息服务：</p>
		<ul>
				<li>联邦服务(Federation Service): 联邦服务提供将各种类型的数据聚合的能力，它既支持关系型数据，也支持象XML数据、文本数据和内容数据等非关系型数据。同时，所有的数据仍然在自己本身的方式管理。 
</li>
				<li>复制服务(Replication Service)：复制服务提供远程数据的本地访问能力，它通过自动的实时复制和数据转换，在本地维护一个数据源的副本。本地数据和数据源在技术实现上可以是独立的。 
</li>
				<li>转换服务(Transformation Service)：转换服务用于数据源格式到目标格式的转换，可以是批量的，或者是基于记录的。 
</li>
				<li>搜索服务(Search Service)：提供对企业数据的查询和检索服务，既支持数据库等结构化数据，也支持象PDF等非结构化数据。 </li>
		</ul>
		<p>
				<b>流程整合- 流程服务。</b>企业部门内部的IT系统通过将业务活动自动化来提高业务活动的效率。但是这些部门的业务活动并不是独立的，而是和其他部门的活动彼此关联的。勿容置疑，将彼此关联的业务活动组成自动化流程可以进一步提高业务活动的效率。业务流程集成正是在这一背景下诞生的。</p>
		<p>以服务为中心的企业集成通过流程服务来完成业务流程集成。在业务流程集成中，粒度的业务逻辑被组合成业务流程。流程服务提供自动执行这些业务流程的能力。在参考架构中，流程服务包括如下内容：</p>
		<ul>
				<li>编排服务(Choreography Service): 编排服务通过预定义的流程逻辑控制流程中业务活动的执行，并帮助业务流程从错误中恢复。 
</li>
				<li>事务服务(Transaction Service)：事务服务用于保证流程执行中的事务特性(ACID)。对于短流程，通常采用传统的两阶段提交技术，对于长流程，一般采用补偿的方法。 
</li>
				<li>人工服务(Staff Service)：人工服务用于将人工的活动集成到流程中，一方面它通过关联的交互服务使得人工可以参与到流程执行中，另一方面它需要管理由于人工参与带来的管理任务如：任务分派，授权和监管等。 </li>
		</ul>
		<p>
				<b>用户访问整合 - 交互服务。</b>将适当的信息，在适当的时间，传递给适当的人是一直是信息技术追求的目标。用户访问集成是实现这一目标的重要一环，它负责将信息系统中的信息传递给客户，不管它在那里，它以什么样的设备接入。</p>
		<p>以服务为中心的企业集成通过交互服务来实现用户访问集成。参考架构中的交互服务包括如下类型：</p>
		<ul>
				<li>交付服务(Delivery Service): 交付服务提供运行时的交互框架，它通过各种技术支持同样的交互逻辑可以在多种方式(图形界面、语音和普及计算消息)和设备(桌面、PDA、无线终端等)上运行，比如通过页面聚合和标签翻译使得同一个Portlet可以在桌面浏览器和PDA浏览器上展现。 
</li>
				<li>体验服务(Experience Service): 通过用户为中心的服务增强用户体验, 其中的技术包括：个性化、协作、单点登录等。 
</li>
				<li>资源服务(Resource Service): 提供运行时交互组件的管理，如安全配置、界面皮肤等。 </li>
		</ul>
		<p>
				<a name="N10188">
						<span class="smalltitle">
								<strong>2.5. 开发支持</strong>
						</span>
				</a>
		</p>
		<p>企业集成涉及面很广，不仅需要开发新的应用并使其成为可以被用于企业集成的功能组件，而且需要将被包装的已有的应用和数据用于集成；不仅有企业内部的集成，而且需要和企业外部的系统集成；不仅有交互集成和数据集成，还有功能和应用集成。考虑到这其中的每部分在技术上都会涉及到各种平台和中间件，企业集成的技术复杂性是普通应用开发不可比拟的。这种技术复杂性需要更强有力的开发工具支持。企业集成的开发工具需要有标准的工具框架，这些工具能够以即插即用方式支持来自多家厂商的开发工具。同时，企业集成的开发工具需要支持整个软件开发周期，以提高开发过程中各种角色的生产力。</p>
		<p>在以服务为中心的企业集成中，除了需要支持整个软件开发周期和标准的工具框架以外，开发服务需要提供和服务开发相关的技术：</p>
		<ul>
				<li>用于支持以服务为中心的企业集成方法学和建模，如SODA和IBM的SOMA（Service Oriented Modeling and Architecture） 
</li>
				<li>用于服务为中心的编程模型，如WSDL, BPEL4WS,SCA和SDO等 </li>
		</ul>
		<p>开发环境和工具中为不同开发者的角色提供的功能被称为开发服务。根据开发过程中开发者角色和职责的不同，有如下四类服务：</p>
		<ul>
				<li>建模服务(Model Service)：用于构建可视化的业务流程模型 
</li>
				<li>设计服务(Design Service)：根据业务模型，进一步分解为服务组件；设计服务用于设计和开发这些服务组件。 
</li>
				<li>实现服务(Implementation Serivice)：用于将设计和开发的服务组件部署到生产环境中 
</li>
				<li>测试服务(Test Service)：支持服务组件的单元测试和系统的集成测试 </li>
		</ul>
		<p>
				<a name="N101AF">
						<span class="smalltitle">
								<strong>2.6. 业务创新和优化</strong>
						</span>
				</a>
		</p>
		<p>一方面，以服务为中心的企业集成通过各种集成提高信息流转速度，从而提高生产效率。另一方面，以服务为中心的企业集成也为业务创新和优化提供了支持平台－业务创新和优化服务。</p>
		<p>业务创新和优化服务以业务性能管理(BPM)技术为核心提供业务事件发布、收集和关键业务指标监控能力。具体而言，业务创新和优化服务由以下服务组成：</p>
		<ul>
				<li>公共事件框架服务(Common Event Infrastructure Service)：通过一个公共事件框架提供IT和业务事件的激发、存储和分类等。 
</li>
				<li>采集服务(Collection Service)：通过基于策略的过滤和相关性分析检测感兴趣的服务。 
</li>
				<li>监控服务(Monitoring Service)：通过事件与监控上下文间的映射，计算和管理业务流程的关键性能指标(KPI) </li>
		</ul>
		<p>业务创新和优化服务与开发服务是紧密相关联的。在建模阶段被确定的业务流程的关键性能指标被转为特别的事件标志被构建到业务流程中，建模过程中的业务流程也被转换为用于监控服务的监控上下文。在业务流程执行过程中，这些事件标志激发的事件被公共事件框架服务截获，经过采集服务的过滤被传递给监控服务用于计算关键性能指标。关键性能指标作为重要的数据被用于重构或优化业务流程。这种迭代的方法使得业务流程处于不断的优化中。</p>
		<p>
				<a name="N101CA">
						<span class="smalltitle">
								<strong>2.7. 管理支持</strong>
						</span>
				</a>
		</p>
		<p>为业务流程和服务提供安全、高效和健康的运行环境也是以服务为中心的企业集成重要的部分，它由IT服务管理来完成。IT服务管理包括如下两部分：</p>
		<p>安全和目录服务(Security and Directory Service)：企业范围的用户、认证和授权管理，如单点登录(SSO)；系统管理和虚拟化服务(System Management and Virtualization Service)：用于管理服务器，存储、网络和其他IT资源。</p>
		<p>IT服务管理中相当一部分服务是面向软硬件管理的，而另外一部分服务，特别是安全和目录服务，以及操作系统和中间件管理，会通过企业服务总线和其他服务集成在一起，用于实现业务流程和服务的非功能性需求，如性能、可用性和安全性等。</p>
		<p>
				<a name="N101D9">
						<span class="smalltitle">
								<strong>2.8. SOI中技术标准和IBM产品支持</strong>
						</span>
				</a>
		</p>
		<p>下面的表格列出乐SOI架构元素中的技术标准，和IBM的产品如何支持这些架构元素。</p>
		<br />
		<a name="N101E4">
				<b>表 1：SOI架构元素中的技术标准以及支持架构元素的IBM的产品</b>
		</a>
		<br />
		<img height="514" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soi1/images/2.gif" width="651" border="0" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soi1/#main">
																				<b>
																						<font face="Verdana" color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101F4">
						<span class="atitle">
								<strong>
										<font size="4">3. SOI 实践</font>
								</strong>
						</span>
				</a>
		</p>
		<p>企业集成首先是一个战略性的活动，在我们的经验中，有很多的企业将重点放在集成技术上，这导致了很多失败的案例。作为一个战略性的活动，企业集成首先要从全局出发，制定整个企业集成的策略。这种策略包括业务目标，集成路线图，技术规范，和对开发管理提出的新要求。</p>
		<p>企业集成的目的是为了整合 IT 资源，形成一个灵活的 IT 基础设施，来满足业务随需应变的要求。所以要充分考虑业务面的压力和痛点，未来发展和转型对 IT 带来的新需求，以确定集成的战略目标。在环境发生变化时，要随业务面的调整作必要的修改。在我们的观察中，企业 IT 组织往往由于缺乏高级业务管理人员的参与，而无法制定与业务对齐的集成战略，失去企业集成赖以成功的最重要的基础。</p>
		<p>在制定集成的战略目标后，要根据目标的优先级，考察当前 IT 环境，确定集成远景，分析差距，定义集成路线图。考察当前可得到的技术、产品、相关技能和服务的可获得状况，定义高层技术规范，包括集成方法、参考架构、技术和产品的选择标准、所遵循的业界标准等等。然后结合人力、物力和资金的投入情况，导出项目群。在我们的观察中，很多企业为了应付业务需求，匆忙上马，缺乏统一规划，导致企业 IT 架构越来越混乱，不能适应业务的变化而日渐被动。</p>
		<p>由于集成是一个企业范围内的活动，一个集成项目往往影响若干个部门，其结果也由多个部门所共享使用，所以需要企业级的协调机制。这要求企业调整其已有的 IT 管理（IT Governance）机制，要有一个角色来协调集成项目，并被授权，利用 IT 开发管理的过程，保证相应集成规范得到执行。</p>
		<p>另外值得注意的是关于成熟度的考虑，不同企业有不同的成熟度，包括业务本身、IT 系统、IT 组织自身在技能和管理方面，它们的成熟度，对企业集成的成功与否，也都有很大的影响。对成熟度的考察，会帮助我们制定更稳健、实际的集成策略。</p>
		<p>服务建模（Service Modeling）是 SOI 活动中至关重要的活动。它包括如何找到和确定服务，如何处理服务的粒度，如何通过服务体现和实现业务目标，如何详细说明服务，如何确定服务与已有系统的关系等。在我们的实践中，这对很多 IT 组织机构都是一个难题，可以考虑一些专业公司的培训，如 IBM SOA 设计中心基于丰富的实践所提供的各种服务。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soi1/#main">
																				<b>
																						<font face="Verdana" color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1020C">
						<span class="atitle">
								<strong>
										<font size="4">4. 结束语</font>
								</strong>
						</span>
				</a>
		</p>
		<p>以服务为中心的企业集成方法是对以往企业集成技术的继承与发展。它基于关注点分离、松散耦合等源自最佳实践的架构原则，继承了EAI，消息总线，流程集成，数据集成等优秀技术，结合以服务为中心（Service Orientation）的先进思想，正在给企业集成领域带来巨大的变化。随着SOI及相关技术的逐渐成熟，SOI正在成为企业集成的新方向。本文的姊妹篇<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soi2/"><font color="#5c81a7">"以服务为中心的企业整合－案例分析"</font></a>，将用一个实际案例来说明基于 IBM 产品的实际 SOI 应用，帮助读者感性地理解 SOI。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/6045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-21 19:43 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/21/6045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>观点与展望，第 1 部分: 选择 SOA 的原因和时机-----IBM 技术带头人回答有关 IT 体系结构的各种亟待处理的问题</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5726.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:22:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5726.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5726.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5726.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5726.html</trackback:ping><description><![CDATA[
		<em>
				<blockquote>了解 IBM 有洞察力的专家和领先技术开拓者对 IT 架构师在目前及将来面临的问题的评述，了解他们的观点与展望。本月，他们将对以下问题进行讨论：<i>为什么应该考虑 SOA？何时应当选择 SOA，何时又不应该选择 SOA？</i></blockquote>
				<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
				<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
				<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
				<p>
						<a name="N10051">
								<span class="atitle">
										<font face="Arial" size="4">欢迎阅读观点与展望专栏</font>
								</span>
						</a>
				</p>
				<p>欢迎阅读第一期<i>观点与展望</i>，IBM 技术专家将在此 developerWorks 专栏中就 IT 架构师需要及时解决以完成其工作的问题提供指导。每个月，我们都将拜访 IBM 内部架构师社区（包括最知名的有洞察力的人、标准组织的投稿人、我们产品团队的架构师和每天与客户接触的顾问），邀请他们与大家分享他们对目前 IT 和软件架构师面临的最重要问题的看法。</p>
				<p>无论您是跨越全球的大型团队的架构师，还是刚刚开始学习 IT 体系结构技术与实践的新手，他们的回答都将给您提供帮助，为您带来灵感并促进您的积极参与。这些观点和看法并不一定十分全面。有关此处涉及的主题的更多指导信息，可以参考 <a href="http://www.ibm.com/developerworks/architecture/index.html"><font color="#5c81a7">developerWorks Architecture area</font></a> 的另一部分：<a href="http://www.ibm.com/developerworks/architecture/roadmap/"><font color="#5c81a7">IT Architecture resource round-up</font></a>。另外，如果您有具体问题需要询问专家，或希望发表讨论，则请访问 <a href="http://www.ibm.com/developerworks/forums/dw_thread.jsp?nav=false&amp;forum=786&amp;thread=99531&amp;cat=67"><font color="#5c81a7">developerWorks IT 体系结构讨论论坛</font></a>。</p>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N1006B">
								<span class="atitle">
										<font face="Arial" size="4">引言</font>
								</span>
						</a>
				</p>
				<p>面向服务的体系结构 (SOA) 已成为了一项<a href="http://www.ibm.com/software/solutions/soa/"><font color="#5c81a7">事实标准</font></a>，用于开发基于组件的应用程序，可使用标准接口通过网络（Internet 或其他网络）访问这些应用程序。至少 IBM 高级管理人员和很多其他供应商、分析师、顾问和软件开发人员都这么说。他们还将告诉您，整个行业都在逐步采用 SOA，如果您尚未开始 SOA 开发，将很快跟不上时代的步伐了。</p>
				<p>赞誉之词。但这些看法是否真的很有吸引力，能让您开始着手您自己的 SOA 吗？让我们来看看一位参加 Open Group 主办的 <a href="http://www.opengroup.org/houston2005/"><font color="#5c81a7">SOA 大会</font></a>的架构师的问题。在 IBM Global Services 副总裁 Michael Liebow 的<a href="http://www.opengroup.org/conference-live/doc.tpl?CALLER=documents.tpl&amp;dcat=&amp;gdid=8798"><font color="#5c81a7">主题发言</font></a>后的提问期间，这位架构师问道：“SOA 是不是我们需要知道的唯一体系结构？（顺便提一下，Liebow 先生的回答是“是的”）在稍后，另一位架构师大声问道：“SOA 和我们多年前就知道的组件体系结构很相似。如果我们采用了它，是否意味着我们又多添了一个技术竖井（另一个开发死胡同），从而需要进行更多的集成？”（而这次，会议参加者——包括平台供应商、企业 IT 架构师、顾问、系统集成商和其他人员——回答的是“不是。”）</p>
				<p>这就提出了我们本月要向<a href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#bios"><font color="#996699">我们的专家</font></a>询问的问题。如果您和 IBM 最近接触的很多架构师一样，那么您可能正在评估甚至采用 SOA 的过程中。但您可能仍在怀疑这是否是体系结构样式的<i>必由之路</i>，新东西很快由更为流行的东西取代，或者，这个体系结构是否真的适用。 </p>
				<p>我们的专家对此问题的回答包含了很多您之前听到的说法：SOA 促进了可重用性，提供了接口和实现之间的抽象级别以最小化依赖关系，将业务需求与 IT 功能结合，从而可以为您提供用于将业务需求转换为编程服务来实现流程自动化的机制，以及当前竞争激烈且快速变化的业务环境中所必需的灵活性，等等。另外，这些专家还根据他们与 IBM 内外开发先驱合作的实践经验提供了一些新颖的看法，将帮助您了解 SOA 在何时如何（甚至为什么）适合在您的 IT 体系结构和开发计划中使用。</p>
				<p>在此对本月的专栏供稿编辑 Holt Adams 表示感谢。Holt 是 IBM Software Group 团队一位经验丰富的 IT 架构师，就您将要读到的内容为内部 IBM 社区提供了指导。他还提供了他自己对这个问题的回答“<a href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#SOA"><font color="#996699">何时采用 SOA，何时不采用 SOA</font></a>。”</p>
				<p>好了，不再多说，下面就请了解一下我们的专家的观点吧。（有关回答问题的专家的更多信息，请参阅本专栏最后的<a href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#bios"><font color="#996699">关于专家</font></a>。）我们邀请您就 SOA 提出您的看法。您可以访问我们的 <a href="http://www.ibm.com/developerworks/forums/dw_thread.jsp?nav=false&amp;forum=786&amp;thread=99531&amp;cat=67"><font color="#5c81a7">IT 体系结构讨论论坛</font></a>，或通过以下地址给我发电子邮件：<a href="mailto:pdreyfus@us.ibm.com"><font color="#5c81a7">pdreyfus@us.ibm.com</font></a>。</p>
				<p>Paul Dreyfus，编辑<br />developerWorks SOA and Web services<br /></p>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="#SOA">
								<span class="atitle">
										<font face="Arial" size="4">何时采用 SOA，何时不采用 SOA</font>
								</span>
						</a>
				</p>
				<p>
						<font face="Arial" size="4">
								<img height="160" alt="Holt Adams" src="http://www.ibm.com/developerworks/i/p-ar-hadams.jpg" width="128" align="left" border="0" valign="top" />
						</font> IBM 的目标之一是在其产品内开发和采用开放标准。通过这样做，就能在您公司的 IT 基础结构中实现 SOA 的价值主张。SOA 能够优化业务需求与 IT 的一致性，能够将业务流程活动从服务实现中分离出来，还能够降低操作成本。只有在不固定供应商的情况下才能真正实现这些功能，此时面向 SOA 实现的技术可以无缝集成（考虑：“开放标准”），以构造全面的端到端解决方案。</p>
				<p id="subtitle">
				</p>
				<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
						<tbody>
								<tr>
										<td width="10">
												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
										</td>
										<td>
												<table cellspacing="0" cellpadding="5" width="100%" border="1">
														<tbody>
																<tr>
																		<td bgcolor="#eeeeee">不可轻易决定实现 SOA。这与改变生活方式有些类似，因为开发和操作团队遵循的 IT 控制模式将完全不同。<br />——Holt Adams </td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<p>当考虑了策略业务目标和活动时，理论上的 SOA 概念非常具有吸引力，更加容易得到支持。不过，不可轻易决定要实现 SOA。这与改变生活方式有些类似，因为开发和操作团队遵循的 IT 控制模式将完全不同。我提倡进行业务驱动开发。此过程涉及到将业务需求细化为 IT 要求，然后将 IT 要求细化为 IT 功能，以确定满足这些需求所需的技术。根据我过去四年开发基于 Web 服务的解决方案和更为成熟的基于 SOA 的解决方案的经验，以下这些相关因素通常会让我建议采用面向服务的体系结构：</p>
				<ul>
						<li>集成成本持续增长，而并未因为可提供真正投资回报 (ROI) 的新业务机会而得到缓解。 
</li>
						<li>兼并和收购是您公司扩大市场份额和获得新发展机会的业务模式的核心。 
</li>
						<li>解决方案要求对来自异构系统和编程模型的业务功能进行集成。 
</li>
						<li>业务的生存依赖于根据市场变化快速调整或即时响应竞争威胁的能力。 
</li>
						<li>全球经济的影响要求您的公司事半功倍地开展业务，而且有必要依赖业务合作伙伴提供非核心业务功能。 
</li>
						<li>就提高收益而言，与业务合作伙伴协作的效率对您的公司十分关键。 
</li>
						<li>您公司业务资产的价值在减少，因为不能对其进行评估，以在最初用途之外的其他地方使用。 
</li>
						<li>您公司员工的效率出现了问题，因为他们的大部分时间并没有花在提供公司业务模型的核心功能和服务上。 
</li>
						<li>您公司的业务充满了机会型的业务工作。 
</li>
						<li>您公司从头开始开发新应用程序。（我认为 SOA 应当作为定位将来的新应用程序的缺省体系结构样式，业务条件有其他限制时除外。） </li>
				</ul>
				<p>在理想情况下，您和您的业务合作伙伴间没有预算限制、计划期限、技能差距和优先级差异，我想，此时完全可以说每个人都会采用 SOA，或者至少会考虑采用 SOA。不过，我们的选择实际上经常受到过去的决策的影响和限制（例如，技术投资、编程模型采用、服务的合同协定等）。因此，我们并不能总是自由地采用看起来能满足某个业务需求或技术要求的最佳选项。以下的注意事项会让我不建议采用面向服务的体系结构或说明现在实现 SOA 的边际收益：</p>
				<ul>
						<li>您公司只将小部分 IT 预算用于集成活动。 
</li>
						<li>您公司的大部分流程都是手动的或以文档为中心的，自动化的机会几乎为零。 
</li>
						<li>您公司的大部分应用程序开发都使用相同的编程模型。 
</li>
						<li>您公司的操作由一个或两个客户关系管理 (CRM) 和企业资源规划 (ERP) 应用程序管理，几乎没有集成要求。 
</li>
						<li>您公司的现有技能库与实现支持 SOA 的基础结构所需的技能库之间存在重大差异。 
</li>
						<li>未发现可从 SOA 提供的功能受益的业务需求或机会。 
</li>
						<li>新业务服务的可用性将对现有的收益流带来负面影响。 
</li>
						<li>您公司依赖的业务合作伙伴对公司间流程的自动化采用了不同的优先级。 
</li>
						<li>您公司的主要业务的开展涉及到海量且同步性和实时性要求非常高的事务。 </li>
				</ul>
				<p>前面的列表只是一个示例，用以说明 SOA 是否是您公司最佳选择的原因。当然，每个合同或项目都具有唯一的要求，因此关于何时采用 SOA 的决策取决于您公司的业务状况。SOA 的价值主张十分诱人，但选择何时让您的公司采用 SOA 必须考虑业务环境的实际情况。采用 SOA 不一定要跨一大步，而通常是采用循序渐进的方式进行的。首先找到可以利用 SOA 概念和原则的项目，然后使用主要性能指标测定其价值，这是一种让大家受益的好方法。 </p>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N1010B">
								<span class="atitle">
										<font face="Arial" size="4">将业务与 IT 结合起来</font>
								</span>
						</a>
				</p>
				<p>
						<font face="Arial" size="4">
								<img height="160" alt="Ali Arsanjani" src="http://www.ibm.com/developerworks/i/p-ar-aarsanjani.jpg" width="128" align="left" border="0" valign="top" />
						</font> SOA 不仅是一个开发范例。该体系结构用于在业务和 IT 之间构建中间地段，其中包含双方都同意的一组与业务一致的 IT 服务，这些服务结合在一起，以实现组织的业务流程和目标。此范例提供了前所未有的灵活性：它允许将业务流程的结构化组成从为流中每个活动提供功能的服务中分离出来。它还允许将业务实现与其描述分离开来。进行了此分离后，公司能以增量的方式更改其后端遗留系统，并添加新功能来支持新需求，而不用受到供应商选择的限制。因此，可以在最小化对业务流程和 IT 系统的影响的前提下对软件包和自定义应用程序进行替换。 </p>
				<p>将访问功能从其实现分离的下一步工作就是 SOA。而且，除了此功能方面外，我们还可以将非功能方面外部化。例如，我们可以根据建立的业务策略确定哪些人应该可以访问特定的功能。我们还可以定义如何管理希望以灵活的、可重构的方式访问的技术资源。</p>
				<p id="subtitle">
				</p>
				<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
						<tbody>
								<tr>
										<td width="10">
												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
										</td>
										<td>
												<table cellspacing="0" cellpadding="5" width="100%" border="1">
														<tbody>
																<tr>
																		<td bgcolor="#eeeeee">使用 SOA 技术时，实时或被动系统通常不是进行实现的最佳选择，因为当前的技术不支持将 SOA 用于有大量并发使用情况的实时系统。不过，这些系统的建模也可以从 SOA 提供的分离和独立概念获益。<br />——Ali Arsanjani </td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<p>软件工程发展的下一步就是此体系结构。它使我们从结构化对象转向分布式对象和组件，然后以一组公共服务为中心来将业务和 IT 加以结合（这些服务结合在一起，可以实现组织的流程和目标）。SOA 还允许将公司的部分业务流程向生态系统中的合作伙伴公开。</p>
				<p>当需要支持业务灵活性的 IT 灵活性时，就可以使用 SOA。因此，对于两个程序需要进行通信并访问组合业务流程的行业应用程序而言，就非常适合选择 SOA。</p>
				<p>使用 SOA 技术时，实时或被动系统通常不是进行实现的最佳选择，因为当前的技术不支持将 SOA 用于有大量并发使用情况的实时系统。不过，这些系统的建模也可以从 SOA 提供的分离和独立概念获益。</p>
				<p>SOA 非常适合用于消除冗余及将业务与未紧密耦合到特定服务实现的 IT 功能相结合。它可以允许服务使用者选择后备服务提供者（不仅基于功能进行选择——我需要类似的功能，但不要此版本的服务中的额外依赖项，还可以基于设计及运行时策略和 Web 服务管理功能进行选择）。</p>
				<p>企业体系结构基于 SOA 的公司具有稳定的基础，能从现有系统概念地抽象业务功能。它们还具有允许随着新软件包、系统和资产的提供和新需求的出现以增量的方式进行业务驱动的 IT 转换的基础。</p>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N10134">
								<span class="atitle">
										<font face="Arial" size="4">一个重要但略显不足的机制</font>
								</span>
						</a>
				</p>
				<p>
						<font face="Arial" size="4">
								<img height="147" alt="Grady Booch" src="http://www.ibm.com/developerworks/i/p-ar-gbooch.jpg" width="128" align="left" border="0" valign="top" />
						</font>在企业范围中，大量的创新都出现在以下两个方面：企业边缘和企业之间。在边缘上，我们可以看到在中间件之上的框架投入了很多精力（独立于领域的框架，如 Ajax，以及特定于领域的框架，以特定行业为中心进行结合），也投入了很多精力进行与设备相关的工作 [ 典型的移动设备和具有无线频率识别（Radio Frequency Identification，RFID）标记的设备 ]。而在企业之间，我们可以看到系统（遗留系统和新系统）的系统的形成。</p>
				<p id="subtitle">
				</p>
				<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
						<tbody>
								<tr>
										<td width="10">
												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
										</td>
										<td>
												<table cellspacing="0" cellpadding="5" width="100%" border="1">
														<tbody>
																<tr>
																		<td bgcolor="#eeeeee">在边缘，服务提供超越基础技术的行为。而在企业之间，服务提供了各种系统间语义丰富的强大通信方式。<br />——Grady Booch </td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<p>在此类以 Web 为中心的系统中，服务已被证实为这两个方面的重要机制。在边缘，服务提供超越基础技术的行为。而在企业之间，服务提供了各种系统间语义丰富的强大通信方式。</p>
				<p>虽然这样说，但在系统的构造中，服务是一个重要却略显不足的机制。这样说有些过于简单化，但总的说来，服务对于高频率或非常小粒度的连接而言，并不非常适合。而且，服务当然不是唯一适合各个系统的体系结构的分解机制。</p>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N10150">
								<span class="atitle">
										<font face="Arial" size="4">SOA、Web 服务与优势保持</font>
								</span>
						</a>
				</p>
				<p>
						<font face="Arial" size="4">
								<img height="160" alt="Sanjay Bose" src="http://www.ibm.com/developerworks/i/p-ar-sbose.jpg" width="128" align="left" border="0" valign="top" />
						</font> SOA 是一个使用得有些过量的首字母缩写，被从高级管理人员到开人员等各方面的人用（滥用）来传达多种（有时候是不一致的）语义。在我看来，面向服务的体系结构是一个框架，用于将业务流程和支持技术基础结构作为标准化且管理良好的组件——服务——进行集成，可以对服务进行组合、重用和调整以满足不断变化的业务优先级。 </p>
				<p>SOA 新手认为 SOA 和 Web 服务是等效的。可能存在不使用任何 Web 服务，而使用现有 IT 资产（从大型机事务到基于对象的系统）的基于 SOA 的有效解决方案。而且，我曾经看到过几个从部门级别发展出来的不是有效 SOA 应用程序的 Web 服务实现。这些 Web 服务岛通常并不完全遵循所有的核心 SOA 原则和特征——它们可能不是松散耦合、未抽象、不可重用、未组件化或不是独立于平台和协议的，最重要的是，它们可能不提供真正的业务价值。</p>
				<p>由于 Web 服务提供了一个 Level 字段，供基础结构和应用程序供应商进行创新和互操作，很多规范、概要、术语都使得这一混淆扩大化了。Web 服务仅是一个标准和技术的集合（还有很多其他技术支持选项），用以实现基于 SOA 的解决方案。</p>
				<p>在快速发展的全球经济环境中，企业要保持竞争优势，必须保持足够的灵活性。通过使用 SOA 原则将 IT 基础结构与核心企业流程结合，可以提供和保持这个优势。因此，理解和采用 SOA 所面临的问题不是如何或为什么，而是什么时候？基于 SOA 的企业解决方案已被证实能简化业务操作、提高效率、降低成本及消除冗余。 </p>
				<p id="subtitle">
				</p>
				<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
						<tbody>
								<tr>
										<td width="10">
												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
										</td>
										<td>
												<table cellspacing="0" cellpadding="5" width="100%" border="1">
														<tbody>
																<tr>
																		<td bgcolor="#eeeeee">我们正处在对解决方案生命周期的每个方面进行改革的浪尖上，而 SOA 则是关键的催化剂。不过，从长远来看，如果我们不谨慎的话，这个抽象和易用性可能会使 IT 架构师或开发人员和计算机科学与技术的根本基础脱离联系。<br />——Sanjay Bose </td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<p>不过，为了获得这些好处，必须正确地应用 SOA。必须具有相应企业范围内的远景和转换路线图，必须有业务执行人员的财务支持和承诺，并由有经验的架构师以增量迭代的方式进行部署。这些增量步骤应该首先针对关键业务问题进行，最终的解决方案应该能提供业务价值。这样可以帮助保持和促进使用 SOA 进行端到端企业转换。在采用 SOA 的过程中，SOA 将不断遇到各种重大的挑战，其中包括政治和文化的多样性。</p>
				<p>从纯技术角度而言，SOA 平台（包括工具和运行时）也在经历着巨大的转变。开发工具环境包含大量的建模工具、行业根深蒂固的场景、重用模式、方案和丰富的可视表示和控件以及模拟技术。运行时也同样在不断发展，从而提供增强的服务质量、声明性的和基于策略的管理和吸引人的管理和监视 Dashboard（针对 IT 事件和业务事件），并使用具有自我修复功能的自动工具进行检测。我们正处在对解决方案生命周期的每个方面进行改革的浪尖上，而 SOA 则是关键的催化剂。不过，从长远来看，如果我们不谨慎的话，这个抽象和易用性可能会使 IT 架构师或开发人员和计算机科学与技术的根本基础脱离联系。</p>
				<p>[ 编者注：有关此主题的更多观点，可以参考 Sanjay Bose 最近与人合著的新书 <i><a href="http://www.ibmpressbooks.com/bookstore/product.asp?isbn=0131870025&amp;rl=1"><font color="#5c81a7">SOA Compass:Business Value, Planning, and Enterprise Roadmap</font></a></i>（此书是 IBM Press 和 Prentice-Hall 联合出版的 developerWorks 系列丛书之一）。</p>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N1017D">
								<span class="atitle">
										<font face="Arial" size="4">模型驱动的开发和虚拟企业</font>
								</span>
						</a>
				</p>
				<p>
						<font face="Arial" size="4">
								<img height="147" alt="Don Ferguson" src="http://www.ibm.com/developerworks/i/p-ar-dferguson.jpg" width="128" align="left" border="0" valign="top" />
						</font>您可能已经选择使用 SOA 了。大部分中型和大型企业都在其应用程序设计中应用了 SOA 元素。结构良好的 CICS® 和 IMS™ 程序通常符合 SOA 的要求。很多公司已构建了由消息驱动的应用程序组成的分布式系统。会话 Enterprise JavaBean 就是“类 SOA 的”。很多 ISV 系统都采用类似于服务的构造；例如 SAP IDocs。SOA 将结构良好的分布式系统的指南系统化，是结构化编程、模型对象 (OO) 的概念的子集和消息驱动的处理的自然发展。</p>
				<p id="subtitle">
				</p>
				<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
						<tbody>
								<tr>
										<td width="10">
												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
										</td>
										<td>
												<table cellspacing="0" cellpadding="5" width="100%" border="1">
														<tbody>
																<tr>
																		<td bgcolor="#eeeeee">在很短的时间内，我们行业的运行时互操作性和开发工具间的互操作性就达到了前所未有的水平。这个互操作性降低了迁移到 SOA 的成本，从而更容易获得其带来的好处。<br />——Don Ferguson </td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<p>Web 服务是一组用于构建 SOA 解决方案的标准。基础结构供应商 (IBM、BEA、Microsoft) 和应用程序供应商 (SAP、Oracle) 正像采用任何软件技术一样迅速地采用 Web 服务。在很短的时间内，我们行业的运行时互操作性 [简单对象访问协议（Simple Object Access Protocol，SOAP）、HTTP、WS-Security、WS-ReliableMessaging] 和开发工具间的互操作性 [Web 服务描述语言（Services Description Language，WSDL）、WS-Policy、Business Process Execution Language for Web Services (BPEL4WS) ] 就达到了前所未有的水平。这个互操作性降低了迁移到 SOA 的成本，从而更容易获得其带来的好处。</p>
				<p>都有什么好处呢？此处将不详细讨论全部或任何单个好处。我将简要地提一下两个好处：</p>
				<ul>
						<li>SOA 支持模型驱动的开发和从业务透视图进行解决方案监视。我们通过使用 WebSphere® Business Modeler 产生一个允许分析人员和业务专业人员进行推断和设计他们的业务流程的工具，从而有了很大进步。SOA 操作是流程中的任务或步骤的自然呈现，而组合服务的实现（BPEL4WS，业务状态机）则是流程的自然表示。根据简单业务规则（使用 WebSphere Process Server 启用），WS-Policy 和服务实现这两种方法都是业务策略的自然表示。 
</li>
						<li>Web 服务支持“虚拟企业”。MQ 和 Common Object Request Broker Architecture (CORBA) 等以前的技术主要针对企业内计算进行了优化。Web 服务协议和 WSDL 在 Internet 和内部网络中均可工作。这样就能使用以前用于企业内部应用程集成的相同模型来在 Internet 上实现简单的、快速开发的机会型 B2B 了。 </li>
				</ul>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N101AA">
								<span class="atitle">
										<font face="Arial" size="4">控制问题</font>
								</span>
						</a>
				</p>
				<p>
						<font face="Arial" size="4">
								<img height="160" alt="David K. Jackson" src="http://www.ibm.com/developerworks/i/p-ar-djackson.jpg" width="128" align="left" border="0" valign="top" />
						</font>SOA 与已在 IT 行业存在了 30 年甚至更长时间的其他软件模块化流程相似。SOA 所不同的硬件和网络已足够成熟，可以支持这项基于标准的技术。从任何方面而言，SOA 都不是过去行业内的风行的热潮技术，但包含了广泛的行业标准和支持。 </p>
				<p>SOA 为企业提供了一个机会，以标识其核心能力和决定是否将这些核心能力作为服务向其行业和业务合作伙伴提供。另一方面的事实是；企业可以对作为其核心基础结构（不是核心能力）一部分的流程和应用程序进行标识，然后确定进行购买。请注意，其中一些服务（提供的或购买的）可能仅为业务流程。企业架构师可以牵头开展相应的工作，以发现企业中具有公共功能集的业务流程和 IT 流程。可以将执行功能打包为外部依赖性很小的组件，并作为服务提供。这就使得业务流程创建者或应用程序开发人员的工作得到简化，以将精力放在能满足股东的业务动力的唯一功能上。</p>
				<p id="subtitle">
				</p>
				<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
						<tbody>
								<tr>
										<td width="10">
												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
										</td>
										<td>
												<table cellspacing="0" cellpadding="5" width="100%" border="1">
														<tbody>
																<tr>
																		<td bgcolor="#eeeeee">让 SOA 正常工作在很大程度上不是技术问题。让 SOA 正常工作是一个业务控制和 IT 控制问题。<br />——David K. Jackson</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<p>让 SOA 正常工作在很大程度上不是技术问题。让 SOA 正常工作是一个业务控制和 IT 控制问题。技术专家可以根据很多存在的成功模式构造一个 SOA 实现。然后让企业使用这些服务，而不再自己进行创建，这是另一个问题。恰当的体系结构控制将对其服务可供新应用程序使用的项目进行标识。要使得 SOA 投资最终能物有所值，唯一的办法就是让高级管理人员承诺控制预算，或采取某种方式保证业务线能不受干扰。IT 架构师还需要向执行股东报告业务从其 SOA 投资和投入方面获得的价值。</p>
				<p>为了让 SOA 与业务合作伙伴协作，需要涉及企业已经建立的关系。现在，很少（如果有）客户在其建立的合同关系之外为合作伙伴提供或购买服务。服务级别协议和争议解决的相关事项要求配备封闭的协作系统。有关信任和安全的结构化信息系统发展组织（Organization for the Advancement of Structured Information Systems，OASIS）标准在过去两年中取得了长足的发展，但在等式的法律和业务一边，仍然更倾向于和企业已经了解的伙伴开展此类业务。</p>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N101C9">
								<span class="atitle">
										<font face="Arial" size="4">这里没有神话</font>
								</span>
						</a>
				</p>
				<p>
						<font face="Arial" size="4">
								<img height="160" alt="Christina Lau" src="http://www.ibm.com/developerworks/i/p-ar-clau.jpg" width="128" align="left" border="0" valign="top" />
						</font>关于为什么应该考虑 SOA 有三个简单的理由： </p>
				<p>1. 这是目前最热门的领域之一；不要落后于时代的步伐。</p>
				<p>2. 工具、基础结构和标准经过组合，可为整个 SOA 生命周期提供全面支持。了解我们的<a href="http://www.ibm.com/software/solutions/soa/itleaders.html"><font color="#5c81a7">端到端编程模型</font></a>。按照其中提供的详细步骤开展工作，亲身体验成功。</p>
				<p>3. 如果您和我们一样不断地追求事半功倍，那么 SOA 可以为您提供帮助。寻找您可以再次利用的东西；不要所有东西都自己从头做起。寻找现有服务，对其进行调整，并加以使用。然后对其中一些服务进行共享。帮助创建一个生态系统，以便在将来能更快地装配更多有意义的解决方案。</p>
				<p id="subtitle">
				</p>
				<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
						<tbody>
								<tr>
										<td width="10">
												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
										</td>
										<td>
												<table cellspacing="0" cellpadding="5" width="100%" border="1">
														<tbody>
																<tr>
																		<td bgcolor="#eeeeee">可以通过常识来看这个问题。如果您的项目处于十分关键的位置，而您的团队必须投入大量精力学习工具和 API，SOA 就有可能是错误的选择。如果可以在小项目中试用 SOA，则是不错的选择。<br />——Christina Lau </td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<p>开始采用 SOA 与采用任何其他技术或体系结构没有什么区别。可以通过常识来看这个问题。如果您的项目处于十分关键的位置，而您的团队必须投入大量精力学习工具和 API，它就有可能是错误的选择。如果可以在小项目中试用 SOA，则是不错的选择；利用这个经验，可以帮助您定义和扩展到下一个更大的项目。循序渐进，这里没有神话。</p>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">回页首</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N101EF">
								<span class="atitle">
										<font face="Arial" size="4">只是业务而已</font>
								</span>
						</a>
				</p>
				<p>
						<font face="Arial" size="4">
								<img height="160" alt="Calvin Lawrence" src="http://www.ibm.com/developerworks/i/p-ar-clawrence.jpg" width="128" align="left" border="0" valign="top" />
						</font>SOA 的支持者不断不畏余力地宣传 SOA 的主要技术优势：松散绑定，能够通过组件封装可重用业务功能，最后（但没有像通常那样刻意强调）还能提供更好的集成。</p>
				<p>包括我自己也是 SOA 的支持者之一，但我不断在问自己一个问题：<i>客户真的对这种技术推论感兴趣吗？</i></p>
				<p>在过去两年，我一直在与希望获得 SOA 产生的价值主张的客户全面合作。在与客户沟通时，我经常发现客户认为，有很多其他体系结构能提供比我所提到的更多的技术价值。有些客户可能一厢情愿地得出结论，认为非常有经验的架构师和开发团队可以通过使用传统企业应用程序集成 (EAI) 体系结构获得很大价值。很多客户会争辩说，这些方法经过验证，实现风险并没有直接采用 SOA 进行设计的风险大。</p>
				<p id="subtitle">
				</p>
				<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
						<tbody>
								<tr>
										<td width="10">
												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
										</td>
										<td>
												<table cellspacing="0" cellpadding="5" width="100%" border="1">
														<tbody>
																<tr>
																		<td bgcolor="#eeeeee">虽然我们不知道其解决方案到底是什么样的，但应当客观地看待每一个问题。请同时根据技术指标和业务指标来确定是否采用 SOA。<br />——Calvin Lawrence </td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<p>这个观点可能会让架构师认识到在有些情况下，SOA 是错误的选择，或者，至少不是最好的选择。SOA 的技术可行性是否是选择其作为解决一系列业务问题的体系结构方法的原因？我会说不是：很多业务及 IT 相关的问题（例如缺乏有力的企业控制模型和策略）将减慢或阻碍任何构思良好的技术 SOA 活动的实现。 </p>
				<p>在最近一次为期三天的 SOA 研讨会上，一位汽车行业的首席技术官 (CTO) 告诉我下面的话：“我对 SOA 看法是<i>‘只是业务而已’</i>。”他告诉我他采用 SOA 的原因在于：</p>
				<ul>
						<li>提高他和他的团队实现新产品和流程或更改现有项目的速度 
</li>
						<li>降低实现和拥有成本 
</li>
						<li>通过外包业务元素或从固定定价改为可变定价（根据业务量），从而支持灵活的定价模型 
</li>
						<li>简化合并和收购所需的集成工作 
</li>
						<li>实现更好的 IT 使用率和投资回报 </li>
				</ul>
				<p>
				</p>
				<p>这位 CTO 和他的团队仅关心如何使用其现有的技能（而不必放弃其现有的基础结构）在预算内按时达成这些目标。他们已经在其现有 EAI 基础结构中进行了大量投资。</p>
				<p>这位特别的 CTO 的话与很多其他人的说法都不一样。他们只关心关键之处：<i>我如何为股东提供回报？</i></p>
				<p>当然，作为一个有经验的架构师（微笑），我知道一些解决此问题的体系结构备选方案： </p>
				<ol>
						<li>扩展其现有的 EAI 基础结构 
</li>
						<li>计划采用更多的事件驱动体系结构（完全分离的、发布/订阅，等等） 
</li>
						<li>或许可采用 SOA </li>
				</ol>
				<p>由于这是一个 SOA 研讨会，而客户为此付费，因此我最初准备选择第三个选项。实际上，对于这个情况，我使用了一点 EAI，一点事件驱动和很多 SOA 方面的东西。SOA 允许在必要时包含 EAI 和事件驱动方法。</p>
				<p>对于高速发展的汽车行业，为了保持竞争优势和按时在预算内提供产品，企业必须具有灵活性。这个客户的难点集中在对其业务流程进行管理和合并。正如我的同事在此讨论中指出的，将 IT 基础结构与核心业务流程结合，对于达成目标十分关键。SOA 相关的原则已被证明可以简化业务操作，能减少与实际代码关系很小而集中在人机交互和人员活动上的冗余项。在资金有限的业务环境中，几乎没有客户能为解决特定的业务问题无限制地投入资金，而有时间并愿意对其控制流程进行修整的客户则更少了。这样做听起来不错，但却不会实际这样做。</p>
				<p>关键在于对现有基础结构、流程和现有控制模型加以利用和扩展。通过恰当地使用现有 SOA 原则，可以对整个设计和实现流程进行管理，如：</p>
				<ol>
						<li>标识问题。 
</li>
						<li>标识组成业务并是难点所在的流程。 
</li>
						<li>对这些流程进行建模，以对其进行简化。 
</li>
						<li>标识现有服务，并编写表示这些流程的其他服务。 
</li>
						<li>将这些服务部署到可提供运行时功能且操作效率高的环境中。 
</li>
						<li>监视这些服务和流程，以获得更高的效率。 </li>
				</ol>
				<p>那么，网络呢？虽然我们不知道其解决方案到底是什么样的，但应当客观地看待每一个问题。请同时根据技术指标和业务指标来确定是否采用 SOA。如果合适，就使用它。如果不合适，就不用它。SOA 概念和原则将始终可以通过某种方式应用到您的体系结构中。 </p>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N10263">
								<span class="atitle">
										<font face="Arial" size="4">康庄大道</font>
								</span>
						</a>
				</p>
				<p>
						<font face="Arial" size="4">
								<img height="160" alt="Andras Szakal" src="http://www.ibm.com/developerworks/i/p-ar-aszakal.jpg" width="128" align="left" border="0" valign="top" />
						</font>我们现在都应该知道了整个行业对 SOA 的 ROI 和采用的赞颂之词——松散耦合、重用更好、推向市场的时间更短、易于集成以及互操作性更好。不过，务必了解，我们目前对 SOA 的关注只是实现即插即用企业（或者说是按需企业）的历程中重要的一步而已。</p>
				<p>随着我们进入下一个十年，我们将开始着手大幅度减少将来自不同 IT 供应商的产品或组件组合成可行的有价值的端到端解决方案所需的工作量。供应商提供的业务组件将不依赖于基础结构，可以在各种平台上执行。因此，软件开发人员会将更多的精力放在有效集成供应商组件和确保有效的互操作性上。</p>
				<p id="subtitle">
				</p>
				<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
						<tbody>
								<tr>
										<td width="10">
												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
										</td>
										<td>
												<table cellspacing="0" cellpadding="5" width="100%" border="1">
														<tbody>
																<tr>
																		<td bgcolor="#eeeeee">IT 业务操作部门所属的人员将是业务和企业体系结构专业人士。无论您是如何定义业务或企业架构师的：为了实现这个远景，整个行业将需要更多的具有 IT 和企业体系结构背景的人士。<br />——Andras Szakal </td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<p>客户的 IT 操作部门将主要负责选择最适合业务需求的运行时平台；即提供恰当部署和管理业务组件所需的必要服务质量和运行时支持的平台。 </p>
				<p>相反，IT 业务操作部门将主要关注如何通过定义业务组件（将由其对应的操作人员部署和管理）中包含业务规则实现组织的业务策略。这将通过 WebSphere Business Process Server 之类的业务流程管理系统完成。</p>
				<p>IT 业务操作部门所属的人员将是业务和企业体系结构专业人士。无论您是如何定义业务或企业架构师的：为了实现这个远景，整个行业将需要更多的具有 IT 和企业体系结构背景的人士。</p>
				<p>虽然这个远景可能十分诱人，仍然存在很大的风险，在进入组件天堂之前，我们必须小心地减小这些风险。在开始进行实现模型服务的体系结构的任务时，最重要的减小风险方法可能就是要求有强有力的管理良好的控制流程和策略。只有通过强有力的企业服务控制策略才能够避免更改管理问题、服务间的语义不匹配和系统功能结合方面出现的难于调试的问题。IT 部门可以通过制定的控制策略来减少风险，这些控制策略由执行监督团队（其中包括 CIO、CTO 和业务线执行官）提出并加以支持。</p>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N10288">
								<span class="atitle">
										<font face="Arial" size="4">改善信息</font>
								</span>
						</a>
				</p>
				<p>
						<font face="Arial" size="4">
								<img height="160" alt="Dan Wolfson" src="http://www.ibm.com/developerworks/i/p-ar-dwolfson.jpg" width="128" align="left" border="0" valign="top" />
						</font>当然，您已经对 SOA 有所了解了。您也知道 Web 服务、业务流程的重要性、模型驱动的体系结构和所有这些让人诚惶诚恐的 WS-* 标准。 </p>
				<p>但或许您是一名信息人员。您需要负责组织的信息的完整性和对其进行分析。您关心表示业务状态的数据库的性能和稳定性。正如您所知的，<i>真正</i>重要的部分。因此，您可能会问：“为什么我应该关心 SOA？”</p>
				<p id="subtitle">
				</p>
				<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
						<tbody>
								<tr>
										<td width="10">
												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
										</td>
										<td>
												<table cellspacing="0" cellpadding="5" width="100%" border="1">
														<tbody>
																<tr>
																		<td bgcolor="#eeeeee">SOA 表示的不仅是服务提供者和使用者的协定，而且也是信息提供者和使用者间的协定<br />——Dan Wolfson </td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
				</p>
				<p>作为信息人员，我很关心 SOA。我之所以关心 SOA，是因为 SOA 具有直接和间接影响信息管理系统的能力——事实上可以影响信息本身。为了获得成功，我们需要在业务服务所涉及的信息的上下文中对其进行考虑。我们需要知道检索到的信息是准确的。被更新的信息经过了验证。交换的信息的意义对于服务提供者和使用者都是一样的。如果忽略了这些事情，服务的价值和可重用性就会减少。 </p>
				<p>直接来说，使用 SOA 时，我们需要在提供者和使用者之间形成一个信息协定，以便让各方知晓信息意义的内涵，并且仍然支持异构系统——换句话说，我们必须假定世界是杂乱无章的，必须对其进行整理，以提高信息的价值，了解不同的结构和意义之间的关系，并在可能的情况下就公共对象达成一致。 </p>
				<p>将信息作为服务公开还将让我们配备额外的信息服务器拓扑来容纳增加的信息负载。它还会要求我们建立可以对信息访问进行虚拟的点（这样用户就无需知道信息的真正位置以及其组织方式）。它还引入了一些方法，允许我们有效地对这些信息进行组合——通过集合或联合。如果没有建立更多的公共机制或引入经过改进的清除机制，则我们稍后很可能被迫投入巨额的额外资金和资源进行清除，从而导致将来的灵活性下降。</p>
				<p>可以采用很多办法实现信息协定。其中一个变得越来越重要的就是主数据管理 (MDM) 领域。MDM 系统可为业务应用程序或服务提供经过清除、整合且特定于域的信息。最常见的 MDM 系统是作为客户和产品信息的信息集线器使用的系统。每个集线器都作为中心点使用，可以在此对信息进行添加、更新、审核、清除、搜索和查询。集线器放置于可以将更改传播到相关数据库或可以生产相关服务的事件的位置。MDM 系统可以是事务型的（在操作业务流程的主线中更新），也可以是引用型的（提供业务流程所引用的信息的一致来源）。但最重要的是，我们可以将 MDM 系统看作其本身提供了一个一致的服务集，以供在各种业务流程内使用和进行重用。</p>
				<p>通过 MDM 等方法显式地实现信息提供者和使用者之间的协定，可以帮助我们实现 SOA 所承诺的灵活业务流程和服务可重用性，并同时为我们提供提高所管理信息的质量的机会。</p>
				<p id="subtitle">
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ar-itio1/#main">
																						<b>
																								<font color="#996699">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N102B5">
								<span class="atitle">
										<font face="Arial" size="4">适合与不适合的场合，以及需要注意的地方</font>
								</span>
						</a>
				</p>
				<p>
						<font face="Arial" size="4">
								<img height="160" alt="Bobby Woolf" src="http://www.ibm.com/developerworks/i/p-ar-bwoolf.jpg" width="128" align="left" border="0" valign="top" />
						</font>SOA 是一种组织化的方法，用于应用到由面向服务和分布式对象计算组合而成的应用程序体系结构中。让我们来将这个定义分为几部分进行分析。<i>应用程序体系结构</i> 是应用程序各部分的宽泛组织，通常作为层实现。体系结构指定包含哪些部分以及它们如何一起工作。面向服务将功能封装为服务——宽泛的可重用任务，可以在没有任何前一上下文（除承载服务的系统的当前域状态外）的情况下运行。服务的上下文是作为从调用方传递的参数提供的，和函数调用的参数非常相似。<i>分布式对象</i> 以特定方式运行在独立进程中，通过这种方式，一个进程中的对象可以调用另一个进程中的对象上的方法。</p>
				<p id="subtitle">
				</p>
				<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
						<tbody>
								<tr>
										<td width="10">
												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
										</td>
										<td>
												<table cellspacing="0" cellpadding="5" width="100%" border="1">
														<tbody>
																<tr>
																		<td bgcolor="#eeeeee">服务支持对访问通过宽泛任务的经过良好定义的 API 公开的已良好封装的功能，从而可以通过低频率的调用实现功能的高重用性。SOA 或许是所有方法中最好的一个。<br />——Bobby Woolf</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<p>SOA 向分布式对象添加面向服务，从而可以在进程之间调用服务。它是一种用于设计应用程序体系结构的方法，以便应用程序的各个部分可以在不同的进程中运行，而且还允许不同的应用程序共享和重用正在运行的部分。它是分布式对象计算的演变，用以在多个对立方之间获得更好的平衡：需要访问彼此功能的应用程序；需要封装自己功能的应用程序；需要限制在其应用程序编程接口 (API) 中描述的对外公开的功能的应用程序；需要限制分布式调用的交互应用程序。服务支持访问通过各种任务定义良好的 API 公开的封装良好的功能，从而可以通过低频率的调用实现功能的高重用性。SOA 或许是所有方法中最好的一个。</p>
				<p>以下给出了一些简单的技巧，用以确定何时采用 SOA 和何时不应采用 SOA 以及需要提高警惕的情况。</p>
				<p>首先，适合采用 SOA 的情况：</p>
				<ul>
						<li>当数据分布程度非常高时，使用 SOA。将操作数据的代码放置在与数据较近的位置，然后将其包装为服务，以供在任何地方进行访问。 
</li>
						<li>希望功能具有高可用性时，使用 SOA。将功能作为服务部署在多个冗余的提供程序中，以在其中一些不可使用时，可以使用其他的对等服务。 
</li>
						<li>当应用程序的各个部分需要独立开发、维护和更新时，使用 SOA。只要保持各个部分之间的接口，每个团队（如两个不同的 B2B 公司）就可以使用其喜爱的技术按照自己的计划实现各自的部分。 
</li>
						<li>当多个应用程序需要重用功能和数据时，使用 SOA。共享的代码仅重用功能；服务则允许各个独立应用程序重用一组共享的企业数据，而无需将数据分发给所有应用程序。 </li>
				</ul>
				<p>以下是不适合使用 SOA 的情况：</p>
				<ul>
						<li>当希望开发尽可能简单时，不要使用 SOA。使用一种语言实现，在单个线程中运行，且没有远程访问问题的应用程序复杂性较低一些，因此构建和调试更为方便。 
</li>
						<li>当希望操作环境尽可能简单时，不要使用 SOA。要对松散耦合、事件驱动的分布式应用程序进行故障排除要困难得多，要求对应用程序实现细节和操作环境配置细节及其当前状态有全面的了解。 
</li>
						<li>当网络不可靠或网速慢时，不要使用 SOA。服务组件运行于独立的计算机上，通过网络进行通信，因此，其速度和可靠性依赖于这些计算机及连接这些计算机的网络。<br />（注：分布式冗余服务可以帮助减少硬件不可靠和网络延迟的影响。） 
</li>
						<li>进行原型设计时，不要使用 SOA。原型开发应该简单，而 SOA 并不简单。 </li>
				</ul>
				<p>对于何时需要提高警惕的问题，坦白地说，随时都要提高警惕才行。以下是一些需要谨慎行事的具体情况： </p>
				<ul>
						<li>当服务接口不确定时，使用 SOA 需小心。服务接口允许使用者和提供者独立地进行更改，但接口本身必须稳定。SOA 中的接口变化比在单个应用程序（特别是非分布式应用程序）中复杂得多，因为有很多在其他情况下不相关的开发团队必须就接口的更改进行合作。 
</li>
						<li>当安全性极为重要时，使用 SOA 需小心。每个服务都是一个新的易受攻击的点，必须保证其安全性。可以轻易访问服务的人越多（如在公共 Internet 上的服务），可以尝试攻击该服务的人就越多。 
</li>
						<li>当性能极为重要时，使用 SOA 需小心。进程之间的每个服务调用都比进程内的方法慢得多。 
</li>
						<li>希望功能具有高可用性时，使用 SOA 需小心。正如所指出的，冗余服务可以提高可靠性；但同时，活动部分越多出现故障的可能性就大。SOA 应用程序只与其服务一样可靠。 </li>
				</ul>
				<p>这些列表根本不足以包含所有方面，但我希望这能让您更好地了解什么是 SOA 以及适合使用 SOA 的情况。如果您需要这方面的专业帮助，请访问 <a href="http://www.ibm.com/WebSphere/developer/services/"><font color="#5c81a7">IBM Software Services for WebSphere</font></a>，在其中可以找到各种参考资料。 </p>
				<p>祝您好运！</p>
		</em>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:22 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面向服务的体系结构（SOA）：对 IBM Workplace 和 Lotus 开发人员的采访</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5725.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:19:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5725.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5725.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5725.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5725.html</trackback:ping><description><![CDATA[
		<blockquote>面向服务的体系结构（Service Oriented Architecture），更多的时候被称作 SOA，最近有很多关于它的报道。但是它到底是什么，又能够为您做些什么呢？在该采访中，IBM development 的三名成员将就 SOA 以及 IBM 和 Lotus 产品如何与 SOA 概念相结合进行探讨。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<i>
						<a href="http://www.ibm.com/software/solutions/soa/">
								<font color="#5c81a7">面向服务的体系结构（SOA）</font>
						</a>为对业务应用程序进行智能且有效的设计、开发、部署和管理提供了一个广阔的基础设施。为了帮助更好地理解 SOA 是如何影响 Lotus 和 IBM Workplace 产品和技术的，我们访问了 Lotus 和 IBM Workplace 开发团队的几名成员，并探讨了 SOA 为您现实的工作带来了什么。</i>
		</p>
		<p>
				<b>请简单谈一下你们在 IBM 的职责。</b>
				<br />
				<i>Fernando Salazar：</i>我是 IBM Workplace 团队的高级技术人员。负责 Workplace Server 组件的整体体系结构和内容。</p>
		<p>
				<i>Robert Duffner：</i>我是 WebSphere Portal 和 Workplace 产品的产品经理。还负责在 Workplace、Portal 和 Collaboration (WPLC) 产品部门中围绕 SOA 策略提供帮助信息。</p>
		<p>
				<i>Doug Wilson：</i>我是 WPLC 部门的主要技术负责人，还是体系结构指导委员会和顾问组的成员。我的工作是确保跨 WPLC 产品的产品空间体系结构的一致性，并保证它们适合于整体 Software Group 体系结构策略。</p>
		<p>
				<b>概括地说，什么是 SOA？</b>
				<br />
				<i>Robert：</i>SOA（面向服务的体系结构）并非新的思想。SOA 一直主要是关于如何正确地进行构建，如何创建一种体系结构蓝图，该体系结构蓝图允许进行可重用的构建，允许以更加松散耦合的方式工作，例如您构建了这样一个体系结构并要进行修改，那么无需打破原有设计。还有，如何在流模式下集成异构的 IT 系统。SOA 是真正支持使用可重用的组件或服务装配业务流程的体系结构，这些组件或服务独立于应用程序和它们运行的平台。</p>
		<p>这里的关键点是服务为真正可重用的构建块。这些概念确实不是新的了。我认为现在很多供应商创建的产品开始支持 SOA 标准，比如 Web 服务这样的产品，使 SOA 在很多 CIO 的心中占据了优先和中心地位。大型跨平台供应商，如 IBM、Microsoft、Oracle 以及 SAP 都开始以能吸引客户的方式支持这些标准 —— 因为支持更多的标准能帮助客户降低风险，很多标准都是这样产生的。在这种形势下构建 SOA 的能力开始变得很有前景，这可能是今天的 SOA 最激动人心的地方。在这一过程中标准起到了很重要的作用。</p>
		<p>
				<i>Doug：</i>我还要强调 SOA 包括面向服务的体系结构、对业务结构以及支持业务的 IT 系统进行推理的方法。事实上，SOA 是从顶层开始的，通过分析业务是如何运行的，以及如何把支持业务的业务流程分割为基本步骤 —— 人为执行的或者是通过多个自动片断执行的任务。SOA 的强大之处在于它给出了一种一致的方法，用于推理业务的结构，以及推理支持该业务的 IT 基础设施和组织。</p>
		<p>
				<i>Fernando：</i>帮助推动 SOA 的新事物是企业服务总线（Enterprise Service Bus，ESB）这个概念。我们能够通过标准定义所有的服务，这样非常棒。但是，ESB 允许我们安排这些服务，并以满足应用程序需要的方式同步或异步地调用它们。接口和松散耦合是两个由来已久的软件工程概念，但是我认为企业服务总线是使这个概念成为可能的关键因素。企业服务总线是促使 SOA 产生的因素之一。</p>
		<p>
				<b>你们提到 SOA 不是一个新事物，但是看起来直到最近人们才开始关注它。关注背后的主要原因是什么呢？</b>
				<br />
				<i>Doug：</i>我认为在该行业中有两个关键的变化，为考虑如何构造 SOA 重新注入了力量。Web 服务的描述功能与使用无处不在的互联网的 IT 系统相组合，可能是过去两年中许多 SOA 的思想重新热起来的驱动因素。什么都比不上公众的说服力，以及无处不在的技术解决方案，推动着前进的步伐。在过去，一些系统间互连的其他方式要通过专有的或是难于使用的协议，像 CORBA 和 IIOP，结果就我们需要取得一个单一的、通用的中间件基础设施 —— 具体内容要与规则保持高度的一致。Web 服务规范使人们只需很少的 IT 投资就能够解决这个问题。</p>
		<br />
		<a name="fig1">
				<b>Doug Wilson</b>
		</a>
		<br />
		<img height="181" alt="Doug Wilson" src="http://www-128.ibm.com/developerworks/cn/workplace/soa/fig1.jpg" width="180" />
		<br />
		<p>
				<b>哪类行业和公司是 SOA 的主要受益者？</b>
				<br />
				<i>Doug：</i>这是一个很难回答的问题。推动 SOA 实施的一个因素是通过很低的投资，就能够为小型企业提供技术。我认为这在很大程度上能够促使人们接受它，因为您不会被限制在某个范围，就是说不是大型企业或小型企业的问题。问题是 —— 也是机会 —— 任何规模的企业都可以使用 SOA 策略。其中的一个驱动因素是在大多数情况下，小型企业都是较大型企业的服务提供者。例如，如果我想外包运输业务，或者是外包客户满意度跟踪，或者是一个较大业务流程中的几个小型业务，那么我需要一个 IT 结构允许我将行为或服务委托给小型企业。可能在实施的初级阶段，大型企业将是服务的中心，但是许多小型企业将作为较大型企业的服务提供者形式出现。</p>
		<p>
				<i>Robert：</i>这一点十分好。显然，能够从 SOA 得到最大受益的组织，很可能是那些具有处于较高稳定状态的 IT 基础设施的组织。其中所有遗留下来的程序都不能进行及时修改，它们无法支持业务需求的变化。通常，您能够看到许多这样的组织可能支付这样的开销。一些即将成为行业先锋的公司正是那些具有投资和 IT 的公司，并且在这些公司中 IT 的使用比在其他公司中占有更大的比重。但是 SOA，在这一方面，能够从根本上转变 IT 基础设施，使其从业务的阻碍转变为业务变化的推动力。所以，如果您看一下像金融服务和银行之类的组织，它们通常都具有非常尖端的组织。</p>
		<p>我还注意到，如果您稍微关注一下，就能够发现一些组织还建立了体系结构控制部门，或者是跨学科和跨区域的群组，他们实际上是整体地研究整个组织的 IT 基础设施和体系结构。这预示着在未来 SOA 将取得成功。</p>
		<p>
				<b>除了 IT 方面外，SOA 会以哪些其他方式影响公司经营业务的方式？</b>
				<br />
				<i>Doug：</i>我认为事实上恰恰相反。业务方式的自我演化正迫使 IT 部门作出响应，SOA 就是由此而产生的强大支持模型。业务在不断地合并、放弃和重构，以及自我重组，并对 IT 部门跟上其发展提出了实质性的挑战。如果 IT 和企业能够为业务结构的推理形成统一的模型，并因此得到相应的 IT 结构，那么这将成为 IT 部门满足它们业务需要的强有力的推动力。</p>
		<p>
				<i>Robert：</i>看一下很多关于 IBM 帮助开始随需应变业务的讨论，当我们考虑一个随需应变的业务时，我们认为企业需要跨他们的组织以及他们所需的全部合作伙伴、供应商和客户，对业务过程进行集成。但是更重要的是，他们能够做出非常灵活的响应，并且能够随客户的需求、市场机会或其他可能出现的任何类型的机会和威胁做出响应。从这一观点出发，只是一味地花费、花费、花费和不进行调整的日子结束了。IT 和业务线正在以过去未曾有的方式结合到了一起。你不再为所有这些 IT 系统持续地花费资金，并且还得不到最初进行这些投资时所预期的回报。有了 IT 和业务线的密切合作，将帮助推动使用 SOA，帮助实现随需应变的业务这一目标。</p>
		<p>
				<i>Fernando：</i>我们描述的过程部分不仅采用了技术、标准和基础设施；并且还从工程的角度进行了分析，以确定什么是您所依靠的（我们将其称作 “原始的”）业务功能。原始的业务功能可能是像运输产品、重新进货报表或支付帐单这样的功能。当将它们作为服务进行嵌入时，就能够分离调用这些服务的逻辑，并且可以放到一个不同的位置。这是您真正获得适应性的地方 —— 如果这样做了，现在就可以用新的算法管理库存或运送包裹。逻辑是从原始的服务中分离出来的。当这样做时，就能够开始从适应性中获益。</p>
		<p>
				<b>SOA 将会成为新的 IBM 特性和产品吗？</b>
				<br />
				<i>Doug：</i>当然。最近，我们宣布了整个产品系列，目的非常明确，是要在我们的客户中推动 SOA 实施。关于我们在世界范围内推动 SOA 这一事件，各种论坛上都有具体和详细的报导。</p>
		<p>
				<i>Robert：</i>SOA 确实触及到了我们所有的软件生产线。请您看一下我们是如何定义 SOA 参考体系结构的，其中涉及建模、部署、变更和管理，我们有帮助实施 SOA 整个周期的产品。SOA 最大的优点是，公司不必一次性地完全加以实施；这里有很多的入口点，他们能够从这些入口点开始。这要依据组织正在做什么。一些组织可能非常依赖集成解决方案，例如消息传递。这些客户会问 “如何将系统集成到一起？如何确保可靠性和保证消息的传递？”。通常，当考虑高速消息传递和消息传递框架时，您将想到企业服务总线。我们有一个整套的产品线，主要为 WebSphere 品牌，我们还有已经宣布的带有业务集成的新产品，这些新产品还具有一些其他功能以支持 SOA 的核心。我们的其他产品，如 WebSphere Portal 和 IBM Workplace 产品，能够作为 SOA 的最好的组成部分。</p>
		<br />
		<a name="fig1">
				<b>Robert Duffner</b>
		</a>
		<br />
		<img height="182" alt="Robert Duffner" src="http://www-128.ibm.com/developerworks/cn/workplace/soa/fig2.jpg" width="180" />
		<br />
		<p>某些组织可能会选择从一些有机会的项目开始。这可能比较简单，“我需要构建门户中的一部分。我该如何开始组织、构建并将其放在具有面向服务体系结构特征的系统中？换句话说，在可以较高程度的重用的地方该如何做？”。您可以从定义服务开始。一个服务可以简单到只有一个业务流程，或是客户必须进行的一个操作，例如检查某个产品订单的状态。这个服务可以在客户将要登录的门户中自我显示。这个门户和服务将显示为一个 portlet，占用屏幕的一小部分。我将登录到系统中 —— 我能够快速地查看订单状态。这就是客户将会看到的。客户还会问 “我们如何进行构建？我们如何进行软件生命周期管理？我们如何开发和部署这些产品？”。所以我们在支持 SOA 的 Rational 品牌中还有另外一组完整的产品线。这里还有 Tivoli 产品集，使您能够进行安全性管理，并保证这些系统能够正常运行。我们的另外一个产品线用于信息管理；例如 DB2 产品线。它们带来了一整套的产品用于 SOA 策略的所有方面。</p>
		<p>最终情况依赖于我们的客户的需要。我们可以把更多的精力放在某些组织的整个能力的广度上，他们试图进行部署、考虑部署或者是想要部署面向服务的体系结构。在他们想从投资中获得回报时，就是他们开始的时机，这要根据业务的需求而定。</p>
		<p>
				<b>我们可以详细阐述一下在 SOA 中 WebSphere Portal 技术所扮演的角色吗？</b>
				<br />
				<i>Robert：</i>按照 Gene Phifer 的说法，他是 <a href="http://www.gartner.com/"><font color="#5c81a7">Gartner Research</font></a> 的一个门户权威，WebSphere Portal 是 SOA 出名之前的一种 SOA。回到互联网刚产生的时候，当我们过去使用门户时，我们中的很多人都理解门户和 portlet 的概念，这些门户如今在 Yahoo、AOL 和诸如此类的站点中变得十分流行。但是猜一猜怎么样？企业和大型组织想做同样的事情，但是在这种情况下内容不是必需的，却是有 “如何将所有的系统进行集成并提供单点访问？” 这一问题。因此，创建一个平台供重复使用这一想法实际上已经非常接近面向对象的体系结构。对许多组织而言，门户代表进入 SOA 的逻辑上的过渡，因为它允许组织做我们正在谈论的事情。您可以在一个基础设施上进行标准化，这样如果您开发了一个雇员门户，然后必须进行另外一个项目，那么您能够重用许多资产和基础设施，并开始从 SOA 中获益。对一些组织而言，门户是一个逻辑上、战略上的 SOA 入口点，这并不意味着您必须从这里开始，但是它为您提供了一个平滑的入口点。</p>
		<p>
				<i>Doug：</i>大多数的业务流程在处理过程中需要用户的参与。门户为构造人与面向服务的体系结构之间的用户交互提供了一种较好的方法。将服务的用户界面映射到屏幕上特定的小矩形中，例如 portlet，是一种非常常见的操作。portlet 还对用户能够访问的服务类型进行管理，并安排这些服务呈现在用户前的方式。这些功能，诸如 WebSphere Portal 的处理功能，允许用户安排一组服务和一组用户界面间的用户活动流。我们将门户的这些非常常见的部分作为体系结构中 Web 服务的基本表现工具。想像一下门户作为 SOA 的前端。正是在这里 SOA 触及到了用户。</p>
		<p>
				<b>SOA 会影响其他 IBM 产品吗，例如 Notes/Domino 和 IBM Workplace？</b>
				<br />
				<i>Doug：</i>Domino 作为一项集成技术，通过在 Domino 基础设施中添加定义 Web 服务并执行这些 Web 服务的功能，在支持 SOA 的过程中迈出了重大的一步。这是一个重要的新功能。许多 SOA 工作的初始阶段包括调整现有的系统，使之适应面向服务的体系结构。通常，这意味着在 Web 服务中封装这些系统的一些业务功能，并且在环境中显示 Web 服务。Domino 是这个领域中新的参与者。而 IBM Workplace 一开始就被设计为基于面向服务体系结构的应用程序系列。</p>
		<p>
				<i>Fernando：</i>确实是这样。IBM Workplace 是一组协作功能，会在门户中用到这些功能，但是其本质结构都是面向服务的体系结构。主要协作功能有一些服务接口，例如创建文档、发送电子邮件消息、创建 Web 会议等等。这些接口可以被调用、组合并与想开发的任何其他应用程序中的其他服务集成。例如，使用 Workplace，完全有可能调整组织中新员工的注册以及他们在想参加的课程中的注册，这些课程是由 Workplace Learning 提供的。所有这些都可以通过 Workplace 提供的 Web 服务 API 来实现。我们从一开始就将这作为我们的功能的整体意图，并且我们一直在努力提高这些 API 的功能以与其他流程集成，并提高整个系统的功能以支持这些用户交互。</p>
		<br />
		<a name="fig1">
				<b>Fernando Salazar</b>
		</a>
		<br />
		<img height="167" alt="Fernando Salazar" src="http://www-128.ibm.com/developerworks/cn/workplace/soa/fig3.jpg" width="180" />
		<br />
		<p>
				<b>需要些什么才能够使 IT 部门对 SOA 的理解同对业务线的理解相匹配？</b>
				<br />
				<i>Robert：</i>显然，要对 IT 部门进行创新。同时也要让业务线以不同于以前的方式加入进来。在我所工作过的某些组织中，技术从来不是阻碍成功的因素；而阻碍成功的因素通常与组织问题、部门问题、政治、组织间合作方式、设置管理方式等问题有关。用户不想定义业务线试图去做什么，而是将那些需求收集工作都交给 IT 人员，然后希望在 9 到 12 个月内就能取得巨大成果。</p>
		<p>组织正在重新思考他们当前的组织方式。现在可以看到 IT 和业务线的跨学科、跨功能角色的信息都聚集到一起，以更好地理解什么是业务需求，从而更好地理解技术如何帮助他们从一种组织方式转换到另一种组织方式。这就是 IBM 的业务咨询服务的重要作用，他们能帮助公司了解他们如何重新处理或重新思考作为一个组织应该如何运作，以及如何以不同于以前的方式来利用 IT，因此 IT 能成为组织的极具竞争性的优势。</p>
		<p>我希望 SOA 在组织中能像它在技术领域中那样流行，但通常并非如此。它实际上是让业务线和 IT 人员以更好地理解什么是需求的方式工作，从而确保项目取得成功，并理解每个需求在取得整个成功过程中都有其作用。而不是用户将项目交给 IT 人员，IT 人员又将其交给业务线这样一种运作方式。</p>
		<p>
				<i>Doug：</i>从入门角度来说，有多种可能的方法。一种是自顶向下的方法，从业务开始，然后是业务分析、为组织建模，最后是对业务流程进行建模。这种方法受 <a href="http://www.ibm.com/software/awdtools/architect/swarchitect/"><font color="#5c81a7">Rational Software Architect</font></a> 套件的工具支持。更常见的是 “双向逼近” 战略，IT 人员从认识 Web 服务和 SOA 的封装和集成战略开始，并构建一定数量的体系结构，然后加入到业务中以便在可能的情况下利用这些体系结构。正如 Robert 所说的，SOA 实际上是关于将业务和 IT 组织合并到一起，在粒度级和业务行为方面达成一致，从而由服务对其进行建模。</p>
		<p>
				<b>IT 组织如何能够使 SOA 被业务线获得和使用？</b>
				<br />
				<i>Robert：</i>这又回到了我们刚才谈论的话题，就是关于如何使用 WebSphere Portal 技术来实现 SOA，并将 Workplace 作为 Portal 技术的一种超集。通过将服务目录映射到 portlet 目录（即为所提供的服务创建用户界面），并且通过使用 WebSphere Portal 来驱动服务和用户之间的用户交互，这是一个很好的过渡，适合于很多客户已经进行的 IT 工作。因此我们认为 WebSphere Portal 是业务线用户能够访问 SOA 的关键。</p>
		<p>
				<i>Fernando：</i>要详细描述这一点，也可以这么说，IT 领域和业务线领域之间的常见分工是，开发人员在 IT 方构建标准的组件。这些界面可以作为 portlet，这些 portlet 访问企业服务，然后 IT 组织会将 portlet 组织到模板中。模板是服务的可重用组合，不同业务线的终端用户都可以访问这些服务，并根据他们的自身需要对这些服务进行定制（这是一个关键部分）。同时使用 WebSphere Portal 和 Workplace，用户的系统可以变得更灵活，由此可以为销售群组或研发部门定制能访问这些企业服务的标准模板，以包括特定类型的表单，从而收集自己的信息或涵盖您所感兴趣的项的特定文档集，或上面标记了对您的团队来说非常重要的事件和里程碑的特定日历。这是一种本地定制，这些本地格式化的企业工作空间使这些组织内的各个群组可以利用 SOA 的价值。</p>
		<p>
				<i>Robert：</i>的确如此，他说出了我们工作的意义和 WPLC 组织是什么。随着组织开始使他们的基础设施变得合理，并试图提高工作效率，您将看到这些流程驱动的门户、企业工作空间、企业桌面 —— 这些是您所听到的用于描述这些事情的术语 —— 作为公司跨企业优化他们的协作业务流程的首选方法而出现。WebSphere Portal 和 Workplace 能扮演如此重要角色是因为它们是商业人士实际所用的工具。用户无需接触很多集成技术，因为这些都是底层技术。但是他们的确接触到了这些桌面 —— 这些企业工作空间。</p>
		<p>
				<b>你们如何看待 SOA 将塑造软件工业的未来（或是这方面的其他工业）？</b>
				<br />
				<i>Doug：</i>我将更清晰地预测一下未来，我们已经说过 SOA 是业务和 IT 组织很好的交汇场所。我认为这将导致根本上的变化。我们还略微提到了一些 Web 服务，尤其是互联网上的 Web 服务，允许小型业务和大型业务集合到一起，使 IT 基础设施的花费同时适用于它们。并且其通过互联网创建大型的、面向服务的系统的能力，我认为前景非常广阔。随着互联网支持大量其他新出现的业务模型，我认为在服务提供者和服务消费者的领域，将会有一整套新的业务模型。</p>
		<p>
				<i>Robert：</i>我认为服务的重点是继续强调虚拟化和适应的作用，这就像软件产品的交付。如今，我们经常需要深入了解软件系统的参数和选项才能进行安装，然后再来调整这些参数和选项。软件在某种程度上来说本身就是一种服务，用户将其添加到网络基础设施中并让其工作，现在该软件即是可以作为端点来访问的服务。可以对该服务进行管理，将其连接到其他服务，但是不需要深入了解这些服务的内部工作原理。用户更多的是注意它所带来的价值。作为软件开发人员，这对我们来说并不容易，实际上，我认为这是一件很难的事情。但是让我们所有的产品以相同的方式互相通信是我们的预期目标。</p>
		<p>
				<b>有什么需要补充吗？</b>
				<br />
				<i>Doug：</i>我要再强调一下，我们将 WebSphere Portal 和 IBM Workplace 技术作为该行业的关键技术。随着人们在互联网上提供服务的改进和增加、组织内部对服务可用性的改进、业务线帮助他们自身和创建新的最适合其业务需要的服务组合的机会，这些都将越来越多地需要 IT 基础设施。IBM Workplace 是一种旨在允许业务线用户创建和构建他们自己的结构、能力以及应用程序的产品，以可用的协作服务和由 IT 组织或应用程序供应商带入到应用环境中的其他服务为基础。因此我们认为自我服务和用户驱动这两者相结合非常重要。</p>
		<p>
				<i>Robert：</i>我将借用一下别人的展望和预测 —— 如果您看一下 <a href="http://www.idc.com/"><font color="#5c81a7">IDC</font></a> 上系统专家的分析，那么就会看到他们的确相信一个新的用户工作环境将在今后的五年中出现，一种新的、统一的、模块化的企业软件组合将为该环境提供支持，该环境构建在面向服务的体系结构之上。他们称其为企业工作空间，它将极大地改进应用程序和工作人员之间的交互，以及工作人员之间的协作。您将看到前所未有的效率水平。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:19 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM WebSphere 开发者技术期刊: 使用服务组件体系结构构建 SOA 解决方案——第 2 部分-----组装 SCA 组件</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5724.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:18:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5724.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5724.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5724.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5724.html</trackback:ping><description><![CDATA[
		<blockquote>检验 IBM WebSphere Integration Developer 组装的SCA 组件的上下文中的引用和连线。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>摘自 <a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/"><font color="#5c81a7">IBM WebSphere 开发者技术期刊</font></a>。</p>
		<p>
				<a name="intro">
						<span class="atitle">
								<font face="Arial" size="4">引言</font>
						</span>
				</a>
		</p>
		<p>在这一系列文章的<a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0510_brent/0510_brent.html"><font color="#996699">第 1 部分</font></a>，我们引入了服务组件体系结构（Service Component Architecture，SCA）作为编程模型来构建和组装集成解决方案，包括简要介绍什么是 SCA，以及一些相关术语的定义。我们还提供了一个通过 IBM WebSphere Integration Developer 使用 Java™ 构建 SCA 组件的示例，测试了该 SCA 组件，并使用 SCA 客户端编程模型构建了一个调用该 SCA 组件的示例 JSP 文件。在第 2 部分中，我们将继续描述引用和连线，并介绍如何使用它们来组装 SCA 组件。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="sec1">
						<span class="atitle">
								<font face="Arial" size="4">概述</font>
						</span>
				</a>
		</p>
		<p>在<a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0510_brent/0510_brent.html"><font color="#996699">第 1 部分</font></a>介绍的示例中，我们使用了一个简单的 JSP 客户端来调用 SCA 组件。该示例只用于演示；当构建您自己的实际自定义应用程序时，您可能会使用标准 J2EE™ 组件模型来实现应用程序逻辑。J2EE Web 应用程序将继续调用 Enterprise JavaBean 来访问特定于应用程序的功能。实际上，SCA 编程模型是用于业务集成、应用程序组合和解决方案组装的，而不是用于 J2EE 应用程序开发的。SCA 客户端（它可以是 J2EE）通常在进程管理器外，例如它可以使用 BPEL 流程来编排工作流。与 BPEL 流程联合部署的 Web 应用程序也可以使用 SCA 编程模型来调用特定于应用程序的功能。图 1 显示了 SCA 生态系统的一个示例。</p>
		<br />
		<a name="fig1">
				<b>图 1. SCA 生态系统</b>
		</a>
		<br />
		<img height="559" alt="图 1. SCA 生态系统" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig1.gif" width="539" />
		<br />
		<p>SCA 位于集成层。SCA 组件可以通过导入来调用 SCA 运行时外的应用程序。非 SCA 客户端可以通过导出调用 SCA 组件。在集成层内，可以通过定义<b>引用</b>和使用<b>连线</b>来组合 SCA 组件，这将在本文中重点介绍。有了连线和引用，您就可以在开发时定义运行时调用的特性；例如，使调用同步或异步，标记调用的转换边界，等等。这些特性是在部署时读取的，它们可以启用所需的运行时行为。图 2 阐释了这些高级概念。</p>
		<br />
		<a name="fig2">
				<b>图 2. 引用和连线的高级视图</b>
		</a>
		<br />
		<img height="467" alt="图 2. 引用和连线的高级视图" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig2.gif" width="548" />
		<br />
		<p>再次说明，我们关注的是集成层，而不是应用层。另外，我们介绍的是较高级的集成，例如工作流编排或与 EIS 系统的高级集成。然而，出于演示目的，我们使用简单的 Java 示例来显示如何将组件连接到集成层中，强调的是连线和引用的功能而不是组件本身的实现。（在后续文章中，我们将介绍如何将 SCA 组件实现为 BPEL 流程和状态机，以及如何应用连线技术。）因此我们使用一个按比例缩减的模型来阐释引用和连线，如图 3 所示；然而，我们要记住图 2 中合适的 SCA 使用远景。</p>
		<br />
		<a name="fig3">
				<b>图 3. 简化的引用和连线模型</b>
		</a>
		<br />
		<img height="343" alt="图 3. 简化的引用和连线模型" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig3.gif" width="554" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="sec2">
						<span class="atitle">
								<font face="Arial" size="4">引用</font>
						</span>
				</a>
		</p>
		<p>正如<a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0510_brent/0510_brent.html"><font color="#996699">第 1 部分</font></a>所讨论的，SCA 组件被打包成一个 SCA 模块。一个模块中的 SCA 组件通过对调用的 SCA 组件定义引用来彼此交互，并且将这些引用连线到相同模块中的其他 SCA 组件。图 4 阐释了这一概念。</p>
		<br />
		<a name="fig4">
				<b>图 4. 引用和连线概念</b>
		</a>
		<br />
		<img height="137" alt="图 4. 引用和连线概念" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig4.jpg" width="351" />
		<br />
		<p>对调用组件的<b>引用</b>是用 SCDL 表示的，如下所示：</p>
		<br />
		<a name="N100F5">
				<b>清单 1</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
&lt;scdl:component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:java="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0"
xmlns:ns1="http://CreditApproval/CreditRequest"
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0"
xmlns:wsdl="http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0"
displayName="CreditApproval" name="CreditApproval"&gt;
  &lt;interfaces&gt;
    &lt;interface xsi:type="wsdl:WSDLPortType" portType="ns1:CreditRequest"&gt;
      &lt;method name="calulateCreditScore"/&gt;
    &lt;/interface&gt;
  &lt;/interfaces&gt;
  &lt;references&gt;
    &lt;reference name="CreditHistoryPartner"&gt;
      &lt;interface xsi:type="java:JavaInterface" 
      interface="approval.credit.credit.history.CreditHistory"&gt;
        &lt;method name="getCreditLimit"/&gt;
      &lt;/interface&gt;
      &lt;wire target="CreditHistory"/&gt;
    &lt;/reference&gt;
    &lt;reference name="CreditAgencyPartner"&gt;
      &lt;interface xsi:type="java:JavaInterface" 
      interface="approval.credit.credit.agency.CreditAgency"&gt;
        &lt;method name="getCreditScore"/&gt;
      &lt;/interface&gt;
      &lt;wire target="CreditAgency"/&gt;
    &lt;/reference&gt;
  &lt;/references&gt;
  &lt;implementation xsi:type="java:JavaImplementation" 
  class="sca.component.java.impl.CreditApprovalImpl"/&gt;
&lt;/scdl:component&gt;</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>引用的好处之一是能够定义调用期间的服务质量。当在 Assembly Editor 中连线组件时，可以指定服务质量 (QoS) 限定符。这些限定符定义了调用期间在 SCA 运行时管理组件的必要条件。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="sec3">
						<span class="atitle">
								<font face="Arial" size="4">限定符</font>
						</span>
				</a>
		</p>
		<p>使用 SCA，您无需编程或更改服务实现代码就可以对组件应用 QoS 限定符（例如事务、安全性和可靠的异步调用）。在连线组件时，您可以指定限定符来为组件以及访问服务的客户端提供扩展的服务质量。在 IBM WebSphere Process Server 中，您可以在三个地方定义 SCA 限定符：</p>
		<ul>
				<li>引用 
</li>
				<li>接口 
</li>
				<li>实现 </li>
		</ul>
		<p>在运行时，这些规范确定了客户端如何与目标组件进行交互。运行时环境可以提供所需的任何额外处理，这取决于所指定的限定符。</p>
		<p>
				<a name="sec3a">
						<span class="smalltitle">用于引用的限定符</span>
				</a>
		</p>
		<p>引用限定符可以指定异步调用的可靠性，以及是否应该联合目标组件的方法，使之成为任何客户端事务的一部分。</p>
		<p>引用限定符包括：</p>
		<ul>
				<li>
						<p>
								<b>Asynchronous reliability</b> - 允许发生异步调用。这些限定符还允许您指定消息的可靠性、请求和响应超时。同时也能配置 Service Integration Bus——它在 IBM WebSphere Application Server 运行时中提供消息传递平台，因此对 WebSphere Process Server 可用。（有关 Service Integration Bus 的信息，请参阅<a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia.html#resources"><font color="#996699">参考资料</font></a>。）</p>
				</li>
				<li>
						<p>
								<b>Suspend transaction</b> - 对于同步调用，当使用同步编辑模型进行调用时，客户端全局事务上下文始终会被传播到目标组件。（此限定符只影响客户端全局事务，因为本地事务从不传播到目标组件。）对于客户端不想让目标组件与客户端事务联合的用例，需要使用挂起事务限定符设置来进一步限定引用：</p>
						<ul>
								<li>
										<b>True </b>会在通过服务引用调用组件之前挂起当前全局事务。 
</li>
								<li>
										<b>False</b>（缺省值）指示运行时在通过服务引用调用组件之前不要挂起全局事务。 </li>
						</ul>
				</li>
				<li>
						<p>
								<b>Asynchronous invocation</b> - 确定是否应该进行异步调用（作为任何客户端事务的一部分）。值：</p>
						<ul>
								<li>
										<b>Call</b>（缺省值）指示运行时在进行服务调用的同时将消息提交给异步调用的目的地。 
</li>
								<li>
										<b>Commit </b>指示运行时将消息提交给异步调用的目的地的工作交给当前工作范围单元处理。 </li>
						</ul>
				</li>
				<li>
						<p>
								<b>Suspend activity session</b> - 活动会话能够对可能不支持分布式事务的资源进行更高级的协调。集成解决方案中更可能出现此类情况；客户端不想让目标组件与客户端的活动会话相联合，所以需要使用挂起活动会话限定符设置来进一步地限定引用：</p>
						<ul>
								<li>
										<b>True </b>会在通过服务引用调用组件之前挂起当前活动会话（如果存在）。 
</li>
								<li>
										<b>False</b>（缺省值）指示运行时在通过服务引用调用组件之前不要挂起任何处于活动状态的活动会话。 </li>
						</ul>
				</li>
		</ul>
		<p>您可以指定引用限定符，以便它们应用于服务组件的所有引用或者只应用于独立引用。如果需要，您还可以为每个引用指定这些限定符，在这种情况下它们将重写任何顶级限定符设置。在 Properties 视图中以灰色表示继承的限定符，以黑色表示已赋值的限定符。继承的限定符不能更改，除非您选择定义它们的所在元素。</p>
		<p>
				<a name="sec3b">
						<span class="smalltitle">用于接口的限定符</span>
				</a>
		</p>
		<p>接口限定符说明了被目标服务支持的QoS，因此代表了一个与该服务客户端的约定。</p>
		<p>接口限定符包括：</p>
		<ul>
				<li>
						<p>
								<b>Join activity session</b> - 确定目标服务是否愿意加入传播的活动会话范围。值：</p>
						<ul>
								<li>
										<b>True </b>指示运行时不要在接口边界挂起活动会话（如果存在）。 
</li>
								<li>
										<b>False</b>（缺省值）指示运行时在接口边界挂起活动会话（如果存在）。 </li>
						</ul>
				</li>
				<li>
						<p>
								<b>Join transaction</b> - 确定目标服务是否愿意加入传播的全局事务。值：</p>
						<ul>
								<li>
										<b>True </b>指示运行时不要在接口边界挂起全局事务（如果存在）。 
</li>
								<li>
										<b>False</b>（缺省值）指示运行时在接口边界挂起全局事务（如果存在）。 </li>
						</ul>
				</li>
				<li>
						<p>
								<b>Security permission</b> - 使您能够在 SCA 组件上定义 J2EE 角色。只有与声明的角色相关联的客户端才能调用该组件。</p>
				</li>
		</ul>
		<p>所有接口限定符都可以应用于组件的三个级别： </p>
		<ul>
				<li>用于其所有接口 
</li>
				<li>用于单个接口 
</li>
				<li>用于某个接口的单个操作。 </li>
		</ul>
		<p>操作的限定符覆盖接口的限定符；接口的限定符覆盖组件的所有接口的限定符。</p>
		<p>
				<a name="sec3c">
						<span class="smalltitle">用于实现的限定符</span>
				</a>
		</p>
		<p>实现限定符提供确定服务权限和/或表示其对事务环境的需求的功能。</p>
		<p>接口限定符包括：</p>
		<ul>
				<li>
						<p>
								<b>Activity session</b> - 确定组件的处理是否在一个活动会话中执行，除了全局事务上下文所提供的，它还提供一个备选的工作范围单元。值：</p>
						<ul>
								<li>
										<b>True</b>：组件将在活动会话的上下文中执行。如果活动会话是在调用时出现的，则会添加该组件。 
</li>
								<li>
										<b>False</b>（缺省值）：组件将在现有的全局事务（如果存在）或本地事务的上下文中执行。实现限定符为 activitySession=false 的组件必须使用接口限定符 joinActivitySession=false。 
</li>
								<li>
										<b>Any</b>：如果存在活动会话，则组件会加入当前活动会话。如果不存在活动会话，则组件会在现有的工作范围单元或本地事务的上下文中执行。 </li>
						</ul>
				</li>
				<li>
						<p>
								<b>Transaction</b> - 确定组件处理执行的逻辑工作单元。对于逻辑工作单元，事务期间所做的全部数据修改都是作为一个单元一起提交或作为一个单元回滚的：</p>
						<ul>
								<li>
										<b>Global</b>：组件将在全局事务的上下文中执行。如果在调用时存在一个全局事务，则该组件会被添加到该全局事务范围。如果不存在全局事务，则会建立新的事务范围。 
</li>
								<li>
										<b>Local</b>（缺省值）：组件将在本地事务的上下文中执行。 
</li>
								<li>
										<b>Any</b>：如果存在一个全局事务，则组件将加入当前全局事务范围。如果不存在全局事务，则组件将在本地事务的上下文中执行。 </li>
						</ul>
				</li>
				<li>
						<p>
								<b>Security identity</b> - 使您能够指定组件担当的身份，与部署描述符上的 J2EE Run-As 约束类似。</p>
				</li>
		</ul>
		<p>限定符是在 SCDL 文件中定义的：接口限定符是在接口部分定义的，实现限定符是在实现部分定义的，引用限定符是在引用部分定义的。（有关详细信息，请查阅 <a href="http://publib.boulder.ibm.com/infocenter/dmndhelp/v6rxmx/index.jsp?topic=/com.ibm.wbit.help.wiring.ui.doc/topics/cpolicies.html"><font color="#5c81a7">WebSphere Process Server Information Center</font></a>。）</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="sec4">
						<span class="atitle">
								<font face="Arial" size="4">连线组件</font>
						</span>
				</a>
		</p>
		<p>在对引用有了新的理解之后，我们现在可以将一些组件通过连线连接起来。我们将使用的示例十分简单，但在这个过程中我们也会检查各种可用的服务质量。我们将继续介绍在<a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0510_brent/0510_brent.html"><font color="#996699">第 1 部分</font></a>使用的信贷审批示例。</p>
		<p>在我们的示例中：</p>
		<ul>
				<li>Credit Approval 组件必须调用 Credit History 组件以及 Credit Agency 组件。 
</li>
				<li>Credit Approval 组件将作为这两个服务的一个 Facade。 
</li>
				<li>Credit Approval 组件需要连线到其他组件。 </li>
		</ul>
		<p>这一练习所需要的文件可以从本文所附带的<a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia.html#download"><font color="#996699">下载文件</font></a>中获得。</p>
		<p>
				<a name="sec4a">
						<span class="smalltitle">设置工作区</span>
				</a>
		</p>
		<ol>
				<li>
						<p>启动 WebSphere Integration Developer 并创建一个新的工作区（图 5）。</p>
						<br />
						<a name="fig5">
								<b>图 5. 在 WebSphere Integration Developer 中创建工作区</b>
						</a>
						<br />
						<img height="245" alt="图 5. 在 WebSphere Integration Developer 中创建工作区" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig5.jpg" width="546" />
						<br />
				</li>
				<li>
						<p>关闭欢迎屏幕（图 6）。</p>
						<br />
						<a name="fig6">
								<b>图 6. WebSphere Integration Developer 欢迎屏幕</b>
						</a>
						<br />
						<img height="160" alt="图 6. WebSphere Integration Developer 欢迎屏幕" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig6.jpg" width="413" />
						<br />
				</li>
				<li>
						<p>要从下载的文件导入项目交换文件，请右键单击 <b>Business Integration </b>视图并选择 <b>Import</b>（图 7）。</p>
						<br />
						<a name="fig7">
								<b>图 7. 导入下载文件</b>
						</a>
						<br />
						<img height="405" alt="图 7. 导入下载文件" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig7.jpg" width="215" />
						<br />
				</li>
				<li>
						<p>选择 <b>Project Interchange</b>，然后单击 <b>Next</b>（图 8）。</p>
						<br />
						<a name="fig8">
								<b>图 8. 导入项目</b>
						</a>
						<br />
						<img height="552" alt="图 8. 导入项目" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig8.jpg" width="472" />
						<br />
				</li>
				<li>
						<p>假设您已经将下载的文件解压缩到 C: 驱动器，则选择 <b>CreditApprovalPart2.zip </b>文件，然后单击 <b>Select All </b>和 <b>Finish</b>（图 9）。</p>
						<br />
						<a name="fig9">
								<b>图 9. 导入项目</b>
						</a>
						<br />
						<img height="552" alt="图 9. 导入项目" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig9.jpg" width="479" />
						<br />
				</li>
		</ol>
		<p>
				<a name="sec4b">
						<span class="smalltitle">检查组件</span>
				</a>
		</p>
		<p>在我们的示例中，我们将使用自底向上的开发风格：我们有一个现有的 SCA 组件集并准备对它们进行集成。从 Business Integration 视图中，您可以检查该 SCA 模块：</p>
		<ol start="6">
				<li>
						<p>展开 CreditApproval 模块（图 10）。</p>
						<br />
						<a name="fig10">
								<b>图 10. 展开的 Credit Approval 模块</b>
						</a>
						<br />
						<img height="486" alt="图 10. 展开的 Credit Approval 模块" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig10.jpg" width="422" />
						<br />
				</li>
				<li>
						<p>请注意，它有三个接口和三个 Java 实现。打开 <b>CreditApprovalImpl </b>Java 实现并转到 <b>calculateCreditScore() </b>方法。请注意，calculateCreditScore 同时与 CreditAgency 组件和 CreditHistory 组件进行交互来完成其服务。您很容易想到将 CreditApproval Service 实现为 BPEL 流程或其他组件类型，但在本例中，我们用一个简单的 Java 组件来作为 Facade。</p>
						<br />
						<a name="N102FE">
								<b>清单 2</b>
						</a>
						<br />
						<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
								<tbody>
										<tr>
												<td>
														<pre>
																<code class="section">
																		<font face="Lucida Console" size="2">						
public DataObject calulateCreditScore(DataObject creditApp) {
		
	ServiceManager serviceManager = new ServiceManager();

	BOFactory bof = (BOFactory)serviceManager.locateService("com/ibm/websphere/bo/BOFactory");

	DataObject creditRating = bof.create("http://CreditApproval", "CreditRating");

	creditRating.setString("customerId", creditApp.getString("customerId"));
		
	CreditAgency creditAgency = (CreditAgency) 
	serviceManager.locateService("CreditAgencyPartner");

	Integer creditScore = creditAgency.getCreditScore(creditApp);

	CreditHistory creditHistory = (CreditHistory) 
	serviceManager.locateService("CreditHistoryPartner");
		
	Double creditLimit = creditHistory.getCreditLimit(creditApp);

		
	creditRating.setInt("creditScore", creditScore.intValue());
	creditRating.setDouble("creditLimit", creditLimit.doubleValue());

	return creditRating;
	}</font>
																</code>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
						<br />
				</li>
				<li>
						<p>要打开 Assembly Editor，请双击 CreditApproval 集合（图 11）。当 Assembly Editor 打开时，会显示三个组件（图 12）。</p>
						<br />
						<a name="fig11">
								<b>图 11. 打开 Assembly Editor</b>
						</a>
						<br />
						<img height="485" alt="图 11. 打开 Assembly Editor" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig11.jpg" width="421" />
						<br />
						<br />
						<a name="fig12">
								<b>图 12. Assembly Editor 中的组件</b>
						</a>
						<br />
						<img height="273" alt="图 12. Assembly Editor 中的组件" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig12.jpg" width="485" />
						<br />
				</li>
		</ol>
		<p>
				<a name="sec4c">
						<span class="smalltitle">连线组件</span>
				</a>
		</p>
		<p>CreditApproval 组件通过使用简单的 SCA 客户端 API 来与 CreditAgency 和 CreditHistory 进行交互。然而，要让运行时正确地调用这些服务，需要将组件“连线”起来，使用 WebSphere Integration Developer 来进行这一操作非常简单。在我们的示例中，我们将接受缺省值。</p>
		<ol start="9">
				<li>
						<p>选择 <b>CreditAproval </b>组件并将其连线到 CreditAgency 组件（图 13）。</p>
						<br />
						<a name="fig13">
								<b>图 13. 连线组件</b>
						</a>
						<br />
						<img height="256" alt="图 13. 连线组件" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig13.jpg" width="466" />
						<br />
				</li>
				<li>
						<p>将显示一个对话框（图 14），表明将在 CreditApproval 组件上创建一个引用。选择 <b>OK</b>。</p>
						<br />
						<a name="fig14">
								<b>图 14. 匹配引用对话框</b>
						</a>
						<br />
						<img height="159" alt="图 14. 匹配引用对话框" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig14.jpg" width="441" />
						<br />
				</li>
				<li>
						<p>由于 CreditApproval 组件是一个 Java 组件，所以我们需要用 WebSphere Integration Developer 生成 Java 接口以便能够调用该组件。因此，在下一个对话框（图 15）中选择 <b>Yes</b>。如果 CreditApproval 已经是一个完整的 BPEL 流程，则选择 <b>No</b>。（请记住，在大多数情况下将使用 WSDL 作为集成层中的接口选择。如果 User Interface 是与集成解决方案联合部署的，则可以使用 Java 接口。）</p>
						<br />
						<a name="fig15">
								<b>图 15. 生成 Java 接口对话框</b>
						</a>
						<br />
						<img height="196" alt="图 15. 生成 Java 接口对话框" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig15.jpg" width="443" />
						<br />
				</li>
				<li>
						<p>重复步骤 9 到 11，将 CreditApproval 组件连线到 CreditHistory 组件。结果应该与图 16 类似。</p>
						<br />
						<a name="fig16">
								<b>图 16. 组件连线完成</b>
						</a>
						<br />
						<img height="201" alt="图 16. 组件连线完成" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig16.jpg" width="402" />
						<br />
				</li>
		</ol>
		<p>
				<a name="sec4d">
						<span class="smalltitle">单元测试组件</span>
				</a>
		</p>
		<p>因为我们使用 Java 作为我们的实现，所以可以在 Java SE 环境中对组件进行单元测试。正如在<a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0510_brent/0510_brent.html"><font color="#996699">第 1 部分</font></a>所做的，我们很容易在 WebSphere Integration Developer 中调出单元测试工具：</p>
		<ol start="13">
				<li>
						<p>右键单击 <b>CreditApproval </b>组件并选择 <b>Test Component</b>（图 17）。</p>
						<br />
						<a name="fig17">
								<b>图 17. 测试组件</b>
						</a>
						<br />
						<img height="519" alt="图 17. 测试组件" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig17.jpg" width="285" />
						<br />
				</li>
				<li>
						<p>将显示单元测试工具。该单元测试功能的一个很好的优点是它允许独立测试组件，并且可以检测引用和创建模拟器。在我们的例子中，我们自己测试集成，所以需要删除模拟器。</p>
				</li>
				<li>
						<p>切换到 <b>Configurations </b>选项卡。</p>
				</li>
				<li>
						<p>展开 <b>Module CreditApproval </b>模块，突出显示 <b>CreditAgency </b>和 <b>CreditHistory</b>，并将它们从 Emulators 列表中<b>删除</b>（图 18）。现在，测试 CreditApproval 组件将导致调用 CreditHistory 和 CreditAgency 组件，而不会模拟交互。</p>
						<br />
						<a name="fig18">
								<b>图 18. 删除模拟器</b>
						</a>
						<br />
						<img height="192" alt="图 18. 删除模拟器" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig18.jpg" width="531" />
						<br />
				</li>
				<li>
						<p>切换回 <b>Events </b>选项卡并突出显示 <b>Invoke </b>项（图 19）。</p>
						<br />
						<a name="fig19">
								<b>图 19. Events 选项卡</b>
						</a>
						<br />
						<img height="406" alt="图 19. Events 选项卡" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig19.jpg" width="269" />
						<br />
				</li>
				<li>
						<p>填充输入，如图 20 所示。</p>
						<br />
						<a name="fig20">
								<b>图 20. 数据参数</b>
						</a>
						<br />
						<img height="335" alt="图 20. 数据参数" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig20.jpg" width="526" />
						<br />
				</li>
				<li>
						<p>单击 <b>Continue</b>。</p>
				</li>
				<li>
						<p>选择 <b>Eclipse 1.4 JVM </b>选项（图 21）。</p>
						<br />
						<a name="fig21">
								<b>图 21. 选择部署位置</b>
						</a>
						<br />
						<img height="411" alt="图 21. 选择部署位置" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig21.jpg" width="438" />
						<br />
				</li>
				<li>
						<p>检查每个步骤的流程。您可以实际看到流经组件的数据（图 22）。</p>
						<br />
						<a name="fig22">
								<b>图 22. 事件流</b>
						</a>
						<br />
						<img height="239" alt="图 22. 事件流" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig22.jpg" width="445" />
						<br />
				</li>
				<li>
						<p>最终结果应该与图 23 类似。</p>
						<br />
						<a name="fig23">
								<b>图 23. 测试结果</b>
						</a>
						<br />
						<img height="203" alt="图 23. 测试结果" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig23.jpg" width="467" />
						<br />
				</li>
				<li>
						<p>关闭测试编辑器，不进行保存。</p>
				</li>
		</ol>
		<p>
				<a name="sec4e">
						<span class="smalltitle">检查服务质量</span>
				</a>
		</p>
		<p>引用和连线是集成解决方案的关键，因为它们抽象出调用的方式和场合。当在 WebSphere Process Server 中运行时，您可以定义想为调用设定的服务质量。例如，您可以使调用异步化、可以更改事务上下文，或者使异步调用更加可靠。这里我们将通过检查引用属性来查看各种 QoS 选项。</p>
		<ol start="24">
				<li>
						<p>选择 CreditApproval 组件上的 <b>CreditAgency </b>引用，如图 24 所示。</p>
						<br />
						<a name="fig24">
								<b>图 24. 组件引用</b>
						</a>
						<br />
						<img height="124" alt="图 24. 组件引用" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig24.jpg" width="336" />
						<br />
				</li>
				<li>
						<p>转到 <b>Properties </b>视图。您将注意到该引用被选中。</p>
						<br />
						<a name="fig25">
								<b>图 25. 选中的引用</b>
						</a>
						<br />
						<img height="219" alt="图 25. 选中的引用" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig25.jpg" width="327" />
						<br />
				</li>
				<li>
						<p>在 <b>Details </b>选项卡上（图 26），将显示被调用的接口和多样性，以及作为目标的连线。您可以更改调用的多样性；对于异步调用，这样可以以一种发布/订阅方式调用几个组件。</p>
						<br />
						<a name="fig26">
								<b>图 26. 引用详细信息</b>
						</a>
						<br />
						<img height="246" alt="图 26. 引用详细信息" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig26.jpg" width="382" />
						<br />
				</li>
				<li>
						<p>切换至 <b>Qualifiers </b>选项卡（图 27）以设置特定服务质量。</p>
						<br />
						<a name="fig27">
								<b>图 27. Qualifiers 选项卡</b>
						</a>
						<br />
						<img height="278" alt="图 27. Qualifiers 选项卡" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig27.jpg" width="333" />
						<br />
				</li>
				<li>
						<p>单击 <b>Add </b>按钮来查看几个可用的服务质量（图 28）。</p>
						<br />
						<a name="fig28">
								<b>图 28. 服务质量限定符</b>
						</a>
						<br />
						<img height="327" alt="图 28. 服务质量限定符" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig28.jpg" width="318" />
						<br />
				</li>
				<li>
						<p>作为自我练习，您可以试验这些限定符，请记住，这些质量需要在 WebSphere Process Server 运行时中测试。这些限定符包括事务质量和异步质量；要测试事务工作，您需要与资源交互的组件。特定服务质量是在接口中定义的。这使得该组件能够控制其他组件调用它的方式。</p>
				</li>
				<li>
						<p>突出显示 Assembly Editor 中的 <b>CreditApproval </b>接口（图 29），或者导航至 Properties 编辑器。</p>
						<br />
						<a name="fig29">
								<b>图 29. Assembly Editor 中选定的 CreditApproval</b>
						</a>
						<br />
						<img height="134" alt="图 29. Assembly Editor 中选定的 CreditApproval" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig29.jpg" width="366" />
						<br />
				</li>
				<li>
						<p>检查服务质量限定符（图 30）和实现限定符。请注意，这些限定符是在被调用的服务（而不是调用它的服务）上定义的。</p>
						<br />
						<a name="fig30">
								<b>图 30. 检查限定符</b>
						</a>
						<br />
						<img height="415" alt="图 30. 检查限定符" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig30.jpg" width="559" />
						<br />
				</li>
		</ol>
		<p>
				<a name="sec4f">
						<span class="smalltitle">在 WebSphere Process Server 测试环境中测试</span>
				</a>
		</p>
		<p>要测试服务质量，您通常需要在 WebSphere Process Server 中运行，或者在 WebSphere Integration Developer 中为测试提供的 WebSphere Process Server 运行时运行。</p>
		<ol start="32">
				<li>
						<p>在 <b>Servers </b>视图中，右键单击该服务器并选择 <b>Start</b>（图 31）。</p>
						<br />
						<a name="fig31">
								<b>图 31. 启动测试环境中的服务器</b>
						</a>
						<br />
						<img height="379" alt="图 31. 启动测试环境中的服务器" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig31.jpg" width="444" />
						<br />
						<br />
						<a name="fig32">
								<b>图 32. 服务器已启动</b>
						</a>
						<br />
						<img height="110" alt="图 32. 服务器已启动" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig32.jpg" width="353" />
						<br />
				</li>
				<li>
						<p>当服务器启动后，您可以按照管理控制台中的指示（图 32），以一种类似于添加 J2EE 应用程序的方式将该 SCA 模块添加到服务器中，因为 SCA 模块被包装成 EAR 文件（如第 1 部分所提到的）。再次右键单击服务器并选择 <b>Add and remove rojects...</b>（图 33）。</p>
						<br />
						<a name="fig33">
								<b>图 33. 添加和删除项目</b>
						</a>
						<br />
						<img height="431" alt="图 33. 添加和删除项目" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig33.jpg" width="216" />
						<br />
				</li>
				<li>
						<p>选择 <b>CreditApprovalApp </b>并将它<b>添加</b>到已配置的项目一侧（图 34）。</p>
						<br />
						<a name="fig34">
								<b>图 34. 将项目添加到服务器</b>
						</a>
						<br />
						<img height="468" alt="图 34. 将项目添加到服务器" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig34.jpg" width="481" />
						<br />
				</li>
				<li>
						<p>检查管理控制台，确保 SCA 模块已启动（图 35）。</p>
						<br />
						<a name="fig35">
								<b>图 35. 表明 SCA 模块已启动的控制台消息</b>
						</a>
						<br />
						<img height="81" alt="图 35. 表明 SCA 模块已启动的控制台消息" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig35.jpg" width="470" />
						<br />
				</li>
				<li>
						<p>要使用同一 WebSphere Integration Developer 单元测试功能来测试该组件，请按照前面所执行的操作，再次右键单击该组件，然后选择 <b>Test Component</b>（图 36）。</p>
						<br />
						<a name="fig36">
								<b>图 36. 测试 SCA 组件</b>
						</a>
						<br />
						<img height="508" alt="图 36. 测试 SCA 组件" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig36.jpg" width="283" />
						<br />
				</li>
				<li>
						<p>再次说明，请删除模拟器，以使测试能够流经 SCA 组件（图 37）。</p>
						<br />
						<a name="fig37">
								<b>图 37. 删除模拟器</b>
						</a>
						<br />
						<img height="182" alt="图 37. 删除模拟器" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig37.jpg" width="538" />
						<br />
				</li>
				<li>
						<p>键入输入参数，如图 38 所示。</p>
						<br />
						<a name="fig38">
								<b>图 38. 数据参数</b>
						</a>
						<br />
						<img height="179" alt="图 38. 数据参数" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig38.jpg" width="420" />
						<br />
				</li>
				<li>
						<p>选择 WebSphere Process Server V6.0 作为部署位置（图 39）。</p>
						<br />
						<a name="fig39">
								<b>图 39. 选择部署位置</b>
						</a>
						<br />
						<img height="418" alt="图 39. 选择部署位置" src="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia_images/fig39.jpg" width="439" />
						<br />
				</li>
				<li>
						<p>检查测试结果。</p>
				</li>
		</ol>
		<p>作为自我练习，请更改组件以进行数据库更新，然后试验事务属性。您也可以在管理控制台中使调用异步化以及检查基础 Service Integration Bus 配置。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="conc">
						<span class="atitle">
								<font face="Arial" size="4">结束语</font>
						</span>
				</a>
		</p>
		<p>本文介绍了使用 WebSphere Integration Developer 组装服务组件体系结构组件的上下文中的引用和连线。这一系列的下一篇文章将讨论导入和导出，以便您能够集成 SCA 模块。该系列以后的文章还将介绍更复杂的组件以及与非 SCA 组件相集成。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="ack">
						<span class="atitle">
								<font face="Arial" size="4">致谢</font>
						</span>
				</a>
		</p>
		<p>作者真诚感谢 Eric Herness、Keys Botzum 和 Paul Ilechko 对本文的审阅。</p>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0512_barcia/0512_barcia.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<span class="atitle">
						<a name="download">
								<font face="Arial" size="4">下载</font>
						</a>
				</span>
		</p>
		<table class="data-table-1" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<th>名字</th>
								<th style="TEXT-ALIGN: right">大小</th>
								<th>下载方法</th>
						</tr>
						<tr>
								<td nowrap="">CreditApprovalPart2.zip</td>
								<td style="TEXT-ALIGN: right" nowrap="">23 KB</td>
								<td nowrap=""> <a class="fbox" href="ftp://ftp.software.ibm.com/software/dw/wes/techjournal/0512_barcia/CreditApprovalPart2.zip"><b><font color="#5c81a7">FTP</font></b></a><font color="#5c81a7"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /></font>|<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /><a class="fbox" href="http://www3.software.ibm.com/ibmdl/pub/software/dw/wes/techjournal/0512_barcia/CreditApprovalPart2.zip"><b><font color="#5c81a7">HTTP</font></b></a></td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:18 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用于实现 Web 服务的 SOA 编程模型，第 7 部分: 保护面向服务的应用程序</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5723.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:14:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5723.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5723.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5723.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5723.html</trackback:ping><description><![CDATA[
		<blockquote>保护面向服务的体系结构（service-oriented architecture，SOA）中的应用程序具有挑战性，因为 SOA 的松耦合特性可能暴露现有安全实现的弱点。以下解决方案包括定义明确的信任模型（基于可接受的验证形式），并糅合了策略、Web 服务安全性和安全工程最佳实践。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N1008A">
						<span class="atitle">
								<font face="Arial" size="4">引言</font>
						</span>
				</a>
		</p>
		<p>对于任何应用程序来说，保护信息访问的安全都是最基本的要求。由于按 SOA 原则构造的实现的服务、应用程序以及跨组织操作的松耦合，因此安全对其甚至更为重要。这种环境往往会暴露现有安全实现的弱点或局限性。</p>
		<p>即使不考虑通过由模型驱动的开发和基于 SOA 的服务管理所提高的效率，业务应用程序仍须保护信息。只保护周边设施（如防火墙和路由器）是不够的，因为随需应变的企业必须能够随着其合作伙伴、客户和雇员之间的关系发展而建立和断绝动态信任关系。因此，安全的随需应变企业需要灵活的、可自定义的基础设施，以适应新要求和规章制度。要提供这种灵活性，不应将策略生搬硬套到基础设施中；应该通过由策略驱动的基础设施满足安全模型的要求，这任务可不简单。</p>
		<p>本文将阐释业务应用程序利用随需应变安全基础设施的安全功能的方式，以及建立用于保护面向服务的应用程序的编程模型的设计原则。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10099">
						<span class="atitle">
								<font face="Arial" size="4">业务应用程序和安全基础设施</font>
						</span>
				</a>
		</p>
		<p>安全集成以及对业务应用程序和信息的访问通常是通过身份验证、授权和责任实现的。企业探讨管理身份验证、授权和责任的方式在很大程度上取决于其对客户、雇员和合作伙伴之间的信任关系的看法；这些关系对业务应用程序安全的影响；以及这些应用程序的相对重要性和安全性。</p>
		<p>在业务合作伙伴之间交换敏感信息时，敏感信息必须受到保护。可能还需要用安全的方式保存敏感信息。必须保证消息源的完整性（如通过公证服务）才能在必要时启用验证、审核和认可。可能需要对敏感信息进行加密以实现机密性，或对其进行数字签名以实现完整性。（数字签名也可用于认可。）完整的 SOA 设计必须不但涵盖消息级和传输级安全性，而且还要满足保护保存的内容以遵守政府规章制度和业界最佳实践的需要。</p>
		<p>安全策略的制定和执行以及所执行的安全级别，基本上都取决于企业及其雇员、客户和合作伙伴之间的信任关系。证书和密钥之类的相关技术可用于反映和管理这些信任关系。工具可用于建立业务合作伙伴、客户和企业等之间的信任关系模型并指定信任关系，还可以将信任定义转换成适用于 IT 环境的技术。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100A8">
						<span class="atitle">
								<font face="Arial" size="4">SOA 安全模型</font>
						</span>
				</a>
		</p>
		<p>SOA 安全模型基于 Web 服务可能需要其中的传入消息以验证一系列声明的过程。名称、密钥、权限和功能都是声明的例子。根据所提供的证据，会在请求者、服务端点和一系列可能的中介之间应用适当的信任模型。</p>
		<p>消息可能会通过请求者和目标服务之间的若干中介。端到端安全性必须考虑到请求者、中介和最终端点服务（提供者）之间的信任模型，如<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#fig1"><font color="#996699">图 1</font></a> 所示。</p>
		<br />
		<a name="fig1">
				<b>图 1. 从请求者通过中介到提供者的信任模型</b>
		</a>
		<br />
		<img height="263" alt="信任模型" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/figure1.gif" width="428" />
		<br />
		<br />
		<p>对于消息处理，网络和传输中介（如防火墙、路由器和代理服务器）一般不受信任。应该防止传输中的所有消息受到不可靠中介的篡改。</p>
		<p>OASIS Web 服务安全性（Web Services Security，WSS）规范提供对传输中的简单对象访问协议（Simple Object Access Protocol，SOAP）消息的保护。可用 WSS 防止消息的真实性、完整性和机密性受到不可靠网络和传输中介的攻击。</p>
		<br />
		<a name="fig2">
				<b>图 2. 消息中介代理信任关系和联合</b>
		</a>
		<br />
		<img height="394" alt="消息中介代理" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/figure2.gif" width="536" />
		<br />
		<p>并不是所有中介都不可靠。Web 服务网关和企业服务总线中介服务都是消息转换中介的例子，其在 SOA 内的功能包括检查，在某些情况下还包括对消息有效负载的修改 [请参阅此系列中的第 4 部分，“<a href="http://www.ibm.com/developerworks/webservices/library/ws-soa-progmodel4/index.html"><font color="#5c81a7">IBM 企业服务总线简介</font></a>”（developerworks，2005 年）]。在设计 SOA 安全基础设施时，请考虑允许某些受信任的中介。</p>
		<p>处理请求者和应用程序服务主机之间的信任关系的消息代理可能是另一个受信任的中介。在这种设计中，安全责任由代理和服务端点来分担。如<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#fig2"><font color="#996699">图 2</font></a> 所示，消息中介将负责消息级安全、请求者和提供者环境之间的身份联合，以及管理请求者和服务提供者之间的信任关系。服务只有为了满足特定于服务的安全要求（如建立（通过中介映射和联合）访问特定于消息有效负载中应用程序数据的服务、完整性和机密性数据的身份）才会继续起安全作用。通过分解业务应用程序中脆弱或复杂的基础设施代码并将其委派给容器，基于 SOA 的安全方法可以提高灵活性并降低发生不测事件的可能性。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100EE">
						<span class="atitle">
								<font face="Arial" size="4">消息安全性</font>
						</span>
				</a>
		</p>
		<p>WSS 规范还提供一系列有助于 Web 服务开发人员保护 SOAP 交换的基本消息级完整性、机密性和身份验证机制。可用各种方式组合这些机制，以便用各种加密技术建立各种安全模型。</p>
		<p>WSS 还提供可扩展的机制，以便将安全令牌与含有各种身份验证及授权格式和机制的消息相关联。例如，客户机可能会提供身份证据及其具有特定业务证书的已签名声明。然后收到这种消息的 Web 服务就可以确定是否要信任其声明和信任的程度。</p>
		<p>安全令牌声明可由授权机构核准或不核准。一组已核准的声明通常表示为安全令牌（经过数字签名或受到授权机构加密保护）。X.509 证书就是一个熟悉的已签名安全令牌例子；它断言某人的身份和公钥之间的绑定关系。安全令牌可以“推送到”消息中或者在消息中携带安全令牌，也可以通过引用表示安全令牌，以便接收方从授权机构“拉取”该声明。</p>
		<p>因为安全令牌是在信任域内起作用的，所以需要有链接信任域作用范围的方式。可通过协议或通过实现一系列规则强制执行信任策略来手动链接。这样，如果发送方和接收方之间有已确立的信任关系，则可信任未经核准的声明。例如，如果发送方和接收方使用的是其通过带外信任关系建立的可靠连接，则发送方为 Bob 的未核准声明足以让某些接收方认为发送方实际上就是 Bob。在本例中，此可靠连接的存在可作为确凿的证据。</p>
		<p>防止消息内容受到非法访问（机密性）或非法修改（完整性）是主要的安全事务。WSS 规范提供通过对主体、标题、附件或其任意组合（或部分）进行加密和/或数字签名保护消息的方法。</p>
		<p>身份验证请求基于可选网络、由传输支持的安全性和消息中已批准的信息（声明）的组合，这种技术称为消息源身份验证可能更好一些。通过网络和由传输提供的安全性、消息中已批准的声明，以及用收件人已知的密钥对请求进行加密，请求者可以对收件人进行身份验证。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10106">
						<span class="atitle">
								<font face="Arial" size="4">信任模型</font>
						</span>
				</a>
		</p>
		<p>演示安全令牌已授权应用的一种方式是，添加采用相关联密钥（来自于占有证据令牌）的数字签名。这会使请求者可通过将安全令牌（如 X.509 公钥基础设施（Public Key Infrastructure for X.509，PKIX）证书或 X.509 证书）与消息相关联来证明所请求的声明组。</p>
		<p>如果请求者没有向服务证明请求的声明所必要的令牌，则可与相应的授权机构（我们称为安全令牌服务）联系，并用正当的声明请求所需的令牌。安全令牌通过发布一系列安全令牌（可用于在不同的信任域之间代理信任关系）来形成信任的基础。</p>
		<p>一种机制是应用 WS-Trust（对于有关 WS-Trust 规范的更多信息，请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#resources"><font color="#996699">参考资料</font></a>）中所定义的质询回应协议。这种机制由 Web 服务用来对请求者进行更多质询，以确保消息不过时，以及验证安全令牌的使用是否已经授权。<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#fig3"><font color="#996699">图 3</font></a> 所示的就是此模型，可以看出任何请求者也都可以是服务，请求者和目标服务都具有受信任的第三方安全令牌服务，这种服务有助于验证每个目标服务策略所需的安全令牌。</p>
		<br />
		<a name="fig3">
				<b>图 3. 安全令牌服务</b>
		</a>
		<br />
		<img height="227" alt="安全令牌服务" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/figure3.gif" width="539" />
		<br />
		<br />
		<p>此 SOA 安全模型（声明、策略和安全令牌）还含有并支持若干特定模型，如基于身份的授权、访问控制列表和基于功能的授权。通过该模型可使用现有的技术，如 X.509 公钥证书、基于 XML 的令牌、Kerberos 共享秘密票证，甚至口令摘要。SOA 模型结合 Web 服务安全对话语言（Web Services Secure Conversation Language，WSSC）和 Web 服务策略框架基本要素，这足以构造高级密钥交换、身份验证、基于策略的访问控制、审核和复杂的信任关系。</p>
		<p>将对 Web 服务应用策略，Web 服务会从请求者收到可能包括安全令牌的消息，还可能会对其通过 WSSC 机制应用某些保护措施。下面是由 Web 服务的信任引擎执行的主要步骤：</p>
		<ul>
				<li>验证令牌中的声明是否足以遵从策略，以及消息是否与策略一致。 
</li>
				<li>验证申请人的特征是否可由签名来证明。在代理式信任模型中，签名不可以证明申请人的身份；签名可以证明中介（只是可断言申请人的身份）的身份。声明经过批准或不是基于策略。 
</li>
				<li>验证安全令牌（包括所有相关和即将颁发的安全令牌）的颁发者是否可信，可以颁发其所作的声明。信任引擎可能需要外部验证或代理令牌（也就是向安全令牌提供服务发送令牌，以便用其交换其他可直接用在其评估中的安全令牌）。 </li>
		</ul>
		<p>如果满足了这些条件，而且请求者有权执行操作，则服务可以处理服务请求。</p>
		<p>可将 IP 安全（IP Security，IPSec）或传输层安全/安全套接字层（Transport Layer Security/Secure Sockets Layer，TLS/SSL）之类的网络和传输保护机制与此 SOA 安全模型结合使用，以支持不同的安全要求和方案。如果可用，作为附加安全技术，请求者应该考虑采用网络或传输安全机制，以便在颁发、验证或更新安全令牌时对收件人预先进行身份验证。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10146">
						<span class="atitle">
								<font face="Arial" size="4">编程模型设计原则</font>
						</span>
				</a>
		</p>
		<p>从安全的角度来看，编程模型包括对于谁负责实现安全策略（如基础设施或应用程序）所作的决策，以及需要让请求者得到此信息的哪一部分。除了操作方面，某些设计期间的策略（如在 J2EE 描述符中捕获的）也有助于管理应用程序。是通过使基础设施能够实现安全模型，还是通过将安全的实现转换成每个应用程序中的代码来最大程度地满足业务需求，这是关键实现决策之一。要考虑的另一方面是调用服务的变数。服务的消费者是否通过可在订阅期间定制的选择得到了灵活性？最后，在实现安全解决方案时，应该考虑安全工程——用于构建安全应用程序的工程方法。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1014F">
						<span class="atitle">
								<font face="Arial" size="4">由基础设施管理的安全与由应用程序管理的安全</font>
						</span>
				</a>
		</p>
		<p>每个组织通常都会让某些人负责确定和实现其安全策略。在许多情况下此过程都是手动的，从而导致组织投入大量资源在不同的实体和应用程序之间协调访问。</p>
		<p>我们建议复杂的组织在基础设施中集中实现与解决方案相关的安全策略——也就是验证用户质询（如用户 ID/密码）、控制对应用程序的访问（如对 <code>travelService</code> 执行 <code>reserve()</code> 方法），以及委派身份（如运行方式 <code>travelAgency id</code>），以确保方法一致。可在某些部署构件（如 J2EE 应用程序的部署描述符）中定义初始应用程序安全策略。部署完毕后，熟悉大部分应用程序逻辑时就可以向部署环境提供策略信息了。可将策略声明概括成高级策略要求，以备将来细化成实现约束条件，这被认为是部署阶段的工作。</p>
		<p>应用程序设计中引入了有关由基础设施管理的安全与由应用程序管理的安全的决策。安全约束和条件是附加到实现构件的。决定是让基础设施处理安全，还是将安全转换成应用程序中的代码的时机在实现阶段，此时通常可以得到有关应用程序平台（如 Java™ Platform Enterprise Edition (J2EE) 和 Microsoft® .NET）的信息。</p>
		<p>我们建议将应用程序的重点放在业务逻辑、延迟服务访问的保护和送往基础设施的消息（承载应用程序的运行时容器）上。在这种由基础设施管理的方法中，附加到设计构件的安全策略将被转换成特定于平台的策略 [例如，通过统一建模语言（Unified Modeling Language，UML）模型表示的要求将转换成 J2EE 部署描述符]。</p>
		<p>在由应用程序管理的方法中，安全实现是在应用程序中实现的，必须实现相应的安全调用。即使是由应用程序管理的安全也必须通过 Java 身份验证和授权服务（Java Authentication and Authorization Service，JAAS）将其安全调用（如 <code>authenticate()</code>）转换成相应的特定于平台的功能[如 <code>loginContext.login()</code>]。</p>
		<p>授权和访问控制的粒度粗细不等。细粒度访问（对于解决方案本身）与粗粒度访问（对于其操作之一）的选择通常取决于业务和技术考虑。粒度也会受各种因素的影响，包括信息实体的实例（如特定游客的信用帐户概要信息）、上下文信息，如用户特征（如旅行社）、时间约束（如从早上九点到下午五点）、访问目的（如进行旅游预订的目的）、访问路径（例如，内部网请求与外部请求），以及许多其他因素。</p>
		<p>可通过定义应用程序角色概括与授权相关的策略，其中的角色是指一组通过其可对特定应用程序资源执行某些操作的权限。例如，旅行应用程序可声明对 ReservationBean 执行的 <code>view()</code> 或 <code>change()</code> 预订方法可由 TravelAgent 角色访问。换句话说，TravelAgent 是由实现方案定义的角色，可以确定可由“旅行社”执行的操作；根据一组用于对各自企业 JavaBean（Enterprise JavaBean，EJB）调用特定方法的权限。在实现阶段不大可能定义的是谁拥有 TravelAgent 特权。用户到角色的指派通常是在部署时开始的，然后会在应用程序的整个生命周期内对其进行管理。<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#list1"><font color="#996699">清单 1</font></a> 所示的是用于定义某些基于角色的方法权限的示例代码。</p>
		<br />
		<a name="list1">
				<b>清单 1. 用于定义某些基于角色的方法权限的代码</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">&lt;method-permission&gt;
&lt;role-name&gt;TravelAgent&lt;/role-name&gt;
&lt;method&gt;
   &lt;ejb-name&gt;ReservationBean&lt;/ejb-name&gt;
&lt;method-permission&gt;
&lt;role-name&gt;TravelAgent&lt;/role-name&gt;
&lt;method&gt;
   &lt;ejb-name&gt;ReservationBean&lt;/ejb-name&gt;
   &lt;method-name&gt; view&lt;/method-name&gt;
   &lt;method-name&gt; change&lt;/method-name&gt;
&lt;/method&gt;
&lt;/method-permission&gt;
			</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在执行某些业务逻辑之前要求提供通过身份验证的身份信息的应用程序必须从基础设施中得到该信息。例如，在 J2EE 环境中，运行时会在身份验证后确定用户的身份；应用程序可通过 API（如 <code>getCallerPrincipal()</code>）检索此信息。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1019A">
						<span class="atitle">
								<font face="Arial" size="4">选择的灵活性</font>
						</span>
				</a>
		</p>
		<p>客户机运行时有时需要某些对访问服务本身的要求或约束（包括身份验证、完整性和机密性要求）。而支持各种客户机运行时（如浏览器客户机、非浏览器客户机和 PDA 瘦客户机）可能是令人满意的。要支持各种客户机运行时，请发布断言客户机运行时必须确保消息机密性，并必须提供用户身份的证据（用户 ID/密码或证书）的策略。身份验证的策略概括可列出替代选项，如可接受的凭据类型，或所信任的凭据颁发机构。</p>
		<p>例如，TravelService Web 服务可声明其要求某些安全令牌类型的意图和机密性要求。实现方案可通过描述符支持意图声明。工具则可进而生成必要的机器级详细信息（如 WS-SecurityPolicy 表达式），如<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#list2"><font color="#996699">清单 2</font></a> 所示。</p>
		<br />
		<a name="list2">
				<b>清单 2. WS-Security 策略描述符示例</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">&lt;wsp:Policy&gt;
  &lt;sp:SymmetricBinding&gt;
    &lt;wsp:Policy&gt;
      &lt;sp:ProtectionToken&gt;
        &lt;wsp:Policy&gt;
          &lt;sp:KerberosV5APREQToken
              sp:IncludeToken=".../IncludeToken/Once" /&gt;
        &lt;/wsp:Policy&gt;
      &lt;/sp:ProtectionToken&gt;
      &lt;sp:SignBeforeEncrypting /&gt;
      &lt;sp:EncryptSignature /&gt;
    &lt;/wsp:Policy&gt;
  &lt;/sp:SymmetricBinding&gt;
  &lt;sp:SignedParts&gt;
    &lt;sp:Body/&gt;
    &lt;sp:Header
       Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"
    /&gt;
  &lt;/sp:SignedParts&gt;
  &lt;sp:EncryptedParts&gt;
    &lt;sp:Body/&gt;
  &lt;/sp:EncryptedParts&gt;
&lt;/wsp:Policy&gt;
			</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<font face="Lucida Console" size="2">
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<font face="Lucida Console" size="2">
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
										</font>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<font face="Lucida Console" size="2">
																				<br />
																		</font>
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101B3">
						<span class="atitle">
								<font face="Arial" size="4">安全工程</font>
						</span>
				</a>
		</p>
		<p>在开发安全解决方案的过程中，安全工程是最佳实践之一——请遵循定义明确的模式，以使您的应用程序、服务或组件可以完全实现其设计者和用户的期望。您应该估计每个实现方案构件中固有的风险，对其进行设计和实现以防其暴露在弱点下（例如，高效的内存管理并避免出现隐蔽的通道）。工具支持和代码评审也有助于将对从中部署解决方案的环境的损害降到最低（或彻底避免）。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101BC">
						<span class="atitle">
								<font face="Arial" size="4">总结</font>
						</span>
				</a>
		</p>
		<p>SOA 编程模型必须确保每个服务调用都符合对请求者和服务端点均有效的安全策略。安全基础设施（包括对请求者进行身份验证和对其授予服务访问权的能力、基于基本信任模型跨 Web 服务请求传播安全上下文、审核重要事件，以及有效地保护数据和内容）形成了有助于保护组件和服务的 SOA 环境的结构。所有 SOA 安全的核心都是基于策略的基础设施和策略的管理。在理想的情况下，SOA 应用程序的重点在于业务逻辑、委派安全策略的实现，以及处理基础设施的信任关系。基于 Web 服务安全规范的 Web 服务安全模型和方法有助于解决保护面向服务的应用程序的难题。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:14 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现 Web 服务的 SOA 编程模型，第 6 部分: 不断发展的组件模型-----实现 SOA 的系统方法</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5722.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:12:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5722.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5722.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5722.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5722.html</trackback:ping><description><![CDATA[
		<blockquote>与语言无关、基于组件的面向服务的体系结构 (SOA) 编程模型简化了实现 Web 服务以及将其组装到解决方案中的过程。使用编程模型，非编程人员可以在没有掌握复杂的技术的情况下使用现有的 IT 资产。它满足了解决方案设计人员和业务分析人员的需要，提供了更高级别的抽象来隐藏实现技术之间的差异，同时还提高了业务可靠性。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N1008E">
						<span class="atitle">
								<font face="Arial" size="4">为什么需要基于组件的编程模型？</font>
						</span>
				</a>
		</p>
		<p>推动 IBM 的 SOA 编程模型的远景依赖于两个重要的观察结果，请看以下两段引言中的精辟描述：</p>
		<p>“根据时髦词语设计 (Design-by-buzzword) 是一种常见的情况。至少在软件行业，这种行为或多或少与缺乏对一组给定的有用体系结构约束的理解有关。换句话说，在选择要重用的软件体系结构时，设计人员并没有真正弄清楚这些体系结构之所以好的原因。”<br />——Roy Thomas Fielding，“Architectural Styles and the Design of Network-based Software Architectures”（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel6/#resources"><font color="#996699">参考资料</font></a>以获得指向此研究报告的链接）。</p>
		<p>这个问题可以通过将详细了解体系结构约束的原因的人的经验融入一组模式、编程构件和工具来解决。</p>
		<p>第二个重要的观察结果同人以及人与技术的交互有关：</p>
		<p>“创建面向服务的体系结构 (SOA) 意味着重新考虑当前用于构建系统的实践、组织的技能，以及团队成员协作的方式。面向服务的作用在于通过组装不同的应用程序来开发解决方案，SOA 是体系结构样式，强调独立服务提供者的松散耦合。”<br />——A.W. Brown 等，“Realizing service-oriented solutions with the IBM software development platform”（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel6/#resources"><font color="#996699">参考资料</font></a>以获得指向这篇文章的链接）。</p>
		<p>基于 XML 的 Web 服务标准使人想到了基于组件的编程模型的某些方面。诸如 Web 服务互操作性 (WS-I)、Web 服务描述语言 (WSDL) 和 Web 服务策略 (WS-Policy) 之类的标准尝试创建与平台无关的抽象和统一的框架来进行业务软件集成。而 Web 服务的价值来源于在 SOA 中使用它们。</p>
		<p>大多数关于 Web 服务的资料都集中于互操作性协议和服务接口及其使用。而本文把重点放在用于实现服务并将服务组装成解决方案的编程模型上。组件模型简化了构建和组装服务的过程。</p>
		<p>良好定义的组件应该支持生态系统中的各种用户角色——例如业务分析人员、集成开发人员、适配器开发人员和解决方案管理员——通过实例化、使用、组装和自定义符合用户目标、技能和概念性框架的不同组件类型，来创建面向服务的应用程序。（注意：编程人员作为专业人员和重要的软件开发角色仍然存在，但并非每个人都必须成为专业编程人员才能高效地使用 SOA 构件。）</p>
		<p>Web 服务标准中的组件模型明确地定义了组件和组件类型，以及定义和构造组件的方式，以便由适合角色的工具重用和操作，这与我们对技术使用中人的方面的观察结果是一致的。</p>
		<p>基于组件的编程模型有许多好处，最显著的好处是可以减少复杂性。没有哪个角色需要了解实现功能的所有方式或所有的系统接口。公开给每个角色的复杂性是有限的，而公开给开发人员角色的复杂性有助于他们使用适合于其任务的工具以定义良好的方式开发解决方案。</p>
		<p>组件模型必须是抽象的，并且与语言无关，因为它的作用在于隐藏技术细节和差异。</p>
		<p>组件模型还必须简化非编程人员组装和定制“解决方案部分”的过程。因此，与组装和调整有关的组件（或组件集合）的所有方面必须以与语言无关的方式显式地声明，这样无需编程人员修改源代码就可以通过工具操作它们。我们使用 XML 来表示这些声明。</p>
		<p>SOA 的确切特征还有待探讨，不过一些关键的方面已经得到广泛承认：</p>
		<ol>
				<li>SOA 是一种<i>分布式组件</i> 体系结构。不管在企业内部还是企业外部，SOA 组件都是透明的，并且可以通过一系列统一支持的、可互操作远程过程调用和消息传递协议来统一访问。接口定义标准支持开发人员工具之间的互操作性。<i>网络上 (on the wire)</i> 协议互操作性——相对于代码可移植性——是 SOA 组件的中心部分，支持统一访问和平台独立。调用方不知道组件的基础实现技术，例如 Java™ 2 Platform、Enterprise Edition (J2EE)、Microsoft® .Net 和 PHP。 
</li>
				<li>SOA 组件封装功能，并支持通过业务分析人员和业务模型建模的抽象级别的重用。这使 IT 功能和它所支持的业务功能之间的映射更加直接，从而提高了可靠性。 
</li>
				<li>声明性的、计算机可处理的约定允许第三方访问 SOA 组件提供的服务。这些约定显式地声明功能性特征以及非功能性（服务质量或 QoS）特征和需求。SOA 组件使用 WSDL 记录它们的操作。还可以使用用于 Web 服务的业务流程执行语言 (BPEL4WS) 来定义组件的有效操作序列。 
</li>
				<li>可以动态地发现、选择、绑定（通过其声明性属性）和集成（使用组合机制，例如本系列第 3 部分“<a href="http://www.ibm.com/developerworks/webservices/library/ws-soa-progmodel3/index.html"><font color="#5c81a7">Process choreography and business state machines</font></a>”（developerWorks，2005 年 7 月）中描述的组合机制）SOA 组件。 </li>
		</ol>
		<p>
				<br />
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100E0">
						<span class="atitle">
								<font face="Arial" size="4">组件实现和专用组件类型</font>
						</span>
				</a>
		</p>
		<p>开发人员可以选择使用 J2EE、PHP 或其他工具实现基本组件。作为一种编程模型，从根本上讲，SOA 更多地关系到与组件的交互以及如何将这些交互集成到复合组件、应用程序和解决方案。</p>
		<p>我们的编程模型还引入了一些定义良好的组件类型，可以建模开发人员生产和部署到解决方案中的常见构件。其中包括 Plain Old Java Objects (POJOs)、Business Processes (BPEL4WS)、Structured Query Language (SQL) 服务、Adaptive Business Objects、通过 J2EE Connector (J2C) 体系结构资源适配器访问的 Customer Information Control System (CICS) 程序、使用 SAP 的业务应用程序编程接口的应用程序、J2EE 无状态会话 Bean 和 IBM MQSeries® 应用程序。</p>
		<p>因为在性质上 SOA 组件模型是虚拟的，所以许多 SOA 组件自然支持多种实现技术。另一方面，不同的实现技术更好地适合于不同的任务。为了提高透明度，我们引入了服务组件类型的概念，每种类型都适合于具有特定技能、执行特定任务和使用特定工具的开发人员。对于查询，编程人员实现了一个 SQL 文件和一个包含一组 XQuery 语句的文件；对于文档转换，使用为此任务优化的工具实现 XSLT 样式表等等。不需要知道 Web 服务、Enterprise JavaBean (EJB) 或其他组件是在部署时生成的，这是因为总体结果是作为通用 SOA 组件公开和使用的。</p>
		<p>编程人员构建一种适合于该任务的特定组件类型，集中于要解决的问题和要使用的工具，而不是结果构件。SOA 开发工具应该集中于开发人员的技能和他或她理解的概念。后续文章将简要介绍一些组件类型，通过三个完全不同的示例——Java 对象、信息管理系统 (IMS) 事务和 SQL 语句——演示如何将任何实现技术映射到公共 SOA 组件模型，同时满足特定开发人员的需要。</p>
		<p>
				<br />
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100F2">
						<span class="atitle">
								<font face="Arial" size="4">组合</font>
						</span>
				</a>
		</p>
		<p>虽然可以使用特定于平台的技术实现 SOA 组合，但是新的以 SOA 为中心的组合类型可以自己实现，而无需转换为另一种编程模型。</p>
		<p>使用组合模型，可以发现具有所需的接口和所需的基础设施 (QoS) 策略的服务，并且将这些服务聚合到新的服务、模块和解决方案中。可以组合这些新的服务。</p>
		<p>我们的方法统一了创建和访问业务逻辑的范型。我们的 SOA 编程模型比现有的编程构造复杂，隐藏了实现技术之间的不同。在这种模型中，组件组装到模块中，而模块又可以组合到解决方案中。组件公开了可以通过可寻址接口调用的接口。接口是使用 WSDL、Java 或其他语言描述的。实现可能有无法解析的对所需服务的引用，这些服务是执行之前由连接在一起的组件提供的。可以由解决方案集成人员或解决方案组装人员使用适合于角色的工具进行连网操作，他们可以运用可能不为最初开发这些组件的人所知的企业策略和企业服务总线 (ESB) 部署拓扑知识来进行工作。</p>
		<p>
				<br />
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10101">
						<span class="atitle">
								<font face="Arial" size="4">在没有进行编程的情况下自定义</font>
						</span>
				</a>
		</p>
		<p>不可能始终在没有进行配置、自定义或调整的情况下按原样重用服务。在需要更改时，当前的技术发展水平是修改源代码。然而，是否能够交付可以大量重用的组件在很大程度上取决于组件适应其使用环境的功能。SOA 编程模型应该支持构建“编程人员”可以在没有修改源代码的情况下进行自定义的服务和模块。当使用组件的编程人员与构建组件的编程人员不在一个单位时，这一点尤为重要。</p>
		<p>基于组件的 SOA 编程模型提供了几种在没有进行编程的情况下自定义组件的机制。</p>
		<p>旨在重用的组件可以打包成具有可变点 (points of variability) 的模板，在将模板放入解决方案时可以对其做一些调整。这种适应性是我们的编程模型最重要的部分，此外，编程模型还包括规则语言和相关工具，用于给新的用户提供自定义功能。</p>
		<p>中介主要用于处理动态消息。通常可以在没有进行编程的情况下组合中介。作为一个多协议构造，企业服务总线发挥了重要的作用，可以将服务组件组合在一起进行无缝交互，另外，还允许在消息的路径中插入称为<i>中介</i> 的组件，以在不改变现有端点的情况下代理服务之间的交互，从而在主要方面解决整个企业范围内的问题，例如审核、记录、路由、不匹配接口的适应性、等效组件的增量替换和安全性。</p>
		<p>SOA 编程模型的另一个好处（来源于前面提到的特性）是能够在软件生命周期的不同阶段用一个组件替换另一个组件。通过将声明的接口延迟绑定到支持这些接口的实现可以做到这一点。企业为什么需要替换功能单元，有许多方面的原因。其中最重要的原因可能是减少在大型企业中管理更改的困难。以增量的方式引入更改并且通过遵循定义的接口限制其影响可以提高灵活性。这种做法也适合于松散耦合，而松散耦合常常是大型组织的特征。此外，使用服务组件，有不同的技能、需求和时间安排的组可以以人力资源和系统资源两方面的效率都最高的方式在 IT 基础设施中协同工作，这样企业就可以快速地响应业务级的更改，从而使企业大大获益。</p>
		<p>
				<br />
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10119">
						<span class="atitle">
								<font face="Arial" size="4">组件定义</font>
						</span>
				</a>
		</p>
		<p>我们的 SOA 是由以下规范定义的：</p>
		<ol>
				<li>
						<i>服务规范</i> 以组件提供和使用的一组服务的形式提供了组件的视图。它由以下三组规范定义： 
<ul><li>接口，通常是 WSDL <code>portTypes</code>。 
</li><li>策略，记录 QoS 属性，例如事务行为和安全性。 
</li><li>行为描述，例如 BPEL4WS 抽象流程。另一个例子可能是统一建模语言 V2 (UML2) 状态模型，该模型指定了哪些操作对不同的状态和操作所引发的状态事务是有效的。调用方可以通过状态模型计算有效的操作序列。 </li></ul></li>
				<li>
						<i>服务组件实现</i> 是由以下四组规范定义的： 
<ul><li>提供的服务规范。 
</li><li>需要的服务规范。 
</li><li>可以在组件上设置以调整或自定义的属性。 
</li><li>为此提供基本支持的属性；更复杂的方案使用可变点和对自定义组件的外部调用。 
</li><li>对所有实现实例都保持不变的容器指示（策略）。 
</li><li>定义组件实现的实现构件（例如 Java 类、BPEL 文档或 XSLT 规则集）。 </li></ul></li>
				<li>
						<i>服务组件</i>（实例）由以下规范定义： 
<ul><li>名称。 
</li><li>服务组件实现。 
</li><li>实现的任何属性的值，设置用于调整实例。 
</li><li>任何服务的规范，解析实现需要的服务规范。它们可以是连接组件实例的“网络”，也可以是在运行时执行以查找组件的“查询”，所查找的组件实现相关接口，具有相关的 QoS 策略，并且匹配指定的行为（例如抽象流程或状态模型）。 </li></ul></li>
		</ol>
		<p>有两种定义 SOA 组件的基本方法。这些定义可以通过开发工具生成，也可以由开发人员手动创建。</p>
		<p>第一种方法是<i>控制文件</i>，顾名思义，控制文件即关联或联接组件的所有部分的文档。例如，控制文件可以引用 WSDL 定义（提供的接口）、实现组件的 Java 类（实现构件）或相关的策略文档（策略断言）。 它们可以是对文件系统、类路径、源代码管理系统或 Web URL 的引用。控制文件方法将多个单独开发的构件聚合在一起组成组件。应用程序开发工具可以帮助定义控制文件。</p>
		<p>第二种方法是使用 <i>pragmas</i>，指定相同信息的语言元素，但是包含在单个源文件的主体中。Java 方面的支持正在不断增加（例如，JSR 175 中的 XDoclet 标记），以用 Java 语言编写这些批注部分。但是这种方法尚不支持其他等同的有效 SOA 组件实现技术（如 SQL 或 XQuery 语句集）。每种组件类型都有用于其实现构件的相关源文件格式，例如 Java 文件、状态机或 SQL 文件。IBM WebSphere® Rapid Deployment 中的批注支持可以生成所有组成包含 pragmas 的源文件中的组件的单个元素。例如，Java 源文件中的结构化注释指示哪些 Java 方法将成为所生成的定义组件的服务接口中的 Web 服务操作。</p>
		<p>
				<br />
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1017A">
						<span class="atitle">
								<font face="Arial" size="4">总结</font>
						</span>
				</a>
		</p>
		<p>基于组件的编程模型——由面向任务的工具和运行时基础设施支持——是快速采用 SOA 的关键。借助于期望的优势（如新的软件重用方法），专业人员（不必是编程人员）可以在新的业务需求出现时使用 SOA 组件创建新的业务解决方案和改写现有的业务解决方案。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:12 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM WebSphere 开发者技术期刊: 使用服务组件体系结构构建 SOA 解决方案——第 1 部分-----太棒了，出现了另一个编程模型？</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5721.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:10:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5721.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5721.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5721.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 随着 IBM® WebSphere Integration Developer 和 WebSphere Process Server 的发布，出现了一种用于构建面向服务的体系结构 (SOA) 的新编程范式，称为服务组件体系结构，它是为在 SOA 中构建和组装业务解决方案而专门设计的一个新编程模型，旨在集成和组合服务。								摘自 IBM WebSphere 开发者技术期刊。...&nbsp;&nbsp;<a href='http://www.cppblog.com/zhangji198543/archive/2006/04/17/5721.html'>阅读全文</a><img src ="http://www.cppblog.com/zhangji198543/aggbug/5721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:10 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在企业级 SOA 中使用 Web 服务，第 7 部分: 使用 XML 二进制优化打包规范加速 Web 服务应用程序</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5720.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:06:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5720.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5720.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5720.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5720.html</trackback:ping><description><![CDATA[
		<blockquote>您是否希望了解如何使用 XML 二进制优化打包 (XOP) 规范来优化 Web 服务应用程序？Judith M. Myerson 将向您展示在处理 Web 服务时，XOP 包比 XML 解析器更有效的原因。她将讨论在多 SOA 中 Web 服务变得过于庞大的两个场景。为了解决此问题，她讨论了 XOP 包可以如何比 XML 解析器更为有效地处理二进制（而非文本）格式的大型文件。她给出了 XOP 处理前后的代码示例，以帮助开发人员了解需要更改哪些元素。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N10047">
						<span class="atitle">
								<font face="Arial" size="4">引言</font>
						</span>
				</a>
		</p>
		<p>在本系列的<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter2/"><font color="#5c81a7">第 2 部分</font></a>中，我讨论了可以如何实现原始应用程序 Web 服务的业务流程并确定系统可以承载的可互操作 SOA 的最大个数，以避免 SOA 过载。在本系列的<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter5/"><font color="#996699">第 5 部分</font></a>中，我强调了将业务流程规则作为优化 Web 服务的首要事项的重要性，并给出了一些示例，以说明可以如何减少 Web 请求的数量和执行时间。</p>
		<p>在这一部分中，我将讨论基于 XML 的 Web 服务应用程序是如何变得过于庞大的。当大量使用 Web 服务时，这些 Web 服务将阻塞网络通信，从而导致系统过载。为了解决此问题，我将讨论可以如何应用 XML 二进制优化打包 (XOP) 规范（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#res"><font color="#996699">参考资料</font></a>）来加速 Web 服务。</p>
		<p>此标准草案旨在比当前 XML 解析器更有效地处理 Web 服务。解析器的行为更像解释器，而不是编译器。当解析器读写大型文件（特别是文本格式的大型文件）时，并不能达到其读取较小的文件或计算简单函数时的性能。甚至加密也可能使 Web 服务陷于停顿，因为必须执行复杂的计算才能获得希望的结果。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10062">
						<span class="atitle">
								<font face="Arial" size="4">两个场景</font>
						</span>
				</a>
		</p>
		<p>我在第 2 部分中提到，从企业应用程序提取组件，然后将其重新构造为外部 Web 服务，这种做法更为恰当。如果这样，您就可以更改 Web 服务中的代码，而不用重新设计并编译长时间运行的大型复杂应用程序。 </p>
		<p>第一个 SOA 中经过重新设计而显得更加紧凑的应用程序（请参见<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#figure1"><font color="#996699">图 1</font></a>）可以通过发送 Web 请求来与第二个 SOA 中的外部企业 MRP（托管资源原型）Web 服务进行动态链接。而 MRP Web 服务又指向第三个 SOA 中的外部企业 CRM Web 服务。客户关系管理 (CRM) Web 服务随后将请求和信息发送到该应用程序以进行进一步处理。 </p>
		<br />
		<a name="figure1">
				<b>图 1. 动态链接到 Web 服务</b>
		</a>
		<br />
		<img height="219" alt="与 Web 服务动态链接" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/Figure1.gif" width="476" />
		<br />
		<p>让我们假定在任何给定时间都可能出现对多个基于 XML 的 Web 服务的多个 Web 请求。链接到其他遗留系统或大型企业系统的企业应用程序未在上图中显示，而这些系统又与接收多个 Web 请求的多个 Web 服务链接。当大量使用时，Web 服务会变得过于庞大，从而阻塞网络通信。</p>
		<p>一个解决方案就是向基于 XML 的 MRP 和 CRM Web 服务应用 XOP 包（请参见<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#figure2"><font color="#996699">图 2</font></a>），从而以二进制格式进行处理。</p>
		<br />
		<a name="figure2">
				<b>图 2. 将 XOP 包应用于 Web 服务</b>
		</a>
		<br />
		<img height="234" alt="图 2. 将 XOP 包应用于 Web 服务" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/Figure2.gif" width="519" />
		<br />
		<p>在第二个场景中，可以首先开发业务流程规则，然后开发根据现有 Web 服务构建新的 Web 服务所需的基于 XML 的 Web 请求。如果新的 Web 服务（业务逻辑 Web 服务或以数据为中心的 Web 服务）可以提供更好的或额外的服务和功能，则必须减少或完全消除冗余的 Web 请求、执行时间、访问时间和带宽。 </p>
		<p>问题在于，当创建新的 Web 服务并大量使用时，它们将会变得过于庞大。与第一个场景类似，您需要将 XOP 包应用于 Web 服务。对于这两个场景，您都需要与系统管理员协作，以确定在不引起系统过载的情况下可以使用 XOP 包的 Web 服务的最大数目。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100A2">
						<span class="atitle">
								<font face="Arial" size="4">XOP 处理前的 Infoset</font>
						</span>
				</a>
		</p>
		<p>为了理解 XOP 的工作方式，我将首先讨论一个与 SOAP 消息相似的 XML Infoset，其中描述了包含一张图片和一个签名的 XML 文档。在<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#listing1"><font color="#996699">清单 1</font></a> 中，我使用粗体来突出显示原始 XML Infoset，以说明哪些原始元素在 XOP 处理之前。 </p>
		<br />
		<a name="listing1">
				<b>清单 1. XOP 处理前的 XML Infoset</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="572" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				

&lt;soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope' 
    xmlns:xop='http://www.w3.org/2003/12/xop/include' 
    xmlns:xmlmime='http://www.w3.org/2004/06/xmlmime'&gt;
  &lt;soap:Body&gt;
    &lt;m:data xmlns:m='http://example.org/stuff'&gt;
    
      </font>
														<font size="2">
																<font face="Lucida Console">
																		<span class="boldcode">
																				<strong>&lt;m:photo xmlmime:content-type='image/png'&gt;
        /aWKKapGGyQ=
      &lt;/m:photo&gt;
      &lt;m:sig xmlmime:content-type='application/pkcs7-signature'&gt;
        Faa7vROi2VQ=
      &lt;/m:sig&gt;</strong>
																		</span>`
      
    &lt;/m:data&gt;
  &lt;/soap:Body&gt;
&lt;/soap:Envelope&gt;
  
</font>
														</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>正如您所看到的，其中有两个元素：<code>m:photo </code>和 <code>m:sig</code>。<code>m:photo</code> 元素采用 base64 编码的内容为 <code>/aWKKapGGyQ=</code>，而 <code>m:sig</code> 元素采用 base64 编码的内容为 <code>Faa7vROi2VQ=</code>。这些元素也称为元素信息项。内容是元素的子项。请将该元素当作此子项的父项。子项是字符信息项，即包含字母数字字符的项。例如，<code>m: photo</code> 是子项 <code>/aWKKapGGyQ=</code> 的父项。该子项的名称不便阅读且难于发音，很容易出现键入错误。</p>
		<p>当通过 XOP 处理放置 XML Infoset 时，可以解决此问题。XOP 的工作方式是：从原始 Infoset 提取优化内容，然后创建 XOP Infoset。优化内容是我刚刚谈到的经过缩减的内容。在<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#listing2"><font color="#996699">清单 2</font></a> 中，我突出显示了要删除的内容。 </p>
		<br />
		<a name="listing2">
				<b>清单 2. 要删除的内容</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="572" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				

&lt;m:photo xmlmime:content-type='image/png'&gt;
        <span class="boldcode"><strong>/aWKKapGGyQ=</strong></span>
      &lt;/m:photo&gt;
      &lt;m:sig xmlmime:content-type='application/pkcs7-signature'&gt;`
        <span class="boldcode"><strong>Faa7vROi2VQ=</strong></span>
      &lt;/m:sig&gt;

</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<font face="Lucida Console" size="2">
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<font face="Lucida Console" size="2">
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
										</font>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<font face="Lucida Console" size="2">
																				<br />
																		</font>
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100F6">
						<span class="atitle">
								<font face="Arial" size="4">XOP 处理后的 Infoset</font>
						</span>
				</a>
		</p>
		<p>XOP 处理涉及到三个步骤。第一步，使用 Infoset 中的二进制元素替换文本元素。第二步，在包含已替换元素的 Infoset 前添加 MIME 包。第三步，在该 Infoset 后添加另一个包。</p>
		<p>
				<a name="N100FF">
						<span class="smalltitle">第 1 步：替换元素 </span>
				</a>
		</p>
		<p>XOP 包使用名为 <code>xop:Include</code> 的新元素信息项来替换删除的内容。<code>xop: Include</code> 元素包含一个属性信息项，带有指向 XOP 包部分的链接，XOP 包承载从原始元素中删除的数据的二进制表示。在<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#listing3"><font color="#996699">清单 3</font></a> 中，我突出显示了替换原始 Infoset 中的图片和签名元素的内容的 <code>xop: Include</code>。 </p>
		<br />
		<a name="listing3">
				<b>清单 3. 替换后的元素</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="572" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
 &lt;m:photo xmlmime:content-type='image/png'&gt;
        <span class="boldcode"><strong>&lt;xop:Include href='cid:http://example.org/me.png'/&gt;</strong></span>
      &lt;/m:photo&gt;
      &lt;m:sig xmlmime:content-type='application/pkcs7-signature'&gt;
        <span class="boldcode"><strong>&lt;xop:Include href='cid:http://example.org/my.hsh'/&gt;</strong></span>
      &lt;/m:sig&gt;
       
 </font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>正如您所看到的，<code> href='cid:http://example.org/me.png'/</code> 是图片元素的属性信息项，而 <code>href='cid:http://example.org/my.hsh'</code> 是签名元素的属性信息项。</p>
		<p>更新 Infoset 部分（请参见<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#listing4"><font color="#996699">清单 4</font></a>）。而行数保持不变。</p>
		<br />
		<a name="listing4">
				<b>清单 4. 更新后的 XML Infoset 部分</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="572" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
&lt;soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope'
    xmlns:xop='http://www.w3.org/2003/12/xop/include'
    xmlns:xmlmime='http://www.w3.org/2004/06/xmlmime'&gt;
  &lt;soap:Body&gt;
    &lt;m:data xmlns:m='http://example.org/stuff'&gt;
      &lt;m:photo xmlmime:content-type='image/png'&gt;
        &lt;xop:Include href='cid:http://example.org/me.png'/&gt;
      &lt;/m:photo&gt;
      &lt;m:sig xmlmime:content-type='application/pkcs7-signature'&gt;
        &lt;xop:Include href='cid:http://example.org/my.hsh'/&gt;
      &lt;/m:sig&gt;
    &lt;/m:data&gt;
  &lt;/soap:Body&gt;
&lt;/soap:Envelope&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N10143">
						<span class="smalltitle">第 2 步：在 Infoset 前添加 MIME 包</span>
				</a>
		</p>
		<p>为了完成更新，需要使用 MIME Multipart/Related 包中的 XOP 对原始 Infoset 进行序列化。XOP 是一种更有效的方法，用于序列化包含特定类型的 Xquery 和 Xpath 2.0 元素内容的 XML Infoset。 </p>
		<p>在更新后的 Infoset 前后各添加一个 MIME 包，以分别描述包含文本格式和二进制格式的图片和签名的 XML 文档。在<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#listing5"><font color="#996699">清单 5</font></a> 中，我突出显示了 XOP 包识别 8 位文本格式的 XML Infoset 的代码。</p>
		<br />
		<a name="listing5">
				<b>清单 5. Infoset 前的 XOP 包部分</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="572" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
 MIME-Version: 1.0
Content-Type: Multipart/Related;boundary=MIME_boundary;
	      type=text/xml;start="&lt;mymessage.xml@example.org&gt;"
Content-Description: An XML document with my picture and signature in it

--MIME_boundary
</font>
														<font size="2">
																<font face="Lucida Console">
																		<span class="boldcode">
																				<strong>Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: 8bit</strong>
																		</span>
Content-ID: mymessage.xml@example.org

 </font>
														</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N1015F">
						<span class="smalltitle">第 3 步：在 Infoset 后添加 MIME 包。</span>
				</a>
		</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#listing6">
						<font color="#996699">清单 6</font>
				</a> 显示了 XOP 包如何识别已被删除的数据的二进制表示。</p>
		<br />
		<a name="listing6">
				<b>清单 6. Infoset 后的 XOP 包部分</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="572" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
  --MIME_boundary
</font>
														<font size="2">
																<font face="Lucida Console">
																		<span class="boldcode">
																				<strong>Content-Type: image/png
Content-Transfer-Encoding: binary</strong>
																		</span>
Content-ID: &lt;http://example.org/me.png&gt;

// binary octets for png

--MIME_boundary
</font>
														</font>
														<font size="2">
																<font face="Lucida Console">
																		<span class="boldcode">
																				<strong>Content-Type: application/pkcs7-signature
Content-Transfer-Encoding: binary</strong>
																		</span>
Content-ID: &lt;http://example.org/my.hsh&gt;

// binary octets for signature

--MIME_boundary--
      
  </font>
														</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>正如您所看到的，Infoset 后的 <code>Content-ID</code> 的二进制内容，<code>xop: Include element</code> 中提到的链接代替了 Infoset 前的消息的文本内容。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10186">
						<span class="atitle">
								<font face="Arial" size="4">最终结果</font>
						</span>
				</a>
		</p>
		<p>在<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#listing7"><font color="#996699">清单 7</font></a> 给出了序列化为 XOP 包的整个 XML Infoset。尽管其中还有其他行，但是此包比原始 Infoset 的 XML 解析器的效率高得多。 </p>
		<br />
		<a name="listing7">
				<b>清单 7. 序列化为 XOP 包的 XML Infoset</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="572" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				

MIME-Version: 1.0
Content-Type: Multipart/Related;boundary=MIME_boundary;
	      type=text/xml;start="&lt;mymessage.xml@example.org&gt;"
Content-Description: An XML document with my picture and signature in it

--MIME_boundary
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: 8bit
Content-ID: &lt;mymessage.xml@example.org&gt;

&lt;soap:Envelope
    xmlns:soap='http://www.w3.org/2003/05/soap-envelope'
    xmlns:xop='http://www.w3.org/2003/12/xop/include'
    xmlns:xmlmime='http://www.w3.org/2004/06/xmlmime'&gt;
  &lt;soap:Body&gt;
    &lt;m:data xmlns:m='http://example.org/stuff'&gt;
      &lt;m:photo xmlmime:content-type='image/png'&gt;
        &lt;xop:Include href='cid:http://example.org/me.png'/&gt;
      &lt;/m:photo&gt;
      &lt;m:sig xmlmime:content-type='application/pkcs7-signature'&gt;
        &lt;xop:Include href='cid:http://example.org/my.hsh'/&gt;
      &lt;/m:sig&gt;
    &lt;/m:data&gt;
  &lt;/soap:Body&gt;
&lt;/soap:Envelope&gt;

--MIME_boundary
Content-Type: image/png
Content-Transfer-Encoding: binary
Content-ID: &lt;http://example.org/me.png&gt;

// binary octets for png

--MIME_boundary
Content-Type: application/pkcs7-signature
Content-Transfer-Encoding: binary
Content-ID: &lt;http://example.org/my.hsh&gt;

// binary octets for signature

--MIME_boundary--
        
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<font face="Lucida Console" size="2">
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<font face="Lucida Console" size="2">
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
										</font>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<font face="Lucida Console" size="2">
																				<br />
																		</font>
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter7/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1019D">
						<span class="atitle">
								<font face="Arial" size="4">结束语</font>
						</span>
				</a>
		</p>
		<p>为了运行具有 XOP 包的 Web 服务，需要事先进行计划，以确定应该如何设计应用程序，从而避免高峰时过载。应该就优化 Web 服务时应采用何种编码技术与系统管理员团队进行沟通。 </p>
		<p>您会发现解决这些问题后，您的 Web 服务应用程序优化工作变得容易得多。您可以使用 IBM Relational Web Developer for WebSphere® Software 来开发基于业务流程的 Web 服务，然后在 SOA 内部及各个 SOA 之间将其与 XOP 包一起使用。管理员会发现，解决了这些问题也使得他们的网络管理工作变得更加轻松。他们能确定在不引起系统过载的前提下，可以将多少应用程序与 XOP 包一起使用。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:06 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在企业级 SOA 中使用 Web 服务，第 6 部分: 使用 WebSphere Application Server 平衡 Web 服务应用程序的负载</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5719.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:04:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5719.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5719.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5719.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5719.html</trackback:ping><description><![CDATA[
		<blockquote>您希望了解 SOA 内服务器间 Web 服务应用程序的负载平衡么？在本文中，Judith M. Myerson 与我们一起探讨了用户在高峰流量期间所需求的快速响应的重要性，并且列举了一些负载平衡技术的示例。此外，她还与我们一起探讨了负载平衡工具——WebSphere® Application Server 和 WebSphere Edge Server，开发人员、系统管理员和网络管理员可以使用这些工具在服务器间平衡 Web 服务应用程序的负载，从而确保网络在高峰流量期间保持高性能、高可靠性和高可用性。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N1004A">
						<span class="atitle">
								<font face="Arial" size="4">引言</font>
						</span>
				</a>
		</p>
		<p>在本系列第 4 部分“使用 Rational 开发工具构建 SOA 中间件应用程序”（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#resources"><font color="#996699">参考资料</font></a>）一文中，我讲解了如何使用 Web 开发工具创建 SOA 中间件应用程序。在本系列第 5 部分“使用 WebSphere Business Integration 工具优化 Web 服务应用程序”（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#resources"><font color="#996699">参考资料</font></a>）一文中，我讲解了如何使用业务流程工具集成和优化 Web 服务应用程序。在第 5 部分，我还讲解了减少 Web 请求数量、执行时间、访问时间和带宽量的方法，这些方法都可以用来优化 Web 服务应用程序。</p>
		<p>在本文中，我介绍了负载应用程序的某些问题如何影响了 Web 服务应用程序间的互操作方式。文中包含了一个流量瓶颈的实例，导致该瓶颈的原因是：在特定期间有太多的访问者基于业务流程发送了太多的请求到一个 Web 服务应用程序。接着又讲了如何从负载平衡技术中获益。</p>
		<p>请记住，Web 请求与访问者的请求是不同的。Web 请求的数量不仅依赖于访问者的请求数量，也依赖于由访问者请求生成的、已优化的 Web 请求的类型和内容。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10062">
						<span class="atitle">
								<font face="Arial" size="4">响应迟缓</font>
						</span>
				</a>
		</p>
		<p>为了更好地认清这种差异，请看接下来的这个实例。如果某个访问者在将请求通过 Web 服务发送到一台服务器后等了很久才得到回复，那么该访问者很可能为了获得更快的响应时间而转向使用另一种 Web 服务或网站。该始发端 Web 服务将处理传入的访问者请求，以生成并优化传输到目标 Web 服务的 Web 请求。</p>
		<p>始发端 Web 服务响应迟缓，可能表明目标服务器繁忙，或是没有足够的系统空间来处理多个访问者请求（多线程处理）。处理这种负载问题的方法之一是平衡服务器间的负载，这样访问者就不会为得到答复而等待太久。这种技术称为负载平衡。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1006F">
						<span class="atitle">
								<font face="Arial" size="4">加快响应</font>
						</span>
				</a>
		</p>
		<p>平衡服务器间负载要优于外包 Web 服务，负载平衡技术不仅全面考虑到增加的服务器容量、改善的站点设计和使用独立磁盘冗余阵列（Redundant Array of Independent Disk，RAID）的能力，而且也提供了处理预期高峰流量所需的带宽。在服务器的长期运行中，它们会消耗更多的服务器资源。通过使用负载平衡技术，我们有更好的机会来提高服务器的性能和可靠性，并同时减少带宽量、执行时间和访问时间（假定服务器中包含故障转移机制 ）。</p>
		<p>由于上述原因，负载平衡技术成为了大多数公司在处理大流量时（尤其在高峰流量期间经受服务器停滞时）的首选技术。这些公司希望更快地响应用户需求，从而在较短的时间内完成更多的工作任务。</p>
		<p>您可以将负载路由到域名系统中不同的服务器主机地址，或者将一台服务器要处理的工作总量分摊到两台或多台服务器上。您不仅需要使用另外一台服务器智能化地选择出将工作分配给哪台服务器，还需要使用故障转移和备份服务将这些服务器联合到一起，以防某台服务器出现故障（尤其当服务器集散于不同地理位置时）。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1007F">
						<span class="atitle">
								<font face="Arial" size="4">类比购物车</font>
						</span>
				</a>
		</p>
		<p>作为一个类比，请把负载平衡服务器看为超市的 4 个付款台。让我们瞧瞧超市是如何在 4 个付款台间实现“负载平衡”的。</p>
		<p>假设您排在 1 号付款台前的长队中，您可以粗略地估算出大概需要多久时间才能排到自己付款。如果您发现这条队伍移动缓慢，而且此时看到一名收银员走向 4 号付款台打开机器准备工作，那您一定会推着购物车快速地跑到 4 号付款台（请参见<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#figure1"><font color="#996699">图 1</font></a>）。</p>
		<p>接着又有一名收银员打开了 3 号付款台，并挥手示意第一队排在您前面的购物者到 3 号付款台排队。这些购物者当然会移到 3 号付款台。2 号付款台此时仍然保持关闭状态。</p>
		<br />
		<a name="figure1">
				<b>图 1. 购物车的负载平衡</b>
		</a>
		<br />
		<img height="130" alt="购物车的负载平衡" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/Figure-1-Shopping-Cart.gif" width="294" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100A4">
						<span class="atitle">
								<font face="Arial" size="4">减少服务时间</font>
						</span>
				</a>
		</p>
		<p>让我们看看另一种负载平衡方式。如果您推着一辆满满的购物车，里面装着您一家十口一个月的杂货，您可能希望将货物分给多个付款台结帐。在没有家人陪同的情况下，这种想法尤为强烈。您可以将购物车中的物品分为几份，然后分从几个清闲可用的付款台结帐，这样就减少了付款时间。</p>
		<p>虽然这在实际生活中是不可能的，但您可以使用负载平衡器实现类似的目的，它能把在线购物车（Web 服务应用程序）的请求从繁忙的服务器上转移到其他清闲可用的服务器上（请参见<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#figure2"><font color="#996699">图 2</font></a>）。如果其他服务器通过优化可以满足服务需求，就没必要再启用新服务器。</p>
		<br />
		<a name="figure2">
				<b>图 2. 在线购物车请求的负载平衡</b>
		</a>
		<br />
		<img height="125" alt="在线购物车请求的负载平衡" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/Figure-2-Servers.gif" width="256" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100C6">
						<span class="atitle">
								<font face="Arial" size="4">问题</font>
						</span>
				</a>
		</p>
		<p>您该怎样解决该问题？更快地跑到付款台前（增加带宽）？增加付款台数量（增加服务器容量）？找其他人帮您买（外包）？这些方法都不适用。</p>
		<p>请您回答以下这些问题：</p>
		<ul>
				<li>您将要平衡哪种应用程序的负载？ 
</li>
				<li>在整个分布式网络中，该应用程序是否为长期运行？ 
</li>
				<li>一台服务器或一个服务器集群超时接收了多少请求？ 
</li>
				<li>在高峰流量期间，需要多少流量和带宽量？ 
</li>
				<li>怎样利用服务器平衡应用程序负载？ 
</li>
				<li>在不同时段，预计有多少访问者？ 
</li>
				<li>访问者最多能够发送多少请求？ </li>
		</ul>
		<p>在您答完这些问题后，请与一名网络管理员或系统管理员检查和整理这些答案，以促进相互了解。然后使用某种算法、技术或工具开发一个负载平衡程序，实现将繁忙的服务器上的访问者和 Web 请求重定向到清闲可用的服务器上。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100EE">
						<span class="atitle">
								<font face="Arial" size="4">负载平衡技术</font>
						</span>
				</a>
		</p>
		<p>负载平衡技术包括以下几种：</p>
		<ul>
				<li>简单路由 
</li>
				<li>DNS Round Robin 
</li>
				<li>复杂算法 
</li>
				<li>智能路由 </li>
		</ul>
		<p>由于实际工作中的流量需要按优先级处理，所以在开发 Web 服务应用程序时，请考虑上述技术中的最后两种技术。因为包含要求更快响应的服务器和访问者的分布式网络正在不断地扩张。由于前两种技术不需要按流量的优先级进行处理，所以我们将不在有关流量瓶颈的问题中讨论它们。</p>
		<p>当您使用复杂算法时，分发请求是基于服务器性能、服务器使用的硬件种类和处理客户优先级的方法等等。这表明，最快的服务器将获得更多具有最高客户优先级的请求。智能路由基于请求的内容和（在始发端服务器发生故障时）流量重定向到另一台服务器的方式。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1010D">
						<span class="atitle">
								<font face="Arial" size="4">基于服务器的软件</font>
						</span>
				</a>
		</p>
		<p>虽然您可以使用软件、硬件或两者来达到负载平衡，但您最好还是在应用程序服务器集群上使用基于服务器的软件。基于服务器的软件的价格要远低于基于硬件的专用服务器。硬件升级的价格要远高于相应软件升级的价格。</p>
		<p>在将基于服务器的软件添加到网络中之前，请检查网络是否配置正确，负载平衡器是否“灵活”。“灵活”在这里的解释是：虽然负载平衡器可能已为目前的 Web 服务应用程序做好了充分的配置，但它还必须能够通过扩展满足未来应用程序的需求。</p>
		<p>IBM WebSphere Application Server 就是一款基于服务器的软件，它在负载平衡和故障转移中同时使用了复杂算法和智能路由。它的负载平衡器有能力根据 Web 服务应用程序的未来需求进行扩展。您需要为负载平衡建立一个服务器集群，并测试其故障转移机制（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#resources"><font color="#996699">参考资料</font></a>）。</p>
		<p>面向多平台的 WebSphere Edge Server V2.0 是另一款基于服务器的软件。它专门设计用于改善服务器选择、负载优化和容错。它还附带了网络地址转换（Network Address Translation，NAT）和用于 Cisco CSS 交换机的 WebSphere Edge Server Consultant，并且支持内核级的基于内容路由（Content Based Routing，CSR）。（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#resources"><font color="#996699">参考资料</font></a>）</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-enter6/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10128">
						<span class="atitle">
								<font face="Arial" size="4">结束语</font>
						</span>
				</a>
		</p>
		<p>Web 服务应用程序的负载平衡需要提早计划，以确定在高峰流量期间如何在服务器间平衡负载。在设计 Web 服务的过程中，请多与系统管理员交流负载平衡技术相关的问题。</p>
		<p>解决这些问题能使您更容易地创建负载平衡的 Web 服务应用程序。您可以在 SOA 内部（或跨 SOA）基于业务流程开发 Web 服务和平衡 Web 服务负载。解决这些问题还能使管理员更容易地平衡 Web 服务应用程序的负载，并确定在 SOA 中使用哪种负载平衡方法，以及能够平衡多少应用程序的负载。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:04 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构设计师与SOA， 第 1 部分</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5718.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:03:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5718.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5718.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5718.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5718.html</trackback:ping><description><![CDATA[
		<blockquote>SOA(Service-Oriented Architecture)，即面向服务的架构，这是最近一两年出现在各种技术期刊上最多的词汇了。现在有很多架构设计师和设计开发人员简单的把SOA和Web Services技术等同起来，认为SOA就是Web Service的一种实现。本质上来说，SOA体现的是一种新的系统架构，SOA的出现，将为整个企业级软件架构设计带来巨大的影响。本系列两部分文章将根据作者自己的理解来帮助大家分析和了解什么是SOA架构，SOA将怎样对企业系统架构设计带来积极的影响，什么是SOA架构设计师的角色，以及SOA架构师在设计SOA系统架构时有哪些应该特别注意的地方。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N1003D">
						<span class="atitle">
								<font face="Arial" size="4">1. 什么是架构？什么是基于SOA的架构？</font>
						</span>
				</a>
		</p>
		<p>
				<a name="N10043">
						<span class="smalltitle">1．1 什么是架构</span>
				</a>
		</p>
		<p>从架构设计师的角度来看，架构就是一套构建系统的准则。通过这套准则，我们可以把一个复杂的系统划分为一套更简单的子系统的集合，这些子系统之间应该保持相互独立，并与整个系统保持一致。而且每一个子系统还可以继续细分下去，从而构成一个复杂的企业级架构。</p>
		<p>当一名架构设计师在构建某个企业级的软件系统时，除了要考虑这个系统的架构以及其应具有的功能行为以外，还要关注整个架构的可用性，性能问题，容错能力，可重用性，安全性，扩展性，可管理维护性，可靠性等各个相关方面。有的时候一名好的架构设计师甚至还需要考虑所构建的系统架构是否合乎美学要求。由此我们可以看到，我们衡量一个好的架构设计并不能只从功能角度出发，还要考虑很多其他的因素，对任何一个方面的欠缺考虑都有可能为整个系统的构建埋下隐患。</p>
		<p>
				<a name="N1004F">
						<span class="smalltitle">1．2 什么是基于SOA的架构</span>
				</a>
		</p>
		<p>SOA本身就是一种面向企业级服务的系统架构，简单来说，SOA就是一种进行系统开发的新的体系架构，在基于SOA架构的系统中，具体应用程序的功能是由一些松耦合并且具有统一接口定义方式的组件（也就是service）组合构建起来的。因此，基于SOA的架构也一定是从企业的具体需求开始构建的。但是，SOA和其它企业架构的不同之处就在于SOA提供的业务灵活性。业务灵活性是指企业能对业务变更快速和有效地进行响应、并且利用业务变更来得到竞争优势的能力。对企业级架构设计师来说，创建一个业务灵活的架构意味着创建一个可以满足当前还未知的业务需求的IT架构。</p>
		<p>利用基于SOA的系统构建方法，如图1中所示的一样，一个基于SOA架构的系统中的所有的程序功能都被封装在一些功能模块中，我们就是利用这些已经封装好的功能模块组装构建我们所需要的程序或者系统，而这些功能模块就是SOA架构中的不同的服务（services）。</p>
		<br />
		<a name="N1005D">
				<b>图1</b>
		</a>
		<br />
		<img height="210" alt="图1" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-arcsoa1/images/image002.jpg" width="163" border="0" />
		<br />
		<p>因此，SOA架构本质上来说体现了一种复合的概念：它不仅为一个企业中商业流程的组织和实现提供了一种指导模式，同时也为具体的底层service开发提供了指导。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-arcsoa1/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10070">
						<span class="atitle">
								<font face="Arial" size="4">2. SOA架构设计师的角色</font>
						</span>
				</a>
		</p>
		<p>
				<a name="N10076">
						<span class="smalltitle">2．1 SOA架构设计师应该具备什么？</span>
				</a>
		</p>
		<p>谈到SOA架构设计师的角色，我们首先要了解架构设计师应具有的能力。总体上来说，一个好的架构设计师不仅应该是一个成熟的，具有实际经验的并具有快速学习能力的人，而且他还应该具有良好的管理能力和沟通能力。只有具备了必需的能力，架构设计师才能在关键的时刻作出困难的决定，这就是一名架构设计师应该承担的责任。从角色上来看，SOA 架构师不仅会负责端到端的服务请求者和提供者的设计，并且会负责对系统中非功能服务请求的调研和表述。 </p>
		<p>对于任何一名经验丰富的架构设计师来说，不论他是采用基于传统的架构设计方法（基于J2EE架构或者.NET架构）还是采用基于SOA的架构设计方法来构建一个企业级的系统架构，具有相关商业领域的知识对于架构设计师来说都是必不可少的，架构设计师往往可以通过实际的工作经验积累以及接受相关的专项培训来获得这些商业领域的知识。除了具有相关商业领域的知识以外，一名合格的架构设计师必须具有较广泛的技术背景，这可能包括软硬件，通信，安全等各个方面的知识。但这并不是意味着要成为一名架构设计师就必须熟悉每一门具体技术的细节，架构设计师必须至少能对各种技术有一个整体上的了解，能够熟知每种技术的特点以及优缺点，只有这样架构设计师才能在特定的应用场景下正确地选择各种技术来设计企业整体架构。</p>
		<p>
				<a name="N10082">
						<span class="smalltitle">2．2 什么是SOA架构设计师的职责？</span>
				</a>
		</p>
		<p>那什么是企业级SOA架构设计师的具体角色呢？什么是SOA架构设计师与设计和开发人员之间的差别呢？相信这些都是使大家最容易产生迷惑的问题。举个实际的例子来说，当构建一个基于SOA架构的系统的时候，针对一个具体的 service，系统设计人员主要应该关注的是这个service能够为外部用户提供什么样的服务，也就是说系统设计人员关注的是这个service所提供的功能。而对于SOA架构设计师来说，他们更关心的可能是当有一千个用户同时调用这个 service的时候，什么会发生？也就是说架构设计师关注的应该是一些商业需求和服务级别（service-level）需求。所有的架构设计师的角色都包含了在构建一个系统的一开始就应该尽量减少可能存在的技术风险。而技术风险一般指的是一切未知的、未经证明的或未经测试所带来的风险。这些风险通常与服务级别（service-level）需求相关，偶尔也会与企业具体的业务需求相关。无论是哪种类型的风险，在项目初期设计整体系统架构的过程中更易于发掘这些风险，如果等到架构实施时再发觉这些风险，那么很可能会致使大量的开发人员等在那里，直到这些风险被妥善解决。如果进一步的细化，我们可以看到SOA架构设计师的主要任务包括对整个系统解决方案轮廓的构建，需求分析，对体系结构的整体决策，相关组件建模，相关操作建模，系统组件的逻辑和物理布局设计。</p>
		<p>作为SOA架构设计师必须要能够领导整个开发团队，这样才能保证设计和开发人员是按照构建好的系统架构来开发整个系统的，这一点十分的重要。这就要求一名架构设计师不仅要有很好的技术洞察力，同时还要具有一定的项目管理和项目实施的能力。在系统开发的过程中，架构设计师必须要有良好的沟通和表达能力，这就体现在由架构设计师构建的系统模型是否具有很好的可读性和易理解性。如果由架构设计师构造出的系统模型不是很清晰的话，就可能会影响设计和开发人员对于整个系统架构的理解。为了避免这种情况的出现，定期由架构设计师主持的开发团队内部讨论是十分重要的。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-arcsoa1/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1008E">
						<span class="atitle">
								<font face="Arial" size="4">3. 构建SOA架构时应该注意的问题</font>
						</span>
				</a>
		</p>
		<p>
				<a name="N10094">
						<span class="smalltitle">3．1 原有系统架构中的集成需求</span>
				</a>
		</p>
		<p>当架构师基于SOA来构建一个企业级的系统架构的时候，一定要注意对原有系统架构中的集成需求进行细致的分析和整理。我们都知道，面向服务的体系结构是当前及未来应用程序系统开发的重点，面向服务的体系结构本质上来说是一种具有特殊性质的体系结构，它由具有互操作性和位置透明的组件集成构建并互连而成。基于SOA的企业系统架构通常都是在现有系统架构投资的基础上发展起来的，我们并不需要彻底重新开发全部的子系统；SOA可以通过利用当前系统已有的资源（开发人员、软件语言、硬件平台、数据库和应用程序）来重复利用系统中现有的系统和资源。SOA是一种可适应的、灵活的体系结构类型，基于SOA构建的系统架构可以在系统的开发和维护中缩短产品上市时间，因而可以降低企业系统开发的成本和风险。因此，当SOA架构师遇到一个十分复杂的企业系统时，首先考虑的应该是如何重用已有的投资而不是替换遗留系统，因为如果考虑到有限的预算，整体系统替换的成本是十分高昂的。</p>
		<p>当SOA架构师分析原有系统中的集成需求的时候，不应该只限定为基于组件构建的已有应用程序的集成，真正的集成比这要宽泛得多。在分析和评估一个已有系统体系结构的集成需求时，我们必须考虑一些更加具体的集成的类型，这主要包括以下几个方面：应用程序集成的需求，终端用户界面集成的需求，流程集成的需求以及已有系统信息集成的需求。当SOA架构师分析和评估现有系统中所有可能的集成需求的时候，我们可以发现实际上所有集成方式在任何种类的企业中都有一定程度的体现。针对不同的企业类型，这些集成方式可能是简化的，或者没有明确地进行定义的。因而，SOA架构师在着手设计新的体系结构框架时，必须要全面的考虑所有可能的集成需求。例如，在一些类型的企业系统环境中可能只有很少的数据源类型，因此，系统中对消息集成的需求就可能会很简单，但在一些特定的系统中，例如航运系统中的EDI（Electronic Data Interchange 电子数据交换）系统，会有大量的电子数据交换处理的需求，因此也就会存在很多不同的数据源类型，在这种情况下整个系统对于消息数据的集成需求就会比较复杂。因此，如果SOA架构师希望所构建的系统架构能够随着企业的成长和变化成功地继续得以保持，则整个系统构架中的集成功能就应该由服务提供，而不是由特定的应用程序来完成。</p>
		<p>
				<a name="N100A0">
						<span class="smalltitle">3．2 服务粒度的控制以及无状态服务的设计</span>
				</a>
		</p>
		<p>当SOA架构师构建一个企业级的SOA系统架构的时候，关于系统中最重要的元素，也就是SOA系统中的服务的构建有两点需要特别注意的地方：首先是对于服务粒度的控制，另外就是对于无状态服务的设计。</p>
		<p>
				<b>服务粒度的控制</b>
		</p>
		<p>SOA系统中的服务粒度的控制是一项十分重要的设计任务。通常来说，对于将暴露在整个系统外部的服务推荐使用粗粒度的接口，而相对较细粒度的服务接口通常用于企业系统架构的内部。从技术上讲，粗粒度的服务接口可能是一个特定服务的完整执行，而细粒度的服务接口可能是实现这个粗粒度服务接口的具体的内部操作。 举个例子来说，对于一个基于SOA架构的网上商店来说，粗粒度的服务可能就是暴露给外部用户使用的提交购买表单的操作，而系统内部的细粒度的服务可能就是实现这个提交购买表单服务的一系列的内部服务，比如说创建购买记录，设置客户地址，更新数据库等一系列的操作。虽然细粒度的接口能为服务请求者提供了更加细化和更多的灵活性，但同时也意味着引入较难控制的交互模式易变性,也就是说服务的交互模式可能随着不同的服务请求者而不同。如果我们暴露这些易于变化的服务接口给系统的外部用户，就可能造成外部服务请求者难于支持不断变化的服务提供者所暴露的细粒度服务接口。而粗粒度服务接口保证了服务请求者将以一致的方式使用系统中所暴露出的服务。虽然面向服务的体系结构（SOA）并不强制要求一定要使用粗粒度的服务接口，但是建议使用它们作为外部集成的接口。通常架构设计师可以使用BPEL来创建由细粒度操作组成的业务流程的粗粒度的服务接口。</p>
		<p>
				<b>无状态服务的设计</b>
		</p>
		<p>SOA系统架构中的具体服务应该都是独立的、自包含的请求，在实现这些服务的时候不需要前一个请求的状态，也就是说服务不应该依赖于其他服务的上下文和状态，即SOA架构中的服务应该是无状态的服务。当某一个服务需要依赖时，我们最好把它定义成具体的业务流程（BPEL）。在服务的具体实现机制上，我们可以通过使用 EJB 组件来实现粗粒度的服务。我们通常会利用无状态的Session Bean来实现具体的服务，如果基于Web Service技术，我们就可以将无状态的Session Bean暴露为外部用户可以调用的到的Web服务，也就是把传统的Session Facade模型转化为了 EJB 的Web服务端点，这样，我们就可以向 Web 服务客户提供粗粒度的服务。</p>
		<p>如果我们要在 J2EE的环境下（基于WebSphere）构建Web服务，Web 服务客户可以通过两种方式访问 J2EE 应用程序。客户可以访问用 JAX-RPC API 创建的 Web 服务（使用 Servlet 来实现）；Web 服务客户也可以通过 EJB的服务端点接口访问无状态的Session Bean，但Web 服务客户不能访问其他类型的企业Bean，如有状态的Session Bean，实体Bean和消息驱动Bean。后一种选择（公开无状态 EJB 组件作为 Web 服务）有很多优势，基于已有的EJB组件，我们可以利用现有的业务逻辑和流程。在许多企业中，现有的业务逻辑可能已经使用 EJB 组件编写，通过 Web 服务公开它可能是实现从外界访问这些服务的最佳选择。EJB 端点是一种很好的选择，因为它使业务逻辑和端点位于同一层上。另外EJB容器会自动提供对并发的支持，作为无状态Session Bean实现的 EJB 服务端点不必担心多线程访问，因为 EJB 容器必须串行化对无状态会话 bean 任何特定实例的请求。 由于EJB容器都会提供对于Security和Transaction的支持，因此Bean的开发人员可以不需要编写安全代码以及事务处理代码。 性能问题对于Web服务来说一直都是一个问题，由于几乎所有 EJB 容器都提供了对无状态会话 Bean 群集的支持以及对无状态Session Bean 池与资源管理的支持，因此当负载增加时，可以向群集中增加机器，Web 服务请求可以定向到这些不同的服务器，同时由于无状态Session Bean 池改进了资源利用和内存管理，使 Web 服务能够有效地响应多个客户请求。由此我们可以看到，通过把 Web 服务模型化为 EJB 端点，可以使服务具有更强的可伸缩性，并增强了系统整体的可靠性。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-arcsoa1/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100BE">
						<span class="atitle">
								<font face="Arial" size="4">4. 结束语</font>
						</span>
				</a>
		</p>
		<p>本文简要介绍了有关架构设计师以及SOA架构的知识，分析了SOA架构师在设计SOA系统架构时有哪些应该特别注意的地方。</p>
		<p>本文的第二部分将向您介绍在构建基于SOA架构的企业系统时应该怎样保证所构建的系统架构能够满足系统中不同的服务级别需求。从架构设计师的角度，SOA是一种新的设计模式，方法学。因此，SOA本身涵盖了很多的内容，也触及到了系统整体架构设计、实现、维护等各个方面。本文的内容只是涉及到了有关于架构方面的一部分内容，希望能对广大的SOA系统开发设计人员起到一定的帮助作用。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:03 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构设计师与 SOA ， 第 2 部分</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5717.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:02:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5717.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5717.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5717.html</trackback:ping><description><![CDATA[
		<blockquote>本系列的<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-arcsoa1/"><font color="#5c81a7">第 1 部分</font></a> 介绍了有关架构设计师以及 SOA 架构的知识，分析了 SOA 架构师在设计 SOA 系统架构时有哪些应该特别注意的地方。本文将延续第一部分的内容，向您介绍了 SOA 为企业级架构设计带来的影响，以及在构建基于 SOA 架构的企业系统时应该怎样保证所构建的系统架构能够满足系统中不同的服务级别需求。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N10044">
						<span class="atitle">
								<font face="Arial" size="4">1． SOA 为企业级架构设计带来的影响</font>
						</span>
				</a>
		</p>
		<p>
				<a name="N1004A">
						<span class="smalltitle">1．1 SOA 的特点及其使用范围</span>
				</a>
		</p>
		<p>SOA 既不是一种语言，也不是一种具体的技术，它是一种新的软件系统架构模型。 SOA 最主要的应用场合在于解决在Internet环境下的不同商业应用之间的业务集成问题。Internet环境区别于Intranet环境的几个特点主要是：</p>
		<p>(a)大量异构系统并存，不同计算机硬件工作方式不同，操作系统不同、编程语言也不同；</p>
		<p>(b)大量、频繁的数据传输的速度仍然相对较缓慢并且不稳定；</p>
		<p>(c)无法完成服务（service）的版本升级，甚至根本就无法知道互联网上有哪些机器直接或者间接的使用某个服务。</p>
		<p>SOA 架构具有一些典型特性，主要包括松耦合性，位置透明性以及协议无关性。松耦合性要求 SOA 架构中的不同服务之间应该保持一种松耦合的关系，也就是应该保持一种相对独立无依赖的关系；位置透明性要求 SOA 系统中的所有服务对于他们的调用者来说都是位置透明的，也就是说每个服务的调用者只需要知道他们调用的是哪一个服务，但并不需要知道所调用服务的物理位置在哪里；而协议无关性要求每一个服务都可以通过不同的协议来调用。通过这些 SOA 架构所具有的特性我们可以看到，SOA 架构的出现为企业系统架构提供了更加灵活的构建方式，如果企业架构设计师基于 SOA 来构建系统架构，就可以从底层架构的级别来保证整个系统的松耦合性以及灵活性，这都为未来企业业务逻辑的扩展打好了基础。</p>
		<p>
				<a name="N1005F">
						<span class="smalltitle">1．2 SOA 架构的分层模型</span>
				</a>
		</p>
		<p>接下来简要介绍一下 SOA 系统中的分层模型，整个 SOA 架构的分层模型如图2所示。</p>
		<br />
		<img height="298" alt="" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-arcsoa2/images/image002.gif" width="554" border="0" />
		<br />
		<p>在 SOA 系统中不同的功能模块可以被分为7层：第一层就是系统已经存在的程序资源，例如ERP或者CRM系统等。第2层就是组件层，在这一层中我们用不同的组件把底层系统的功能封装起来。第3层就是 SOA 系统中最重要的服务层，在这层中我们要用底层功能组件来构建我们所需要的不同功能的服务。总的来说，SOA 中的服务可以被映射成具体系统中的任何功能模块，但是从功能性方面可以大致划分为以下三种类型：(1)商业服务（business service） 或者是商业过程（business process）。这一类的服务是一个企业可以暴露给外部用户或者合作伙伴使用的服务。比如说提交贷款申请，用户信用检查，贷款信用查询。(2)商业功能服务（business function service）， 这类服务会完成一些具体的商业操作，也会被更上层的商业服务调用，不过大多数情况下这类服务不会暴露给外部用户直接调用，比如说检索用户帐户信息，存储用户信息等。(3)技术功能服务（technical function service），这类服务主要完成一些底层的技术功能，比如说日志服务以及安全服务等。在服务层之上的第4层就是商业流程层，在这一层中我们利用已经封装好的各种服务来构建商业系统中的商业流程。在商业流程层之上的就是第5层表示层了，我们利用表示层来向用户提供用户接口服务，这一层可以用基于portal的系统来构建。以上这5层都需要有一个集成的环境来支持它们的运行，第6层中的企业服务总线（ESB）提供了这个功能。第7层主要为整个 SOA 系统提供一些辅助的功能，例如服务质量管理，安全管理这一类的辅助功能。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-arcsoa2/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1007C">
						<span class="atitle">
								<font face="Arial" size="4">2． SOA 架构中的非功能性服务级别（service-level）需求</font>
						</span>
				</a>
		</p>
		<p>除了系统的业务需求，架构设计师还必须要保证构建出来的系统架构能够满足系统中的非功能性服务级别（service-level）需求以及服务质量（QoS）方面的需求。在项目初始及细化阶段，架构设计师应该与系统所有涉及方（Stakeholders）一起，为每一个服务级别需求定义其相关的衡量标准。构建出的系统架构必须要能满足以下几方面的服务水准要求：性能、可升级性、可靠性、可用性、可扩展性、可维护性、易管理性以及安全性。架构设计师在设计架构过程中需要平衡所有的这些服务级别需求。例如，如果服务级别需求中最重要的是系统性能，架构设计师很有可能不得不在一定程度上牺牲系统的可维护性及可扩展性，以确保满足系统性能上的要求。随着互联网的发展，新构建的系统对于服务级别需求也变得日益重要，现在基于互联网的企业系统的用户已经不仅仅局限于是本企业的雇员，企业的外部客户也会成为企业系统的主要用户。 </p>
		<p>架构设计师的职责之一就是要尽可能地为提高系统设计人员和系统开发人员的工作效率考虑。在构建整个企业系统架构的过程中，需要充分重视各种服务级别需求，从而避免在系统开发和运行的时候出现重大问题。一个企业级系统中的服务级别需求往往是十分错综复杂的， SOA 架构设计师需要凭借丰富的专业经验和扎实的理论知识来分离和抽象系统中不同的服务级别需求，图3展示了这种分析的过程。 </p>
		<br />
		<a name="N1008A">
				<b>图3</b>
		</a>
		<br />
		<img height="311" alt="图3" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-arcsoa2/images/image004.jpg" width="544" border="0" />
		<br />
		<p>经过 SOA 架构设计师分析和抽象的服务级别需求主要分为以下几类：</p>
		<ul>
				<li>
						<b>性能</b>是指系统提供的服务要满足一定的性能衡量标准，这些标准可能包括系统反应时间以及处理交易量的能力等； 
</li>
				<li>
						<b>可升级性</b>是指当系统负荷加大时，能够确保所需的服务质量，而不需要更改整个系统的架构； 
</li>
				<li>
						<b>可靠性</b>是指确保各应用及其相关的所有交易的完整性和一致性的能力； 
</li>
				<li>
						<b>可用性</b>是指一个系统应确保一项服务或者资源永远都可以被访问到； 
</li>
				<li>
						<b>可扩展性</b>是指在不影响现有系统功能的基础上，为系统填加新的功能或修改现有功能的能力； 
</li>
				<li>
						<b>可维护性</b>是指在不影响系统其他部分的情况下修正现有功能中问题或缺陷，并对整个系统进行维护的能力； 
</li>
				<li>
						<b>可管理性</b>是指管理系统以确保系统的可升级性、可靠性、可用性、性能和安全性的能力； 
</li>
				<li>
						<b>安全性</b>是指确保系统安全不会被危及的能力。 </li>
		</ul>
		<p>
				<b>1) 性能</b>
		</p>
		<p>我们通常可以根据每个用户访问的系统响应时间来衡量系统的整体性能；另外，我们也可以通过系统能够处理的交易量（每秒）来衡量系统的性能。对于架构设计师来说，无论采取哪种衡量系统性能的方法来构建系统架构，这些对于性能的考虑对系统设计开发人员来说都应该是透明的，也就是说对于系统整体架构性能的考虑应该是架构设计师的工作，而不是系统设计开发人员应该关注的事情。在较传统的基于EJB或者XML-RPC的分布式计算模型中，它们的服务提供都是通过函数调用的方式进行的，一个功能的完成往往需要通过客户端和服务器来回很多次的远程函数调用才能完成。在Intranet的环境下，这些调用给系统的响应速度和稳定性带来的影响都可以忽略不计，但如果我们在基于 SOA 的架构中使用了很多Web Service来作为服务提供点的话，我们就需要考虑性能的影响，尤其是在Internet环境下，这些往往是决定整个系统是否能正常工作的一个关键决定因素。因此在基于 SOA 的系统中，推荐采用大数据量低频率访问模式，也就是以大数据量的方式一次性进行信息交换。这样做可以在一定程度上提高系统的整体性能。</p>
		<p>
				<b>2) 可升级性</b>
		</p>
		<p>可升级性是指当系统负荷加大时，仍能够确保所需的服务质量，而不需要更改整个系统的架构。当基于 SOA 的系统中负荷增大时，如果系统的响应时间仍能够在可接受的限度内，那么我们就可以认为这个系统是具有可升级性的。要想理解可升级性，我们必须首先了解系统容量或系统的承受能力，也就是一个系统在保证正常运行质量的同时，所能够处理的最大进程数量或所能支持的最大用户数量。如果系统运转时已经不能在可接受时间范围内反应，那么这个系统已经到达了它的最大可升级状态。要想升级已达到最大负载能力的系统，你必须增加新的硬件。新添加的硬件可以以垂直或水平的方式加入。垂直升级包括为现在的机器增加处理器、内存或硬盘。水平升级包括在环境中添置新的机器，从而增加系统的整体处理能力。作为一个系统架构设计师所设计出来的架构必须能够处理对硬件的垂直或者水平升级。基于 SOA 的系统架构可以很好地保证整体系统的可升级性，这主要是因为系统中的功能模块已经被抽象成不同的服务，所有的硬件以及底层平台的信息都被屏蔽在服务之下，因此不管是对已有系统的水平升级还是垂直升级，都不会影响到系统整体的架构。</p>
		<p>
				<b>3) 可靠性</b>
		</p>
		<p>可靠性是指确保各应用及其相关的所有交易的完整性和一致性的能力。当系统负荷增加时，你的系统必须能够持续处理需求访问，并确保系统能够象负荷未增加以前一样正确地处理各个进程。可靠性可能会在一定程度上限制系统的可升级性。如果系统负荷增加时，不能维持它的可靠性，那么实际上这个系统也并不具备可升级性。因此，一个真正可升级的系统必须是可靠的系统。在基于 SOA 来构建系统架构的时候，可靠性也是必须要着重考虑的问题。要在基于 SOA 架构的系统中保证一定的系统可靠性，就必须要首先保证分布在系统中的不同服务的可靠性。而不同服务的可靠性一般可以由其部署的应用服务器或Web服务器来保证。只有确保每一个 SOA 系统中的服务都具有较高的可靠性，我们才能保证系统整体的可靠性能够得以保障。</p>
		<p>
				<b>4) 可用性</b>
		</p>
		<p>可用性是指一个系统应确保一项服务或者资源应该总是可被访问到的。可靠性可以增加系统的整体可用性，但即使系统部件出错，有时却并不一定会影响系统的可用性。通过在环境中设置冗余组件和错误恢复机制，虽然一个单独的组件的错误会对系统的可靠性产生不良的影响，但由于系统冗余的存在，使得整个系统服务仍然可用。在基于 SOA 来构建系统架构的时候，对于关键性的服务需要更多地考虑其可用性需求，这可以由两个层次的技术实现来支持，第一种是利用不同服务的具体内部实现内部所基于的框架的容错或者冗余机制来实现对服务可用性的支持；第二种是通过UDDI等动态查找匹配方式来支持系统整体的高可用性。在 SOA 架构设计师构建企业系统架构的时候，应该综合考虑这两个方面的内容，尽量保证所构建的 SOA 系统架构中的关键性业务能具有较高的可用性。</p>
		<p>
				<b>5) 可扩展性</b>
		</p>
		<p>可扩展性是指在不影响现有系统功能的基础上，为系统添加新的功能或修改现有功能的能力。当系统刚配置好的时候，你很难衡量它的可扩展性，直到第一次你必须去扩展系统已有功能的时候，你才能真正去衡量和检测整个系统的可扩展性。任何一个架构设计师在构建系统架构时，为了确保架构设计的可扩展性，都应该考虑下面几个要素：低耦合，界面(interfaces)以及封装。当架构设计师基于 SOA 来构建企业系统架构时，就已经隐含地解决了这几个可扩展性方面的要素。这是因为 SOA 架构中的不同服务之间本身就保持了一种无依赖的低耦合关系；服务本身是通过统一的接口定义（可以是WSDL）语言来描述具体的服务内容，并且很好地封装了底层的具体实现。在这里我们也可以从一个方面看到基于 SOA 来构架企业系统能为我们带来的好处。</p>
		<p>
				<b>6) 可维护性</b>
		</p>
		<p>可维护性是指在不影响系统其他部分的情况下修改现有系统功能中问题或缺陷的能力。同系统的可扩展性相同，当系统刚被部署时，你很难判断一个系统是否已经具备了很好的可维护性。当创建和设计系统架构时，要想提高系统的可维护性，你必须考虑下面几个要素：低耦合、模块性以及系统文档记录。在企业系统可扩展性中我们已经提到了 SOA 架构能为系统中暴露出来的各个子功能模块也就是服务带来低耦合性和很好的模块性。关于系统文档纪录，除了底层子系统的相关文档外，基于 SOA 的系统还会引用到许多系统外部的由第三方提供的服务，因此如果人力资源准许的话，应该增加专职的文档管理员来专门负责有关整个企业系统所涉及的所有外部服务相关文档的收集、归类和整理，这些相关的文档可能涉及到第三方服务的接口（可以是WSDL）、服务的质量和级别、具体性能测试结果等各种相关文档。基于这些文档，就可以为 SOA 架构设计师构建企业 SOA 架构提供很好的文档参考和支持。</p>
		<p>
				<b>7) 可管理性</b>
		</p>
		<p>可管理性是指管理系统以确保整个系统的可升级性、可靠性、可用性、性能和安全性的能力。具有可管理性的系统，应具备对服务质量需求（QoS）的系统监控能力，通过改变系统的配置从而可以动态地改善服务质量，而不用改变整体系统架构。一个好的系统架构必须能够监控整个系统的运行情况并具备动态系统配置管理的功能。在对复杂系统进行系统架构建模时， SOA 架构设计师应该尽量考虑利用将系统整体架构构建在已有的成熟的底层系统框架（Framework）上。对于 SOA 架构设计师来说，可以选择的底层系统框架有很多，可以选用基于MQ, MessageBorker，WebSphere Application Server等产品来构建企业服务总线（Enterprise Service Bus）以支持企业的 SOA 系统架构，也可以选用较新的基于WebSphere Application Server 6中内嵌的Sibus来构建企业的ESB以支持 SOA 系统架构。具体选择哪种底层框架来实施 SOA 系统架构要根据每个系统各自的特点来决定，但这些底层的框架都已经提供了较高的系统可管理性。因此，分析并选择不同的产品或底层框架来实现企业系统架构也是架构设计师的主要职责之一。有关于如何利用已有底层架构来构建 SOA 系统，中国 SOA 设计中心已经发表了一系列相关的文章，大家可以在DeveloperWorks中的 SOA 专栏看到它们。</p>
		<p>
				<b>8) 安全性</b>
		</p>
		<p>安全性是指确保系统安全不会被危及的能力。目前，安全性应该说是最困难的系统质量控制点。这是因为安全性不仅要求确保系统的保密和完整性，而且还要防止影响可用性的服务拒绝(Denial-of-Service)攻击。这就要求当 SOA 架构设计师在构建一个架构时，应该把整体系统架构尽可能地分割成各个子功能模块，在将一些子功能模块暴露为外部用户可见的服务的时候，要围绕各个子模块构建各自的安全区，这样更便于保证整体系统架构的安全。如果一个子模块受到了安全攻击，也可以保证其他模块相对安全。如果企业 SOA 架构中的一些服务是由Web Service实现的，在考虑这些服务安全性的时候也要同时考虑效率的问题，因为WS-Security会为Web Service带来一定的执行效率损耗。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-arcsoa2/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10118">
						<span class="atitle">
								<font face="Arial" size="4">3．结束语</font>
						</span>
				</a>
		</p>
		<p>本系列两部分介绍了有关架构设计师以及 SOA 架构的知识，分析了 SOA 架构师在设计 SOA 系统架构时有哪些应该特别注意的地方并在最后简要介绍了在构建基于 SOA 架构的企业系统时应该怎样保证所构建的系统架构能够满足系统中不同的服务级别需求。从架构设计师的角度， SOA 是一种新的设计模式，方法学。因此， SOA 本身涵盖了很多的内容，也触及到了系统整体架构设计、实现、维护等各个方面。本文的内容只是涉及到了有关于架构方面的一部分内容，希望能对广大的 SOA 系统开发设计人员起到一定的帮助作用。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:02 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用于实现 Web 服务的 SOA 编程模型，第 5 部分: 面向服务的用户界面</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5716.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:01:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5716.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5716.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5716.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5716.html</trackback:ping><description><![CDATA[
		<blockquote>面向服务的编程模型可以简化程序到用户 (program-to-human) 的交互的开发，方法是在用户或者管理员控制下在表示层抽象化接口、标准化消息以及聚合独立信息源。本文是关于 IBM 的 SOA 编程模型的系列文章的第 5 部分，介绍了用户面对的服务并提供了用户界面 (UI)。本系列前面的文章介绍了与语言无关的数据访问和基于面向服务的体系结构（Service-Oriented Architecture，SOA）概念的 Web 服务的编程模型。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N10070">
						<span class="atitle">
								<font face="Arial" size="4">面向服务的体系结构的用户界面</font>
						</span>
				</a>
		</p>
		<p>在文献中，对 Web 服务的讨论通常是在程序到程序 (program-to-program) 交互的上下文中进行的。然而， </p>
		<p>
				<i>模型-视图-控制器（Model-View-Controller，MVC）</i>范例是现代大多数 UI 应用程序框架的基础。SOA 操作提供模型层，而 UI 位于视图层。UI 技术可以在各种设备上呈现信息，这些设备包括的范围很广，从窗口小部件和智能电话到浏览器和能够进行大量客户端处理的富客户机。中间件和工具将视图层 UI 技术连接到模型层 Web 服务和数据。</p>
		<p>在 SOA 方法中，宿主组件的环境抽象成<i>容器</i>，它提供已知的服务集。从 UI 的角度来说，承载客户端 UI 组件的三个主要的容器是：</p>
		<ul>
				<li>基本 Web 浏览器。 
</li>
				<li>使用 Java™Script 和动态 HTML 增强的 Web 浏览器。 
</li>
				<li>IBM Workplace™ Client Technology™——具有本地 IBM WebSphere® Application Server 客户机支持的 Eclipse 富客户机。 </li>
		</ul>
		<p>这些容器可以通过支持下列技术得以增强：Servlet、JavaServer Page (JSP) 和 JSP Tag；用于页面排序的 Struts；用于高级页面组合的 JavaServer Face (JSF)；以及合并在同一页面上的多应用程序视图的 Portlet 技术。</p>
		<p>
				<a name="N10094">
						<span class="smalltitle">UI 开发框架</span>
				</a>
		</p>
		<p>UI 开发框架可以简化创建面对用户的复杂应用程序的过程。通常使用下列的 UI 框架来创建 UI 组件：</p>
		<ul>
				<li>
						<b>Struts</b>，拥有最大的开发人员社区和异常工具支持，是 Apache 开放源代码项目，它早于 Java Portlet 规范 JSR 168（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel5/#resources"><font color="#996699">参考资料</font></a>以获得 Struts Web 站点的链接）。Struts 是使用 servlet/JSP 范例开发基于服务器的 UI 的多页 MVC 框架。Struts 的一个特殊版本 V1.1 库支持 IBM WebSphere Portal 上的 JSR 168 Portlet。 
</li>
				<li>
						<b>JavaServer Faces</b> 是 Java Web 应用程序的 MVC 实现，以增量方式构建于以前的技术之上。它很好地适应了 Portlet 开发，提供 Portlet 和 Servlet、声明处理、确认和事件处理。JSF 页面具有一个或多个与该页面上的 UI 控件交互的本地模型。这些控件将 UI 属性呈现给输出，而复杂的逻辑确保它们的表示是在“正确的”地方。客户端模型可以连入<a href="http://www.ibm.com/developerworks/webservices/library/ws-soa-progmodel4/index.html"><font color="#5c81a7">企业服务总线 (Enterprise Service Bus)</font></a> 来发送和接收事件。 
</li>
				<li>
						<b>Java Widget Library</b> (JWL)，是一个可供门户和 Portlet 程序员使用的扩展窗口小部件集，向 JSF 添加 JavaScript 客户端处理，而且将得到 IBM Rational® Suite® DevelopmentStudio 的支持。更新客户机本地视图省去了往返服务器的过程，缩短了几个数量级的响应时间，而且极大地改善了用户体验。 </li>
		</ul>
		<p>
				<i>门户</i> 提供了最好的 UI 支持。在门户体系结构中，<i>Portlet</i>（通常是使用上面提到的某种 UI 框架开发的）是基本构件。使用这种体系结构，开发人员可以把主要精力放在他们的应用程序的独特方面，并且将生命周期、每个用户的自定义、聚合以及与其他组件的集成等公共功能委派给中间件。</p>
		<p>下面几部分将单个服务和门户的 Portlet 组件描述成服务聚合机制。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel5/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100C5">
						<span class="atitle">
								<font face="Arial" size="4">面向服务的 UI 的 Portlet</font>
						</span>
				</a>
		</p>
		<p>Portlet 组件实现了标准服务接口和协议。Java Portlet 规范和用于远程 Portlet 的 Web 服务（Web Services for Remote Portlet，WSRP）标准分别定义了 Java 和 Web 服务的这个接口（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel5/#resources"><font color="#996699">参考资料</font></a>以获得更多关于 WSRP 的信息）。这两个标准非常相似，以致如果存在合适的容器或者代理，为任一接口编写的 Portlet 都可互换。</p>
		<p>
				<a name="javaport">
						<span class="smalltitle">Java Portlet 示例</span>
				</a>
		</p>
		<p>每个 Java Portlet 都实现了该 Portlet 接口或者扩展了实现它的类。这个接口定义了 Portlet 和它的容器之间的服务约定，以及 Portlet 的生命周期：</p>
		<ul>
				<li>初始化 Portlet 并将其放入服务中（<code>init</code> 方法） 
</li>
				<li>处理请求（<code>processAction</code> 和 <code>render</code> 方法） 
</li>
				<li>除去服务的 Portlet（<code>destroy</code> 方法） </li>
		</ul>
		<p>在处理请求期间，Portlet 容器调用 Portlet 的：</p>
		<ul>
				<li>
						<code>processAction</code> 方法来通知 Portlet 用户行为。每个客户机只有一个基于用户的行为被触发。Portlet 可以发出一个重定向、改变它的 Portlet 模式或窗口状态或者更改它的状态。 
</li>
				<li>
						<code>render</code> 方法来请求标记片段。 </li>
		</ul>
		<p>Portlet 还可以调用更多的服务来执行所需的功能。<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel5/#list1"><font color="#996699">清单 1</font></a> 示例使用 Web 服务来检索和显示特定用户的股票报价。</p>
		<br />
		<a name="list1">
				<b>清单 1. 股票报价 Portlet 代码示例</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="70%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				public class StockQuotePortlet extends GenericPortlet {

	private ServiceManager serviceManager;

	public void init(PortletConfig config) throws PortletException {
		serviceManager = new ServiceManager();
	}

	public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
		
        	response.setContentType("text/html");    

        	// invoke autogenerated wrapper to locate service
		NetXmethodsServicesStockquoteStockQuoteServiceLocator loc = 
			new NetXmethodsServicesStockquoteStockQuoteServiceLocator();
		NetXmethodsServicesStockquoteStockQuotePortType port = 
			loc.getNetXmethodsServicesStockquoteStockQuotePort();

		// loop through all stock quotes the user is interested in
		PortletPreferences prefs = request.getPreferences();
		Iterator quoteKeys = prefs.getMap().keys().iterator();
		String key;
		Float quote;
		StockBean quoteBean = new StockBean();
		while ( quoteKeys.hasNext() ) {
			key = quoteKeys.next();
	    		quote =  port.getQuote (key);
			quoteBean.add(key, quote);
		}

		request.setAttribute("StockQuoteBean", quoteBean);

		// render stock quotes using a JSP        
        PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher("jsp/View.jsp");
        rd.include(request,response);

	}
}
			</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这一部分演示了您可以如何使用 Java Portlet 规范来实现 UI 服务，以及您的 Portlet 可以如何调用其他 Web 服务。下一部分将展示如何使用 WSRP 将 UI 作为 Web 服务发布。</p>
		<p>
				<a name="N1011E">
						<span class="smalltitle">用于远程 Portlet 的 Web 服务</span>
				</a>
		</p>
		<p>WSRP 是远程呈现 Portlet 的标准，使门户能够从多个源聚合内容。WSRP 将 Web 服务的集成能力扩展到面向表示的组件，并将视图层公开为跨平台、实现语言和供应商共享。可以发现内容和应用程序提供者并将其插入遵循标准的应用程序中，而不必进行任何额外的编程工作。</p>
		<p>典型的 Web 服务使用远程表示范例，这意味着所有的视图逻辑在客户机上执行，而应用程序逻辑和数据层（控制器和模型）则驻留于服务器上。与此相反，WSRP 使用分布式范例将客户机和服务器的表示分开。</p>
		<br />
		<a name="fig1">
				<b>图 1. 面向数据的 Web 服务和 WSRP 面向表示的 Web 服务的比较</b>
		</a>
		<br />
		<img height="351" alt="WSRP 比较" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel5/figure1.gif" width="456" />
		<br />
		<p>上图展示了这一差异。左边是典型的面向数据的 Web 服务，它提供了无格式的数据；它必须完全依赖于客户端的呈现代码来表示数据。（这意味着需要在客户机上安装和管理客户端应用程序组件。）右边是 WSRP 服务；它的分布式表示逻辑将表示任务分成： 
</p>
		<ul>
				<li>生成标记语言。 
</li>
				<li>将标记片段聚合成一个 Web 页面（没有显示）。 
</li>
				<li>通过标准客户端容器呈现标记语言。 </li>
		</ul>
		<p>
		</p>
		<p>
				<a name="N10148">
						<span class="smalltitle">WSRP 示例</span>
				</a>
		</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel5/#list2">
						<font color="#996699">清单 2</font>
				</a> 展示了一个通过简单对象访问协议（Simple Object Access Protocol，SOAP）从 WSRP 使用者发出的 WSRP <code>getMarkup</code> 请求的示例。</p>
		<br />
		<a name="list2">
				<b>清单 2. 通过 SOAP 发出的 WSRP GetMarkup 请求</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="70%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				&lt;?xml version="1.0" encoding="UTF-8"?&gt;
   &lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 				 
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt; 
      &lt;soapenv:Body&gt;
         &lt;getMarkup xmlns="urn:oasis:names:tc:wsrp:v1:types"&gt; 
            &lt;registrationContext&gt;
               &lt;registrationHandle&gt;192.168.66.57_1096235652731_0&lt;/registrationHandle&gt; 
            &lt;/registrationContext&gt;
            &lt;portletContext&gt;
               &lt;portletHandle&gt;0.1&lt;/portletHandle&gt;   
            &lt;/portletContext&gt;   
            &lt;runtimeContext&gt;    
               &lt;userAuthentication&gt;wsrp:none&lt;/userAuthentication&gt;    
               &lt;portletInstanceKey&gt;ProxyTest_row1_col1_p1&lt;/portletInstanceKey&gt;    
               &lt;namespacePrefix&gt;Pluto_ProxyTest_row1_col1_p1_&lt;/namespacePrefix&gt;   
            &lt;/runtimeContext&gt;   
            &lt;userContext&gt;    
               &lt;userContextKey&gt;dummyUserContextKey&lt;/userContextKey&gt;   
            &lt;/userContext&gt;   
            &lt;markupParams&gt;    
               &lt;secureClientCommunication&gt;false&lt;/secureClientCommunication&gt;    
               &lt;locales&gt;en&lt;/locales&gt;    
               &lt;locales&gt;de&lt;/locales&gt;    
               &lt;mimeTypes&gt;text/html&lt;/mimeTypes&gt;    
               &lt;mode&gt;wsrp:view&lt;/mode&gt;    
               &lt;windowState&gt;wsrp:normal&lt;/windowState&gt;    
               &lt;clientData&gt;     
                  &lt;userAgent&gt;WSRP4J Proxy Portlet&lt;/userAgent&gt;    
               &lt;/clientData&gt;    
               &lt;markupCharacterSets&gt;UTF-8&lt;/markupCharacterSets&gt;    
               &lt;validNewModeswsrp:view&lt;/validNewModes&gt;    
               &lt;validNewModes&gt;wsrp:help&lt;/validNewModes&gt;    
               &lt;validNewModes&gt;wsrp:edit&lt;/validNewModes&gt;    
               &lt;validNewWindowStates&gt;wsrp:normal&lt;/validNewWindowStates&gt;&gt;    
               &lt;validNewWindowStates&gt;wsrp:maximized&lt;/validNewWindowStates&gt;    
               &lt;validNewWindowStates&gt;wsrp:minimized&lt;/validNewWindowStates&gt;   
            &lt;/markupParams&gt;  
         &lt;/getMarkup&gt; 
      &lt;/soapenv:Body&gt;
   &lt;/soapenv:Envelope&gt;
 			</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>WSRP 生产者对这个请求的响应是 HTML 片段，使用者（通常是门户）可以将其聚合成一个完整的文档，例如门户页面。</p>
		<p>不是将每个应用程序或 Portlet 部署到有意使用它的每个服务器上，而是跨网络边界共享应用程序，这具有明显的优势。WSRP 支持：</p>
		<ul>
				<li>
						<b>更简单的管理</b>——门户管理员可以浏览要提供的 WSRP 服务的注册中心，而不是管理可插入组件的本地部署。用户受益于及时使用随需应变的新服务和内容集成。 
</li>
				<li>
						<b>负载分配</b>——跨多个服务器分配负载。 
</li>
				<li>
						<b>减少基础设施成本</b>——应用程序可以共享承载的基础设施。例如，只分配后端银行应用程序的表示层（通过 WSRP）保护了应用程序提供者的安全计算环境，而与此同时，用户仍可以与共享的 UI 进行交互。 
</li>
				<li>
						<b>控制内容表示</b>——在门户重新分配内容时，内容和应用程序提供者可以极大地扩展新用户的范围。 </li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel5/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10183">
						<span class="atitle">
								<font face="Arial" size="4">门户：面向服务的 UI 的动态集成</font>
						</span>
				</a>
		</p>
		<p>门户的视图层将多个后端服务的 UI 集成为一个集中管理的 UI，这样可以统一分离的 IT 基础设施，并通过控制单一的 UI 向用户提供 IT 服务的单一视图。最初分开设计的应用程序可以连接起来构成组合应用程序，用于支持新的功能。例如，连接到协作 Portlet 的电子邮件 Portlet 可以过滤收件箱，使仅当寄件人在线并可以聊天时才显示所收到的电子邮件——这种能力是这两个原始应用程序所不具备的。</p>
		<p>这种 portal 模型的重要意义在于改善了随需应变业务 (On Demand Business) 的敏捷性。管理员成为应用程序集成者，定义新的页面，向它们添加 Portlet，将 Portlet 连接在一起并设置权限（访问控制）——不用编程——来创建新的组合应用程序。自服务的门户使用户可以改变他们的工作环境，以适应他们独特的需求。门户体系结构解放了应用程序开发人员，使其能够全神贯注地创造新的业务价值。</p>
		<p>将来，门户甚至能够集成组合服务，因而能够在更高的层次上聚合 UI。门户可以无缝地与来自其他门户的内容相集成，从而提供水平的、企业级的内容集成。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel5/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10192">
						<span class="atitle">
								<font face="Arial" size="4">总结</font>
						</span>
				</a>
		</p>
		<p>使用门户/Portlet 体系结构，将 SOA 概念应用到用户界面，并委派公共的软件生命周期功能给 UI 容器，这改善了软件开发人员的时间价值 (time-to-value)。WSRP 标准通过 Web 服务交付 UI 组件，为内容提供者和内容使用者提供便利，从而在不用进行任何编程的情况下支持某种类型的应用程序集成。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:01 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网格实践: 在 SOA/Web 服务环境中监视和发现网格服务-----使用 Globus Toolkit 4 中的开放源码信息服务</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5715.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 20:00:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5715.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5715.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5715.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5715.html</trackback:ping><description><![CDATA[
		<blockquote>本文将简要介绍 Globus Monitoring 和 Discovery Service（MDS）。本文讨论了构成 MDS 的组件，并介绍了在网格环境中其他服务通常是如何与 MDS 进行交互的。在阅读本文之后，您应该可以配置 Globus MDS 并注册服务，以及 为 MDS 配置其他信息提供者。您将学习如何组织信息并按照 MDS 的层次结构来配置多个 Index Services，从而构成网格的 Index Service。 </blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N1004E">
						<span class="atitle">
								<font face="Arial" size="4">Globus Monitoring 和 Discovery Service</font>
						</span>
				</a>
		</p>
		<p>Globus Monitoring 和 Discovery System（MDS）是一组 Web 服务，用来监视和发现网格中的可用资源和服务。顾名思义，人们通常会认为资源发现的过程就是发现新的资源。然而，在网格环境中，资源发现是确定哪些网格资源最适合完成某个任务的过程，要求时间最短，利用资源的效率最高。这个过程是从识别可以满足或超过当前作业需求的资源开始的。这通常是可用资源的某个子集。</p>
		<p>接下来，我们需要通过选择最适合的资源来细化这个清单。这个选择过程需要静态和动态的信息。通常，静态信息（例如 CPU 数量、时钟速度、物理内存总量、虚拟内存以及可用磁盘空间）可以帮助确定哪些资源能够满足或超过任务的需求。在细化这个清单时，也要考虑一些动态信息。动态信息包括可用 CPU 的个数，队列中等待执行的作业个数，当前资源的利用率。现在这已经成为一个调度问题，必须考虑业务策略、优先级和服务级别协定（SLA）。</p>
		<p>调度并不是本文的重点，因此让我们保留整个主题改天再来讨论。Globus MDS 提供了有关资源的信息，这样就可以制定智能的调度决策，从而最好且最有效地利用可用资源。MDS 也可以监视资源，在状态发生变化时通知感兴趣的团体，并根据预先定义的条件采取行动。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1005D">
						<span class="atitle">
								<font face="Arial" size="4">Index 和 Trigger Service</font>
						</span>
				</a>
		</p>
		<p>我们对 MDS 所搜集到的有关资源的状态进行监视。搜集这些信息的 MDS 服务称为 Index Service。MDS Index Service 的工作方式与注册表非常相似。它搜集信息，然后将其作为资源属性发布。它通过一个 Web 服务接口将所搜集的信息提供给客户机。客户机可以向 MDS 查询信息，或者订阅所感兴趣的资源属性，即表明如果这些属性的值发生了变化，它们非常乐于被及时通知。这些信息代表了资源属性的配置和状态。Globus MDS 可以监视资源，并跟踪所选择的资源属性。它可以通知订阅者属性值发生了变化。</p>
		<p>这种功能是由另外一个名为 Trigger Service 的 MDS 服务提供的。它与 MDS Index Service 类似，都要从资源中搜集数据，但是它同时还要对所搜集的数据进行监视，这样就可以在数据到达某个极限值时执行某些预定的操作。Trigger Service 的配置就是订阅某些属性，并指定当某个属性值达到某个预定的极限时应该采取什么操作。要采取的操作可以非常复杂，例如当利用率太高时提供更多资源；也可以非常简单，例如通知系统管理员某个文件系统已经满了。MDS Trigger Service 通过 Web 服务提供此功能。客户机使用这个 Web 服务来注册触发器事件。为了进行注册，客户机要提供程序的名字、一个 XPath 查询表达式以及一个值。当 XPath 查询所返回的值等于注册时所提供的值时，就运行这个程序。MDS Trigger Service 通过对所搜集到的信息和在 MDS Trigger Service 注册和配置文件中所指定的条件进行比较，来提供这种功能。</p>
		<br />
		<a name="N1006D">
				<b>位置 1. Trigger Service 注册和配置文件的位置</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
$GLOBUS_LOCATION/etc/globus_wsrf_mds_trigger/trigger_registration_aggregation.xml
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这个配置文件使用 XPath 查询表达式的格式定义了一些规则。每个规则都有一个当满足该条规则时所要执行的操作，以及该操作重复的频率。下面这个例子实现了触发器规则、相关操作以及频率的语法，这些都是在前面的触发器注册和配置文件中指定的。</p>
		<br />
		<a name="N1007A">
				<b>清单 1. Trigger Service 注册的例子</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
       &lt;trigger:TriggerRuleType&gt;
          &lt;trigger:matchingRule&gt;//*[local-name()='GLUECE']&lt;/trigger:matchingRule&gt;
          &lt;trigger:actionScript&gt;glue-trigger-action.sh&lt;/trigger:actionScript&gt;
          &lt;trigger:minimumFiringInterval&gt;600&lt;/trigger:minimumFiringInterval&gt;
       &lt;/trigger:TriggerRuleType&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<font face="Lucida Console" size="2">
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<font face="Lucida Console" size="2">
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
										</font>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<font face="Lucida Console" size="2">
																				<br />
																		</font>
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10081">
						<span class="atitle">
								<font face="Arial" size="4">MDS Aggregation Framework</font>
						</span>
				</a>
		</p>
		<p>MDS Index 和 Trigger Service 都是在 MDS Aggregation Framework 之上构建的。MDS Aggregation Framework 用来构造搜集和聚集数据的高层服务。这些聚集器服务将从各种资源搜集来的信息汇集到一个集中的位置。这个概念的范围很广，从在某个容器中运行的所有服务的集中注册表，到一个网格范围的 Index Service，这可以通过配置 Index Service 与其他 Index Service 一起来存放内容。Index Service 可以按照一种层次化的方式进行配置，上层可以从底层的 Index Service 中提取信息。上层 Index Service 可以当作是这个层次中的上游资源，底层 Index Service 可以当作是下游资源。Index Service 在这个层次中的位置是在层次配置文件中使用上游和下游服务这两个术语进行定义的。</p>
		<br />
		<a name="N1008E">
				<b>位置 2. MDS 层次文件的位置</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				

$GLOBUS_LOCATION/etc/globus_wsrf_mds_index/hierarchy.xml 
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这个层次文件指定了上游和下游 Index Service 的 URL。下面这个样例声明中包括了主机名、端口和默认的 Index Service 的标识。清单 2 显示了 Globus Toolkit 4 测试环境中上游和下游服务的声明。</p>
		<br />
		<a name="N1009B">
				<b>清单 2. 上游和下游服务声明的例子</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				

     &lt;upstream&gt;https://gt4-primary:8443/wsrf/
     services/DefaultIndexService&lt;/upstream&gt;

     ...

     &lt;downstream&gt;https://gt4-secondary:8443/wsrf/
     services/DefaultIndexService&lt;/downstream&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<font face="Lucida Console" size="2">
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<font face="Lucida Console" size="2">
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
										</font>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<font face="Lucida Console" size="2">
																				<br />
																		</font>
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100A2">
						<span class="atitle">
								<font face="Arial" size="4">MDS 资源属性</font>
						</span>
				</a>
		</p>
		<p>正如前面介绍的，用户可以向 Globus MDS 查询资源的属性。这些资源属性代表了资源的配置和状态。我们可以为永久资源和临时资源维护一些属性。Globus MDS 中的信息通过为资源数据关联一个超时时间来保证其反映最新情况。这个值被称为生命周期。MDS Index Service 中保存的所有服务都有一个相关的生命周期。如果在这个生命周期指定的时间内没有更新，数据就过期了。这种方法可以通过只在相关的资源属性进行更新时维护这些资源的配置和状态，从而对临时资源进行处理。当资源不再可用时，资源属性就不会更新了，这些信息就会超时并被删除。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100AB">
						<span class="atitle">
								<font face="Arial" size="4">MDS 资源特性</font>
						</span>
				</a>
		</p>
		<p>Globus MDS Index Service 信息是作为一组 Web Services Resource Framework（WSRF）资源属性进行维护的。客户机可以使用 WSRF <code>get-property</code> 和 WS-Notification <code>subscribe</code> 操作来查询信息或在信息发生变化时收到通知。这些信息也可以使用命令行工具 <code>wsrf-get-property</code> 或 <code>wsrf-query</code> 进行查询。Globus MDS Index Service 通过用 XML 格式提供所请求的信息来对查询进行响应。下面这个例子执行了一个通用的 DefaultIndexService 查询。<code>–a</code> 选项指定可以进行匿名验证，<code>–s</code> 选项指定了服务的 URL，<code>–z</code> 选项定义了验证类型可以是自己、主机或 none。请参阅 <a href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/listing3.html" target="new"><font color="#5c81a7">清单 3</font></a>。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100D5">
						<span class="atitle">
								<font face="Arial" size="4">XPath 查询</font>
						</span>
				</a>
		</p>
		<p>查询可能会产生非常大的 XML 文档。XPath 可以用来帮助定位 XML 中的不同部分。下面让我们来看几个例子，以此展示怎样扩充简单查询来搜集更详细的信息。下面这个例子可以通过统计那些属性匹配 FreeCPU 状态的 ComputingElements，来查询空闲 CPU 的个数。</p>
		<br />
		<a name="N100E1">
				<b>清单 4. 一个查询空闲 CPU 的 wsrf 查询</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
[globust@gt4-test sbin]$ wsrf-query -a -z none -s 
https://127.0.0.1:8443/wsrf/services/DefaultIndexService
 
"count(//*[local-name()='GLUECE']/glue:
ComputingElement/ glue:State/@glue:FreeCPUs)"

2
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>利用前面的例子，下面这个查询展示了一个布尔检查，看是否有指定个数的 CPU 可用。请参阅 <a href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/listing5.html" target="new"><font color="#5c81a7">清单 5</font></a>。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100F0">
						<span class="atitle">
								<font face="Arial" size="4">监视服务</font>
						</span>
				</a>
		</p>
		<p>我们已经讨论了上面这些物理资源的概念，但是 MDS 还要监视服务的配置和状态信息。MDS Index Service 会搜集有关容器上运行的其他服务的信息。服务指定了在 Aggregation Service 注册信息时，要将哪些信息保存在 MDS 中。我们稍后会讨论 Aggregation Service，但是首先介绍一下服务注册这个主题。</p>
		<p>服务可以使用 <code>mds-servicegroup-add</code> 命令进行注册。每个注册后的服务都有一个类似于前面介绍过的生命周期属性的生命周期。如果某个服务的注册项在一段指定的生命周期中没有更新，就会过期。更新生命周期的一种方法是在后台运行 <code>mds-servicegroup-add</code> 命令，这样它就可以持续在 MDS 中更新服务注册项并刷新服务的生命周期了。</p>
		<p>MDS Aggregation Service 从所有的已注册服务中搜集信息，并通过一个 Web 服务接口将这些服务信息提供给客户机。Globus Toolkit 发行版本中提供了一个简单的例子来展示如何在 MDS Aggregation Service 中注册服务。这个例子使用了下面这个位置上的服务注册定义文件。</p>
		<br />
		<a name="N1010B">
				<b>位置 3. MDS 聚集注册文件的位置</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
$GLOBUS_LOCATION/etc/globus_wsrf_mds_
aggregator/example-aggregator-registration.xml
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这个样例聚集文件定义了服务的注册表。每个注册项都定义了一个网格资源、该资源应该注册的服务组以及服务配置参数。这个文件可以与 <code>mds-servicegroup-add</code> 命令一起维护网格资源与 Index Service 之间的注册。这个文件定义了 Index Service 的位置，它被称为默认的 Service Group End Point Reference。</p>
		<br />
		<a name="N1011C">
				<b>清单 6. Index Service URL 被定义为默认的 Service Group End Point Reference</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
&lt;defaultServiceGroupEPR&gt;
   &lt;wsa:Address&gt;https://gt4-test.tacc.utexas.edu:8443/
   wsrf/services/DefaultIndexService&lt;/wsa:Address&gt;
&lt;/defaultServiceGroupEPR&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>example-aggregator-registration 文件中包含了 GRAM 和 RFT 服务的样例注册项。在 ServiceGroupRegistrationParameter 块中定义的每个资源都要在 Index Service 中进行注册。 <a href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/listing7.html" target="new"><font color="#5c81a7">清单 7</font></a> 显示了一个 GRAM 和 RFT Service 注册项的例子。</p>
		<p>MDS Aggregation Service 也可以对外部信息源的信息进行聚合。这些信息源可以代表本地服务可能需要的远程资源。本地服务可以查询 MDS Index Service 来定位远程资源，并确定这些资源的状态。举例来说，下面这个例子就展示了将 Hawkeye 在默认的服务组中注册为一个信息源。Hawkeye 是一个外部信息源的例子。它使用 Condor 技术（例如 ClassAds）来搜集和存储有关 Condor 池中的资源的信息。清单 8 显示了如何注册 Hawkeye，这样就可以通过 Index Service 来使用有关 Condor 的信息了。</p>
		<br />
		<a name="N10131">
				<b>清单 8. 聚集服务组的例子</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
&lt;ServiceGroupRegistrationParameters
   xmlns="http://mds.globus.org/servicegroup/client" &gt;
    &lt;RegistrantEPR	`
      xmlns:agg="http://mds.globus.org/aggregator/types"
      xmlns:gram="http://www.globus.org/namespaces/2004/10/gram/job"
      xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing"&gt;
      &lt;wsa:Address&gt;
          https://gt4-test:8443/wsrf/services/mds/test/subsource/IndexServiceEntry
      &lt;/wsa:Address&gt;
      &lt;wsa:ReferenceProperties&gt;
         &lt;gram:ResourceID&gt;Hawkeye&lt;/gram:ResourceID&gt;
      &lt;/wsa:ReferenceProperties&gt;
   &lt;/RegistrantEPR&gt;
   &lt;RefreshIntervalSecs&gt;600&lt;/RefreshIntervalSecs&gt;
   &lt;Content xsi:type="agg:AggregatorContent"
      xmlns:agg="http://mds.globus.org/aggregator/types"&gt;
      &lt;agg:AggregatorConfig xsi:type="agg:AggregatorConfig"&gt;
         &lt;agg:ExecutionPollType&gt;
            &lt;agg:PollIntervalMillis&gt;60000&lt;/agg:PollIntervalMillis&gt;
            &lt;agg:ProbeName&gt;globus-mds-cluster-hawkeye&lt;/agg:ProbeName&gt;
         &lt;/agg:ExecutionPollType&gt;
      &lt;/agg:AggregatorConfig&gt;
      &lt;agg:AggregatorData/&gt;
   &lt;/Content&gt;
&lt;/ServiceGroupRegistrationParameters&gt; 
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>当服务进行注册时，它们可以提供搜集服务信息的程序名。这个程序称为执行聚集器，在清单 8 中是使用 <code>ProbeName</code> 的形式指定的。MDS Aggregator Service 可以查询资源属性信息，也可以订阅资源属性信息，这样就可以推动后续的更新了。要注册服务，可以使用位置 3 所给出的 example-aggregator-registration 文件作为 <code>mds-servicegroup-add</code> 命令的参数。下面这个例子展示了使用 <code>mds-servicegroup-add</code> 命令来注册默认的 example-aggregator-registration.xml 文件中所定义的服务。<code>–s</code> 参数告诉 MDS 这些服务应该要进行注册。请参阅 <a href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/listing9.html" target="new"><font color="#5c81a7">清单 9</font></a>。</p>
		<p>可以使用 <code>wsrf-query</code> 命令验证服务是否成功注册。下面这个例子显示了一个 ContainerRegistryService 查询，用来获得容器中正在运行的服务的地址。要在另外一个环境中使用这个查询，请替换 URL 的主机名部分。</p>
		<br />
		<a name="N1015A">
				<b>清单 10. 使用 wsrf-query 命令查询注册表地址的例子</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
wsrf-query -s https://gt4-test.tacc.utexas.edu:8443/wsrf/
services/ContainerRegistryService
 "/*/*/*/*[local-name()='Address']"
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<font face="Lucida Console" size="2">
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<font face="Lucida Console" size="2">
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
										</font>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<font face="Lucida Console" size="2">
																				<br />
																		</font>
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10161">
						<span class="atitle">
								<font face="Arial" size="4">MDS 聚集类型</font>
						</span>
				</a>
		</p>
		<p>我们已经介绍过 Web 服务会发布资源属性。一个服务应该注册的最小资源属性集包括服务名、服务的版本号以及这个服务是何时启动的。有些服务（例如 GRAM 或 RFT）会发布其他信息或更详细的信息。MDS 中的信息是使用 3 个聚集器源（Aggregator Source）进行搜集的。这 3 个聚集源是 Query Aggregator、Subscription Aggregator 和 Execution Aggregator。</p>
		<p>前面用来展示服务组注册的那个例子就是一个 Execution Aggregator。Query Aggregation Source 会对注册的服务进行挑选来产生信息。Subscription Aggregation Source 订阅服务数据，这样在服务数据值发生变化时，就可以接收到通知。Execution Aggregation Source 运行一个程序来搜集信息。发布资源属性或用来搜集服务数据的程序有时称为信息提供者（Informational Providers）。GRAM 就是一个信息提供者，因为它会发布有关网格资源的 CPU 和内存信息，以及与作业队列和所提交的作业有关的调度器信息。类似地，可靠文件传输服务（RFT）也是一个信息提供者，它发布的是有关传输器和服务器的状态信息。除了这些信息提供者（它们都是 Globus 发行版中的一部分）之外，MDS 还可以与其他外部信息提供者进行集成，例如 Ganglia 和 Hawkeye。</p>
		<p>Ganglia 是一个分布式的监视系统，主要用来监视高性能系统，例如集群。Hawkeye 是一个监视系统，它使用 Condor 工具和 ClassAd 机制来收集有关分布式资源的信息。Ganglia 和 Hawkeye 使用 GLUE 模式的 CML 映射来搜集资源信息，并将这些信息发送到一个 GRAM 服务，这些信息将在这个服务中作为资源属性发布。Ganglia 信息包括主机属性，例如主机名、处理器、内存、操作系统以及文件系统，还有负载信息。如果在 gluerp XML 文件中定义并配置了适当的信息提供者，MDS 就可以汇集 Hawkeye 或 Ganglia 的信息。</p>
		<br />
		<a name="N10174">
				<b>位置 4. GLUE 资源提供者的位置</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
$GLOBUS_LOCATION/etc/globus_wsrf_mds_
aggregator/example-aggregator-registration.xml
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>Globus 默认的配置说明没有信息提供者。要指定 Hawkeye 或 Ganglia 作为信息提供者，请修改 gluerp.xml 文件中的适当项，这个文件位于 Globus 安装目录中的 etc/globus_wsrf_mds/usefulrp 目录中。下面这个例子展示了指定 Hawkeye 作为信息提供者的正确定义。后面的例子将展示如何配置 Ganglia 作为信息提供者。</p>
		<br />
		<a name="N10181">
				<b>清单 11. 信息提供者注册项</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
&lt;config xmlns="http://mds.globus.org/2004/10/gluerp-config"&gt;
   &lt;defaultProvider&gt;shell /usr/local/globus/globus-4.0.0/
   libexec/globus-mds-cluster-hawkeye &lt;/defaultProvider&gt;
&lt;/config&gt;

   ...

&lt;config xmlns="http://mds.globus.org/2004/10/gluerp-config"&gt;
   &lt;defaultProvider&gt;java org.globus.mds.usefulrp.glue.
   GangliaElementProducer&lt;/defaultProvider&gt;
&lt;/config&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<font face="Lucida Console" size="2">
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<font face="Lucida Console" size="2">
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
										</font>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<font face="Lucida Console" size="2">
																				<br />
																		</font>
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10188">
						<span class="atitle">
								<font face="Arial" size="4">webMDS</font>
						</span>
				</a>
		</p>
		<p>我们在前面已经看到可以使用 <code>wsrf-query</code> 命令来查询 MDS 信息。实际上，MDS 信息也可以使用 webMDS 进行查看。webMDS 是一个用来查看 MDS 中所包含的资源属性信息的前端。webMDS 是一个 servlet，它可以查询 Globus MDS Index Service，并使用 XSLT 转换对数据进行格式化，从而可以很好地在 Web 浏览器中显示。</p>
		<p>Web 管理员可以使用 HTML 表单选项定制 webMDS。他们可以配置不同的插件来搜集数据，并使用 XSLT 转换对这些数据进行格式化，从而创建自己的定制视图。webMDS 可以配置为从 MDS 中的各种源搜集信息，并使用 XSL 转换对这些信息进行过滤。如果 Globus Toolkit 是使用默认配置安装的，那么 webMDS 就可以查询 MDS Index Service，而不用修改任何配置。我们测试环境中使用的 webMDS URL 如清单 12 所示。要在另外的环境中使用 webMDS，请使用您自己的主机名替换其主机名部分，如果您不是在默认端口上运行容器的，还需要修改端口号。</p>
		<br />
		<a name="N1019B">
				<b>清单 12. webMDS URL</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
http://gt4-test.tacc.utexas.edu:9080/webmds
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>可以通过编辑下面的 indexinfo 文件并修改默认的 URL 来改变 webMDS URL ：</p>
		<br />
		<a name="N101A9">
				<b>位置 5. MDS 聚集注册文件的位置</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
$GLOBUS_LOCATION/lib/webmds/conf/indexinfo
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>要部署 webMDS，首先为 Globus <code>（GLOBUS_LOCATION）</code> 和 Tomcat <code>（CATALINA_HOME）</code> 设置环境变量，然后使用下面的命令为 Tomcat 创建一个 context 文件：</p>
		<br />
		<a name="N101BF">
				<b>清单 13. 创建 webMDS context 文件</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
$GLOBUS_LOCATION/lib/webmds/bin/webmds-create-contex-file
  \ $CATALINA_HOME/conf/Catalina/localhost
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在成功运行这个命令创建 context 文件之后，请重新启动 Tomcat，以便使用新的配置信息。重新启动 Tomcat 可以使用下面的命令：</p>
		<br />
		<a name="N101CD">
				<b>清单 14. 重启 Tomcat 容器</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
$CATALINA_HOME/bin/shutdown.sh
…
$CATALINA_HOME/bin/startup.sh
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>重启 Tomcat 容器之后，可以在浏览器的地址栏中键入 webMDS 的 URL（请参阅清单 12）来访问 webMDS。这个 URL 中需要替换上您安装使用的主机名和端口号。注意，这是 Tomcat 中运行 webMDS 的 URL，而不是在 Globus 容器中运行的 MDS 服务的 URL。</p>
		<p>这个样例表单是由 Globus 发行版提供的，用来展示 webMDS 的功能。也可以使用模板来创建新的定制请求。</p>
		<p>通过 webMDS 来查询 Index Service 可以显示在 Index Service 中注册的资源。每个服务都提供了一种资源类型、惟一标识符和一个链接（指向更详细的信息）。选择资源项可以产生有关资源的详细信息。我们已经介绍过 GRAM 和 RFT 服务都在 Index Service 中进行了注册。图 1 是一个显示与 RFT 服务有关的详细信息的例子。</p>
		<br />
		<a name="N101DF">
				<b>图 1. RFT 服务的 webMDS 信息</b>
		</a>
		<br />
		<img height="648" alt="RFT 服务的 webMDS 信息" src="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/webMDSRFT.jpg" width="589" />
		<br />
		<p>如果 GRAM 配置用来与资源管理器一起使用，例如 LSF、PBS 或 Condor，那么每个资源都会存在这样一个注册项。</p>
		<p>图 2 和图 3 显示了与 LSF 服务有关的详细信息。</p>
		<br />
		<a name="N101F6">
				<b>图 2. globus-mds-LSF 例子 1</b>
		</a>
		<br />
		<img height="633" alt="globus-mds-LSF" src="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/webMDSserviceGroupLSF1.jpg" width="572" />
		<br />
		<br />
		<a name="N10207">
				<b>图 3. globus-mds-LSF 例子 2</b>
		</a>
		<br />
		<img height="638" alt="LSF 服务组" src="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/webMDSserviceGroupLSF2.jpg" width="572" />
		<br />
		<p>图 4 显示了与 Condor 服务有关的详细信息。</p>
		<br />
		<a name="N1021B">
				<b>图 4. globus-mds-condor_cluster 例子</b>
		</a>
		<br />
		<img height="704" alt="Condor 服务组" src="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/webMDSserviceGroupCondor.jpg" width="572" />
		<br />
		<p>webMDS 是 MDS Index Service 的一个简单易用的接口。我们在前面已经展示了 <code>mds-servicegroup-add</code> 命令可以用来在 MDS 中注册服务，聚集源可以配置为对来自服务和外部信息提供者的信息进行汇集。这些信息提供者运行了一个程序来搜集信息，它们都是 Execution Aggregators。这很容易展示，可以手工运行信息提供者，并验证这些信息和格式与通过 webMDS 所提供的信息和格式完全相同。下面这个例子显示了 Hawkeye 信息提供者的情况，这是由清单 8 中下面这一行定义的：</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">&lt;agg:ProbeName&gt;globus-mds-cluster-hawkeye&lt;/agg:ProbeName&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>请参见 <a href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/listing15.html" target="new"><font color="#5c81a7">清单 15</font></a>。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4mds/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1023E">
						<span class="atitle">
								<font face="Arial" size="4">结束语</font>
						</span>
				</a>
		</p>
		<p>我们首先概要介绍了 Globus MDS，然后了解了某些底层服务的详细知识。Index Service 是一个注册表，负责搜集信息并以资源属性的形式来发布这些信息。Trigger Service 使客户机可以订阅资源属性，并在数据达到某个极限值时执行预定义的操作。这些服务都是构建在 Aggregation Service 之上的，后者也可以对来自外部信息源的信息进行聚集。这些信息可以汇集到一个集成的注册表中，称为网格 Index Service。Index Service 以编程方式向客户机提供了资源属性信息，这可以通过 Web 服务、命令行接口或浏览器来接收。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 04:00 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为面向服务的解决方案建模</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5714.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 19:58:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5714.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5714.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5714.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5714.html</trackback:ping><description><![CDATA[
		<blockquote>本文来自于 Rational Edge：IBM Rational Unified Process Update for Service Oriented Architecture（RUP Update for SOA）与 UML Profile for Software Services 的 Rational Software Architect 实现的结合提供了建模方法，以及一组用于面向服务体系结构模型解决方案的体系结构和设计的最佳实践。本文描述了背景、范围和此新功能背后的一些概念。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<img alt="插图" hspace="5" src="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/modelingsoa.jpg" align="right" border="0" />
				<i>三年前，我们这些处于 Rational Software Corporation 前沿的一组人坐下来撰写了一篇有关利用面向服务的体系结构（service-oriented architecture，SOA）式样<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>1</sup></font></a>来开发解决方案问题的文章，并且从那以后发生了许多事。我们所面临的一个问题是 Rational Software 有一组建模工具，但没有 IDE 来实际地开发我们所建模的服务实现。随着 IBM 对 Rational 的收购，我们现在有了一个世界级的 WebSphere Studio Application Developer（现在是 Rational Application Developer，或 RAD）形式的 IDE。我们还面临着一个问题，许多关于 SOA 的思想都不成熟，并且许多是被错误驱使的 —— 一个我们在文章中考虑的问题。既然支持 SOA 的 IBM 平台已经相当地成熟，并且我们的开发工具已经增加了按照灵活快捷的方式开发服务的功能，我们决定再次访问我们在前面文章中概括的服务设计的概念。</i>
		</p>
		<p>
				<i>此讨论的结果是一个新的理解：我们的价值不是在表现 WSDL（Web 服务描述语言）和 XML 的所有三角地的模型开发，而是允许设计人员和架构师用恰当的功能指定恰当的服务并实现 SOA 式样的潜在益处。 此理解将我们引向一些长远的讨论，这些讨论是关于 1) 用来表现服务模型的恰当抽象级别，和 2) SOA 式样的开发影响 Rational Unified Process®，或 RUP® 的方式。</i>
		</p>
		<p>
				<i>本文的前三分之一介绍了我们为变更所设置的范围，包括我们所关注的需求。接下来我将描述一些关键的主题，我们将这些主题用作对 RUP 的变更框架，及用于支持面向服务的解决方案开发的 Rational Software Architect（RSA）补充。最后，我将描述一些在我们的思想中使用的情境，这些情境随时间得到了改进，但还需要一些关键客户的验证。</i>
		</p>
		<p>
				<a name="N10067">
						<span class="atitle">
								<font face="Arial" size="4">设置恰当的范围</font>
						</span>
				</a>
		</p>
		<p>我们决定不仅开发一个新的用于 RSA 的建模概要文件，还要开发添加到 RUP 中的指导，为帮助实践者在预想和开发面向服务的解决方案中实际地使用工具。</p>
		<p>然而，众所周知，对于任何项目最关键的方面之一是设置恰当的范围：太小，您就会做出对任何人没有实际意义的东西（除了可能能够拿出您自己的要获得利益的目的），太大，就很可能要煮沸整个海洋。所以我们建立了以下标准：</p>
		<ul>
				<li>我们开发的模型必须要处于当前实现技术和标准之上的抽象级别上（WS-* 规范，就是各种 Web 服务规范），然而，还要将 SOA 的概念作为头等的要素。<br /><br /></li>
				<li>结果的模型必须是可扩展的，可以考虑到相关的额外规范，如安全性、服务质量，可管理性，等等。<br /><br /></li>
				<li>模型必须在 IBM Rational Software Modeler（RSM）和 IBM Rational Software Architect（RSA）中实现，最初作为一个 UML 概要文件。<br /><br /></li>
				<li>指导不得不向基础 RUP 添加具体的 SOA 概念。然而，我们想要在现有的 RUP 中利用尽可能多的东西，因此，为了使更新很容易地添加到现有的 RUP 配置中，我们最初选择不改变任何存在的东西。<br /><br /></li>
				<li>我们的工作应该考虑在提供 SOA 指导中 IBM 已经完成的工作，如 IBM Global Services SOMA 技术。<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>2</sup></font></a></li>
		</ul>
		<p>因此我们定义了一组三个可交付使用的标准，每一个都可以从 IBM developerWorks 中得到：</p>
		<ul>
				<li>描述 UML Profile for Software Services 的文档，<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>3</sup></font></a>它依照的是 OMG 概要文件文档的式样。<br /><br /></li>
				<li>实现 UML Profile for Software Services 的 RSM 或 RSA 插件，<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>4</sup></font></a>它使模型构建于工具之中并符合上面的概要文件。<br /><br /></li>
				<li>包含了所有关于 SOA 体系结构<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>5</sup></font></a>和设计主题指导的 RUP 插件，它提供了关于依照上面的概要文件开发服务设计模型的具体指导。 </li>
		</ul>
		<p>幸亏 RSM 和 RSA 工具具有可扩展机制，我们才能够不仅交付 UML Profile for Software Services，还交付一个模板模型（当您选择 File -&gt; New -&gt; UML Model 时可用）和两个添加到 Sample Gallery 中的示例。</p>
		<p>这是我们考虑的一个合理的标准集合并可以交付。所以让我们看看在 2005 年 5 月 IBM developerWorks 中实际交付的内容。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100D0">
						<span class="atitle">
								<font face="Arial" size="4">关键概念和主题</font>
						</span>
				</a>
		</p>
		<p>首先，什么是 SOA？流行着许多定义，但让我们以一个软件工程师的角度去看，简单地说 SOA 是一个“体系结构式样”的实例。这又引出一个问题，什么是体系结构式样？这里有一个来自 Roy Thomas Fielding 的很好的定义：</p>
		<blockquote>
				<i>体系结构式样等同于限制体系结构要素的作用或特性及任何体系结构中符合该式样的那些要素之间的容许关系的体系结构约束。<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>6</sup></font></a></i>
		</blockquote>
		<p>举个例子，一个已编制的体系结构式样是管道和过滤器样式，它包含了将管道作为<i>连接器</i>来关联过滤器的独立的<i>要素</i>。在管道连接的两个过滤器之间存在着数据类型必须遵照的具体的约束，且存在着一些令式样适应于某些环境的特征。</p>
		<p>知道了这些，我们可以开始列举 SOA 的体系结构要素，以及具体到其式样的关系和约束。有了这个有用的体系结构式样的定义，Fielding 还提供了一个非常及时的建议：</p>
		<blockquote>
				<i>设计这个强意词是普遍发生的。至少软件行业中的某些此种行为还缺乏对为什么已知的体系结构约束集合是有用的的理解。换句话说，在选择复用那些体系结构时，好的软件体系结构背后的原因对设计人员不是显然的。<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>7</sup></font></a></i>
		</blockquote>
		<p>我们希望通过提供 RUP 中的具体附加内容集的简明及时的指导来缓和此精确的行为。此指导描述了体系结构的式样、要素和关系，以及在整个开发生命周期中他们是如何被识别、指定和管理的。同事还要注意，通常体系结构的目标，特别是体系结构建模，提供了一个适当的抽象级别，在此级别上，可以容易地识别体系结构的要素，并且在不隐藏那些应该添加到针对实现更低层细化级别的细节的情况下，对要素进行控制。 </p>
		<p>在下面几个部分中，我们将讨论针对 SOA 的 RUP 更新中的一些关键主题 —— 特别是，要素、关系和每个主题引入的约束。</p>
		<p>
				<a name="N10107">
						<span class="smalltitle">服务的识别和说明</span>
				</a>
		</p>
		<p>我们的标准规定，关键的 SOA 概念必须作为头等要素通过模型表现出来，因此这些关键的概念是什么？如您所预想的，其中一个概念就是<i>服务</i>本身，然而，与其作为模型建立的中心，还不如实际地成为次要的要素（不是重要的，但作为模型的要素，因为它不能独立存在）。要构建一个表现 WSDL 所定义服务的服务模型，我们必须首先开发<i>服务规范</i>以及<i>服务供应商</i>。</p>
		<p>服务规范有三个规范要素，所有都同样重要，虽然在某种情况下，根据服务的建模类型可对它们进行选择：</p>
		<ul>
				<li>
						<b>结构规范</b>。它可以用标准的 UML 或 Java 接口考虑。其定义了可以调用的操作和由这些操作销毁或创造出的消息。<br /><br /></li>
				<li>
						<b>行为规范</b>。它表示出服务客户和所指定服务之间的任意预期的有意义的协议或会话。例如，服务也许要求您在调用另一个操作之前先登录，这称为伪对话服务。服务也许还要求客户实现特殊的接口，以便接口可以被回调，且协议可以展示这点。<br /><br /></li>
				<li>
						<b>策略规范</b>。它表示服务的策略主张和约束。策略主张可能包括安全性、可管理性等等。 </li>
		</ul>
		<p>那么，例如，如果我们设想一个订单管理服务，我们也许期望看到列出“下订单”、“取消订单”和“更新订单”作为可用操作的结构规范。此订购服务的行为规范可能会说明，您如何不能更新或取消没有订购的订单，或者在您取消订单之后就不能再对其更新。最后，策略规范可能要求加密订单的某些要素，指示要使用的加密技术、要使用的证书等等。</p>
		<p>我们在 RUP 中已经交付的指导的一个方面是一组技术（新的行为<i>识别服务</i>中进行了描述），用来从业务过程模型、用例或现有的各种清单资产中确定服务。这种行为和这些技术集允许架构师和设计人员制造出候选服务模型，这些模型是经常用于描述用来实现过程或需求集的“理想化”服务的服务规范。</p>
		<p>我们介绍术语“候选服务”，因为许多这些服务经常不得不被重构来 1) 符合现有服务，2) 适应现有功能体系结构的框架，或者 3) 被分开以考虑更细致或并行的开发。</p>
		<p>
				<a name="N10147">
						<span class="smalltitle">管理服务组合</span>
				</a>
		</p>
		<p>SOA 式样解决方案的开发的一个主要优点是在开发一个应用程序时（收集需求、设计并实现解决方案，且管理项目），不用将应用程序作为一个固定的边界考虑。在 SOA 中，我们看到的应用程序是一个动态的实体，一个满足特殊业务需求集的服务配置。要达到这种状态，我们显然需要在企业中设计、实现并管理作为可用功能组合的服务集。</p>
		<p>该需求就是为什么我们指定前面提到的新的识别服务行为的原因。我们不仅是在识别候选服务时考虑组合，我们还由服务的原始形式进行重构以适应组合中服务的形式。该级别的复用不仅应该得到设计工具的支持，不仅应该得到关于服务组合的信息存储库的支持，还应该 —— 最重要的 —— 得到以恰当的方式开发恰当的服务时指导参与者的过程支持。</p>
		<p>这确实导致了一个特别的问题，在传统情况下，我们关注软件开发生命周期，视其为一个由项目限制时间的过程，项目受到解决方案的某些离散部分的开发时间的限制。就服务组合本身而言（关于已安装的服务的元数据和考虑复用的设计模型的组合），我们看到这样一个生命周期，它横切了使用它并对它做出贡献的单个项目，如图 1 所示。</p>
		<img height="270" alt="图 1：服务投资组合生命周期" src="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/fig1johnston.jpg" width="472" border="0" />
		<p>
				<b>图 1：服务组合生命周期</b>
		</p>
		<p>图 1 所示的服务组合管理过程是一个不断进展的活动。注意单个项目与服务组合交互的方式，在项目的细化阶段从单个的项目中提取需要组合的服务，在项目的构造阶段组合的服务被实现。</p>
		<p>
				<a name="N10168">
						<span class="smalltitle">划分面向服务的解决方案</span>
				</a>
		</p>
		<p>不管多大规模的模型（或实际上是要素的任意集合）都存在的一个问题就是如何管理模型，如何对要素分类，以及如何以任何检查模型的不同涉众都可以理解的方式来组织要素。</p>
		<p>服务模型的此种结构在服务的识别和服务的管理过程中变得重要起来。让我们暂时考虑 UML 1.x 中的模型管理 —— 包 —— 的典型方法。关于包的问题是它们通过所有权或聚合来管理模型要素，换句话说，一旦将一个要素放入单个的包中，不同包中的要素可以对其访问但不能将其“放置”在一个以上的包中。此刻，对于我们这些具有程序设计语言背景的人来说，这似乎不是主要问题，它反映出包、模块或命名空间在语言中工作的方式。</p>
		<p>然而，我们真正需要表示的是模型的视图，因为对业务所有者有用的结构集合不同于软件架构师、设计人员、开发人员、操作人员等所需要的集合。出于该原因，我们推荐不要将包作为管理模型视图的主要机制（不是说包中不出现服务，只是说包应该用于模型的更平凡结构）。取而代之，我们指望 UML 2.0 规范的复合结构概念，其提供了表示使用“部件”和“连接器”的分类器的内部结构功能。</p>
		<p>我们利用这些技术划分所管理的服务，换句话说，根据逻辑分类方案进行组织，不需要让服务所属于任何一个分区。例如，我们可能有两个不同的组合视图：一个表示不同的业务线，另一个表示提供服务的应用程序“类型”，如图 2 所以。</p>
		<img height="296" alt="图 2：根据逻辑分类方案利用分区进行组织，不需要让服务所属于任何一个分区" src="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/fig2johnston.jpg" width="600" border="0" />
		<p>
				<b>图 2：根据逻辑分类方案利用分区进行组织，不需要让服务所属于任何一个分区</b>
		</p>
		<p>注意，相同的服务（较小的方框）出现在一个以上的分区中（较大的方框），顶部的三个分区表示业务线，且底部的三个表示应用程序类型。从此处我们可以看到，虽然业务的供应链拥有并管理着 Shipping、Validation，和 Warehouse 服务，但我们可以看到 Shipping 服务由 ERP 包提供而 Warehouse 和 Validation 服务是定制开发的。</p>
		<p>该技术不仅在管理已开发的服务集方面体现价值，还在服务的识别过程中体现价值。分区可以用于表示服务分组，并作为服务规范进行开发，可以将服务放置于不同的分区中以可视化关系和它们之间的依赖。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1018F">
						<span class="atitle">
								<font face="Arial" size="4">RUP 更新</font>
						</span>
				</a>
		</p>
		<p>对 SOA 的 RUP 更新已经在许多（和谐的）地方得到扩展，以提供关于体系结构开发和面向服务解决方案的设计模型的具体指导。但 RUP 的许多领域仍旧不受到该更新的影响。例如，我们在早期决定的更新的开发，尽管一些行业作家已经引入了支持 SOA 的新开发角色，但我们相信当前 RUP 的<i>Software Architect</i> 和<i>Designer</i> 角色对于我们所需要的更新是足够的。</p>
		<p>
				<a name="N101A0">
						<span class="smalltitle">新的和更新的工作流</span>
				</a>
		</p>
		<p>在更新 RUP 以引入对于 SOA 解决方案构建的指导的过程中，我们只添加了以下两个新活动：</p>
		<ul>
				<li>
						<b>识别服务</b>。由 <i>Analysis &amp; Design </i>和 <i>Refine the Architecture </i>工作流中的 <i>Software Architect</i>执行。<br /><br /></li>
				<li>
						<b>服务设计</b>。由 <i>Analysis &amp; Design </i>和 <i>Design Services </i>工作流中的 <i>Designer </i>执行。 </li>
		</ul>
		<p>识别服务活动是<i>软件架构师</i>在概括解决方案的体系结构时所执行的一个活动，活动的输出是<i>服务模型</i>。该服务模型中包含一组已识别的，已经是候选的服务，这些服务要作为<i>服务设计</i>活动的一部分由<i>设计人员</i>进一步细化。</p>
		<p>
				<a name="N101DF">
						<span class="smalltitle">新的和更新的工件</span>
				</a>
		</p>
		<p>更新将整个服务模型（表示 UML Profile for Software Services）和其附属的要素引入到 RUP 中。模型表示面向服务解决方案的体系结构抽象，该抽象使软件架构师和设计人员在这样一种环境下开发模型，在这种环境下，服务的概念和对 SOA 的具体关注是头等的模型要素。模型<i>不</i>直接表示任何实现技术，如 WSDL。</p>
		<img height="372" alt="图 3：UML Profile for Software Services" src="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/fig3johnston.jpg" width="600" border="0" />
		<p>
				<b>图 3：UML Profile for Software Services</b>
		</p>
		<p>
				<a name="N101FA">
						<span class="smalltitle">新的和更新的指导方针</span>
				</a>
		</p>
		<p>除了在服务模型中描述工件的具体内容，更新还包括与上面描述的主题相关的概念以及在开发 SOA 模型时反映对重要性所关注的额外的指导方针。这些关注包括：</p>
		<ul>
				<li>
						<b>消息设计和消息附件</b>。设计消息，管理可复用的消息目录和消息方案的一致性。<br /><br /></li>
				<li>
						<b>服务数据封装</b>。围绕服务中数据管理的服务设计特性和数据方案与服务边界之间的关系。<br /><br /></li>
				<li>
						<b>服务仲裁</b>。有关一般作为 SOA 式样一部分（特别是 Enterprise Service Bus，或 ESB 视野）的仲裁组件的概念的具体指导。<br /><br /></li>
				<li>
						<b>状态管理</b>。对有状态和无状态服务的优点的讨论，包括对于规范的技术和管理资源状态的服务设计。 </li>
		</ul>
		<p>我们还提供了指导方针 <i>Going from Services to Service Components（从服务到服务组件）</i>，其论证了从服务设计模型到传统的设计或实现模型的一种可能的变换。</p>
		<p>更新还包含两个报告描述，描述创建服务模型的 RSA 工具指导者，和表现服务模型开发的相当完整的实例。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10235">
						<span class="atitle">
								<font face="Arial" size="4">RSM 或 RSA 插件</font>
						</span>
				</a>
		</p>
		<p>IBM Rational Software Modeler 和 IBM Rational Software Architect 的新插件（今后称为 RSM 或 RSA 插件）提供了 UML Profile for Software Services，一个您可以使用的模板模型，和一对论证概要文件使用的示例模型。该插件可以在 IBM developerWorks 下载，并可以利用标准的软件更新机制将其添加到工具中（注意下载的压缩文件表示一个存档更新站点）。</p>
		<p>在 RSM 或 RSA 中，在软件服务的插件安装完之后可以很容易地创建新的服务模型。以下的步骤是必要的（注意是在 Modeling Perspective 中）：</p>
		<ol>
				<li>如果在您的工作区中已经有了一个 UML 建模工程，您可以将服务模型添加到该工程中或创建新工程（参见步骤 2）。<br /><br /><ul><li>右键单击工程并选择 New -&gt; UML Model 或者在 File 菜单中选择 New -&gt; UML Model。<br /><br /></li><li>当您看到 New UML Model 向导时，如图 4，转到步骤 3。 </li></ul></li>
				<li>要创建新的 UML 建模工程，到 File 菜单中并选择 New -&gt; Project，UML Project 处在 Modeling 目录下面。<br /><br /><ul><li>在结果向导中，给出工程的名称并选择 Next。 </li></ul></li>
				<li>在 New UML Model 向导中，如图 4 所示，确保正确设置了目标文件夹，从模板列表中选择 Service Design Model，并给模型命名。 </li>
		</ol>
		<img height="460" alt="图 4：New UML model 向导" src="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/fig4johnston.jpg" width="346" border="0" />
		<p>
				<b>图 4：New UML model 向导</b>
		</p>
		<p>这将创建并打开带有 UML Profile for Software Services 的 UML 模型和一个模板结构，您可能由该模板结构开始为 SOA 解决方案建模。模型还包含一组可以在创建一些复合要素时有用的可复用模型要素，至少使用这些要素要比手动创建更简单。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1027A">
						<span class="atitle">
								<font face="Arial" size="4">三个情境</font>
						</span>
				</a>
		</p>
		<p>以下的部分概述了我们从与客户的讨论（不论客户认为面向服务的解决方案的开发如何适应他们的软件开发生命周期）中总结出的三个情境。我们先认明三个开发服务的方法，而它们当然不是不相容的（真实的工程使用技术的组合），它们在阐明不同方法和思想方面是有用的。</p>
		<p>在任何可能的地方，我将把在这些情境中描述的任务与 RUP 中定义的结合起来。</p>
		<p>
				<a name="N10288">
						<span class="smalltitle">1. 以消息为中心的设计</span>
				</a>
		</p>
		<p>在消息为中心的设计中，焦点在服务领域中。例如领域工程或面向对象分析和设计（Object-Oriented Analysis and Design，OOAD）的技术提供了许多对抽象领域模型开发的洞察，并且这些技术通常生成对应消息方案的高度可复用模型。服务设计常常是次要的活动，尽管有时候并行地完成。例如，在电子数据交换（Electronic Data Interchange，EDI）中，不存在真正的服务接口概念，因为 EDI 系统通常有一个单个的全球的消息收件箱和发件箱。</p>
		<p>该方法的一个实例可能是在传统的B2B 环境中，以 EDI 标准化作为代表。在此种情况下，主要的设计活动涉及开发某些行业或其他范围内取得一致的消息方案，这被认为是表示一类消息的方案 —— 例如，EDI<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>8</sup></font></a>Purchase Order、ACORD<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>9</sup></font></a>Claim Inquiry，或者 SWIFT<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>10</sup></font></a>Credit Transfer。</p>
		<p>在许多现代标准活动中，如 SWIFT 或 RosettaNet，<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>11</sup></font></a>经常存在一个用于标准的设计过程，包含了一个混合的以消息为中心并以服务为中心的方法，在该方法中使用了如用例分析的技术。</p>
		<p>
				<a name="N102B5">
						<span class="smalltitle">情境</span>
				</a>
		</p>
		<p>在此实例中，客户是一个大的保险供应商，开发新的应用程序以支持其中一条业务线。在该公司中业务和 IT 支持之间的结合相当的好，且严密关注通过 IT 传递到业务的价值。</p>
		<p>此情境中的项目扩展了两个索赔处理系统，以便两个系统可以提供将要启动策略集成并使公司收回一个系统并将所有索赔处理系统移到一个单个的系统中的面向服务的接口。</p>
		<p>业务人员希望服务能够支持一些现有的业务过程，但他们清楚地知道这些过程随时变化，所以将服务与过程结合是不切实际的。作为回应，该业务领域的软件架构师相信更加适合的方法可能会集中于过程中的业务工件，主要是索赔本身。除了这些，他们已经在 IBM IAA 中投了资，<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>12</sup></font></a>这为工件提供了定义良好的且标准的模型，如索赔。</p>
		<p>在这点上，对于主要工件的实际数据模型已经由 IAA 指定，所以主要的工作是理解在当前系统中使用这些工件的方式及围绕着不同的实现如何开发新的外观。</p>
		<p>
				<a name="N102D0">
						<span class="smalltitle">活动</span>
				</a>
		</p>
		<p>业务分析人员开始编制需求，还利用业务过程模型来描述系统的功能需求。非功能需求在需求数据库中进行描述，依附于业务过程模型中的任务或项。过程模型是为两个当前系统和两者的交集开发的。</p>
		<p>软件架构师拿到了这些模型和需求并与业务分析人员一起开发集中于两个系统间一般工件的流程的更具体的过程。软件架构师还与业务分析人员一起理解当前系统的数据需求及它们到 IAA 数据模型的关系。</p>
		<p>数据架构师与软件架构师一起描绘出针对新的过程中工件的逻辑和物理表示的方案。</p>
		<p>软件架构师开发了一个将过程活动划分成一组服务操作的候选服务模型。该模型还包括每个服务的消息需求及这些消息到下面的数据模型的关联。 </p>
		<p>软件架构师与集成专家一起（不是通常的 RUP 角色，但对应该角色的描述是为 RUP 设计的）定义从候选模型到当前实现所需的映射（在它们存在的地方）。这些映射将在所选的中间件中实现，但不应该像引入主要性能问题那样麻烦。</p>
		<p>
				<a name="N102E7">
						<span class="smalltitle">2. 以服务为中心的设计</span>
				</a>
		</p>
		<p>在此方法中，设计人员牵扯到展示（作为服务或一组服务）预期的业务或应用程序的功能。在此种情况下，我们不必要知道服务的客户会选择什么来利用服务，但我们知道此种客户期望的交互类型。因此，与第一个情境相反，消息是次要，并且被作为对操作的需求响应被开发。</p>
		<p>该方法的实例是由 Amazon 和 eBay 表现的 Web 服务 API（Web Services APIs presented by Amazon，AWS）<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>13</sup></font></a>。此服务接口没有将业务过程强加于客户，一般地，它们甚至没有将所期望的接口强加于客户，但它们使第三方开发人员以清晰直观的方式接触到了各自的服务供应商的操作。</p>
		<p>如前面所提到的，以服务为中心的建模通过了解参与者的需求（服务的外部客户）并提供支持那些需求的操作（浏览目录、向购物车中添加物品、付账等）有助于用例驱动的方法。</p>
		<p>成为次要关注的消息的问题在 Amazon API 中是明显的，在 Amazon API 中肯定能够将普通的方案定义从当前设计中分析出来，这证明消息是为每个操作请求和响应而分别开发的。</p>
		<p>
				<a name="N10302">
						<span class="smalltitle">情境</span>
				</a>
		</p>
		<p>此处我们的实例是一个为化学加工行业提供零件的在线供应商。商家可以提供一个 Web 门户，客户可以通过该门户购买零件，商家还可以通过电话和传真管理进一步的业务。但需要为客户提供通过比 Web 本身更程序化的方法对购买门户进行的访问。这种对核心订购功能的访问使公司成为客户供应链中的关键要素，一个可以直接与客户核心业务应用程序集成的要素。商家试图实现 EDI 购买解决方案，但初始部署的成本和必要的基础结构证实是不可行的的。执行团队相信许多客户正在向其他的能够提供此种购买门户的供应商转移，因为这些竞争者已经能够通过更自动化的过程更好地集成。</p>
		<p>与我们的第一个情境比较，此项目由 IT 组织推动。以一个商家的观点，项目目标是简单地提供一个机制来执行同样的订购操作，不需要让客户花时间将数据输入到 Web 门户或者商家输入来自传真订购清单的类似数据。IT 组织被允许独立做出许多决定，只要能够生成比前一个 EDI 尝试花费少的解决方案。</p>
		<p>两个重要的影响设计的观察已经由 IT 组织的高级团队做出来了。</p>
		<ol>
				<li>提供的功能必须不得少于通过 Web 或人工订购提供的当前功能。<br /><br /></li>
				<li>操作集不是由<i>我们的</i>业务过程所推动，而是由客户所使用的，作为<i>他们</i>过程的一部分。针对该原因，我们必须假设关于这些操作使用的可能性越少越好。 </li>
		</ol>
		<p>软件架构师生成了一组描述客户所期望的功能的用例文档，并且确保业务团队同意。然后用例被断成一组离散的操作，且数据需求（消息）被指定。这些操作集合成一组三个用于搜索、订购和账户管理的服务。此步骤倾向于受到经验和判断的影响比受到精确的规格影响要多，因而此步骤是迭代的。</p>
		<p>一旦知道了服务和操作集，团队就可以更加正式地定义服务规范，包括针对每个接口的协议和服务客户所需要的任意策略信息。该步骤非常的重要：它向客户提供了在服务可用时，不能够通过简单地阅读由商家部署的 WSDL 就能够被理解的信息。</p>
		<p>
				<a name="N1032C">
						<span class="smalltitle">活动</span>
				</a>
		</p>
		<p>
				<i>业务执行者</i>（不是当前的 RUP 角色，但似乎我们都承认他们）传达了这样一个需要，就是当客户感觉他们的收入正在被当前提供这些功能的更大的供应商抢走时，必须向客户提供可编程访问<i>业务</i>服务的能力。</p>
		<p>软件架构师打算开发一组提供 Web 订购系统的核心功能的服务。提议包括一组用例，描述了客户通过 Web 执行的活动（与来自在线业务的业务分析人员一起开发）。同时也包含了初始阶段的模型，这个模型展示了对于当前后端系统的候选服务和他们之间的关系。</p>
		<p>软件架构师，赞成该项目，迭代候选服务模型以在后端应用程序分区（公然地展示所需的业务功能以支持服务）中识别服务。同时，软件架构师让设计人员观察当前的 Web 应用程序及如何与后端系统交互，挖掘出要由服务实现的任何所需的业务逻辑和需求。</p>
		<p>软件架构师和业务分析人员一致同意把所需的功能集作为服务执行的操作和任意所需的约束或策略来提供。此模型的迭代显示了三个具体的服务和初始服务规范，尽管在过程的这一点上这些只指定了服务的结构方面。</p>
		<p>软件架构师与 Web 应用程序团队的开发人员一起了解对于已识别的操作集的具体数据需求。这被交给了具有 XML 技术的数据架构师，来开发将会生成由操作销毁和生成的消息方案的消息模型。</p>
		<p>设计人员可以开始连接服务模型和将用来描述提供业务逻辑的组件的实现模型（J2EE）并连接到现有的后端应用程序。</p>
		<p>软件架构师和设计人员最终用细节根据服务规范细化了服务模型，主要提供可以使客户了解如何与服务交互的协议和策略细节。</p>
		<p>我们现在有一组完整的模型：</p>
		<ul>
				<li>描述客户期望的用例模型<br /><br /></li>
				<li>描述客户视角（服务规范）和供应商视角（服务、分区等）的服务模型<br /><br /></li>
				<li>描述实现服务规范的软件组件的实现模型 </li>
		</ul>
		<p>现在开发人员能够实现准备由客户使用的试验系统。</p>
		<p>
				<a name="N10369">
						<span class="smalltitle">继续的行动</span>
				</a>
		</p>
		<p>在成功部署试验工程之后，要注意的是，向客户提供的服务涉及 Web 系统特定功能的并行实现。建议建立新的工程来重新配置 Web 应用程序以复用这些服务，这项工作应该包含于 Web 应用程序的常规计划更新中。这样的重配置将某些业务逻辑从 Web 应用程序中移到服务中，因而一个单独的组件集合由基于 Web 和服务的客户使用。</p>
		<p>为了满足 Web 应用程序团队对性能的关注，除了向合伙人提供的 SOAP/HTTP 绑定之外，服务还需要被重配置，以在 Web 应用程序中访问服务时，服务能够提供更有效的 Java 绑定，。</p>
		<p>
				<a name="N10377">
						<span class="smalltitle">3. 以协作为中心的设计</span>
				</a>
		</p>
		<p>在协作为中心的方法中，重点是两个或多个服务的协作，这是服务的过程视角，它与传统业务建模的相关性要比与软件开发活动的相关性更大。在此方法中，服务作为协作中的实现角色，因此服务规范成为为跨一个或多个协作的角色而定义的责任。</p>
		<p>这样一种方法将对那些涉及到 RosettaNet Partner Interchange Processes（PIPs）的开发和 OAGIS<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>14</sup></font></a>标准的开发中的人是可识别的（然而，在这些情况下协作远不完全）。这样的方法在业务中对于业务过程设计或在业务集成活动（在活动中 IT 系统的组件作为服务出现）中而言是普遍的。</p>
		<p>通常在这样的情境中，服务规范可能直接源自协作，而该方法倾向于较少关注于导致需要实现完整性的混合方法的消息内容。</p>
		<p>
				<a name="N1038F">
						<span class="smalltitle">情境</span>
				</a>
		</p>
		<p>此情境涉及一个已经决定通过收购而继续扩充策略的中型银行企业，这意味着对于该企业来说，IT 不只是一个必须拥有的部分，而且还是在吸收所收购操作过程中发挥竞争优势的业务的一部分。</p>
		<p>银行已经开发了一个领先的得到谨慎管理的组合，以确保成本和功能的效率。然而，很清楚的是某些技术和文化方面的阻碍出现在视线中，在整个企业中提供应用程序的一般集合。由于这些阻碍，公司已经决定使用服务方法来提供它们的 IT 功能并以此式样开发所有的新功能。企业已经经过多年开发了一套以过程为中心的东西。这些很好理解，一般的过程使它们有效地集成所收购的企业并指导他们的 IT组织来支持这些过程。</p>
		<p>在我们的情境中，银行将一个遗留应用程序引入了服务组合中，这给我们提供了一个机会来观察帐户统一的过程模型，即一个令企业帮助客户有效利用帐户的业务服务。此过程模型已经由许多“黑盒子”活动设计而成，意味着一个活动通常由一个没有作为服务组合的一部分而启动的系统执行或者以还没有细化的方式执行。模型将这些活动表示为“黑盒子”并不提供更多的细节。团队已经注意到特定的遗留应用程序系统参与了帐户统一过程的三个活动，且其他过程模型的分析揭示了使用同一应用程序的两个其他的过程。</p>
		<p>在企业所依靠的方法中，过程模型是分析和需求收集的主要工件。过程本身表现出通过 IT 和相应的人员，业务功能需求的完全体现，附属的且正式定义的文档描述了非功能的需求。在配置管理之下这些过程模型得到了小心的维护，并且为每个操作过程而发布，这样它们不仅指导过程的开发还为过程中的银行职员培训提供了材料。</p>
		<p>早期提及的服务组合是一个 RAS<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>15</sup></font></a>存储库，其考虑了基于由每个资产中的 RAS 名单所定义的标准的搜索。资产是所部署的服务，而名单包含了描述服务的核心组合及描述业务信息（如所有权、策略等等）的范围。</p>
		<p>在开发服务以提供遗留应用程序的功能过程中，包含了业务和 IT 代表的团队致力于作为业务过程实现的服务之间的协作。该方法使业务端将结果看成是传统的业务过程模型，而 IT 端将同样的模型看成是服务之间的协作。</p>
		<p>
				<a name="N103B0">
						<span class="smalltitle">活动</span>
				</a>
		</p>
		<p>业务分析人员要么创建新的业务过程模型，要么更新现有的业务过程模型。此模型是按照商家所展望描述的新过程，该过程更新还包括由过程活动管理、消除或产生的业务文档定义。软件架构师创建了差距分析文档，这个文档对新业务过程的需求和现有服务组合进行了比较。</p>
		<p>业务分析人员将关键性能指示器（Key Performance Indicators，KPI)<a href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#notes"><font color="#996699"><sup>16</sup></font></a>定义为业务过程本身的一部分。这暗示着参与过程的服务必须支持可以查询的用来确保与 KPI 的一致性的度量。</p>
		<p>数据架构师改进来自业务过程模型的消息定义，确保与现有方案的通用性，然后开发可以用于生成服务所需的 XML 方案的消息模型。</p>
		<p>软件架构师用新的服务或向现有服务中添加新的规范来更新服务模型。数据架构师开发的消息模型用于（或复用于）这些服务规范。</p>
		<p>软件架构师和业务分析人员更新早期定义的过程模型以将活动映射到新的或更新的服务上。对于服务更新，模型是完整的了，现在就可以对其进行转换并发布。</p>
		<p>软件架构师和设计人员开发了包含协议和策略信息的具体服务规范。这样一个具体的规范作为供应商和客户之间的合约，不能由任何一方打破。</p>
		<p>开发人员创建针对遗留应用程序的适配器和/或变换，用来实现具体的规范。</p>
		<p>开发人员必须开发用于监控的度量生成器。这些通常是具体的操作，需要监控基础结构来查询对应一般状态和度量状态的服务。</p>
		<p>集成专家使用新的服务来更新过程的编排 —— 在此种情况下，业务过程被转化为编排语言，业务过程执行语言（Business Process Execution Language，BPEL）。在某些情况下，在部署之前还要用一些额外的信息更新生成的编排。</p>
		<p>业务分析人员用业务 KPI 定义和它们到具体度量的关系来更新监控中间件，以便可以监控新的服务。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/sep05/johnston/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N103DD">
						<span class="atitle">
								<font face="Arial" size="4">接下来的步骤</font>
						</span>
				</a>
		</p>
		<p>IBM Rational 团队已经与许多客户一起工作，并在IBM 的内部项目中展示并使用了 RUP 和 RSM/RSA 插件。我们已经收到足够的反馈信息，通过这些信息我们得知尽管我们还有许多事情要做的，但我们已经建立了良好坚实的基础。现在我们正致力于一组具体的工程，其设计用来延伸我们所做的工作，并且了解我们可以在哪里添加更多内容，特别是在用于建模工具和额外的 RUP 指导主题的策略规范的领域。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 03:58 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOA 探索，第 1 部分: 通过动态解耦来简化 Web 服务调用-----执行稳定的 Web 服务调用的解决方案</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5713.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 19:56:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5713.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5713.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5713.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5713.html</trackback:ping><description><![CDATA[
		<blockquote>学习如何使用应用动态代理模式（Dynamic Proxy Patterns）来进行动态解耦的 Web 服务适配器（Web Service Adapters）。通过适当地使用这种机制，您可以提供所需要的抽象级别，这样有助于适当的面向服务的体系结构（Service-Oriented Architecture，SOA）的实现与服务重用。</blockquote>
		<p>
				<a name="IDANCCOB">
						<span class="atitle">
								<font face="Arial" size="4">引言</font>
						</span>
				</a>
		</p>
		<p>理想的基于面向服务的体系结构系统设计的需求是在服务消费者与服务提供者之间进行解耦。解耦可采用多种形式，其范围从静态（在编译时通过请求端存根来解耦）到全动态解耦（在所有服务调用的运行时完全封装并建立解耦）。显然，全动态解耦是一个严格的要求。如果一个服务被动态解耦，然后服务特性中的更改导致了服务实现中的修正，但是所有其它的系统元素，特别是调用机制，仍旧保持不变。这种设计的优点显而易见。</p>
		<p>对于 SOA 与 Web 服务的更强大功能与性能的日益增长的期望与需求经常导致显著增长的软件复杂性。今天，SOA 实现的实际情况是，尽管规划了服务的功能模块化，但是它们仍旧经常与独立的中间件或通信协议（如基于 MOM 的 JMS、HTTP/SOAP 等等）耦合。在大多数组织中，当应用程序扩展功能时，开发者关注的，在某种程度上，是静态解耦（通常是指<i>绑定</i>），并强制为每一个 Web 服务创建独立的客户端，而不是单独的能够同时访问多个服务的客户端。</p>
		<p>静态绑定的局限性是非常明显的——代码中的静态绑定阻止了不同应用程序中贯穿整个企业的服务的重用。简而言之，即使需要提取并封装所用的不同中间件及协议来执行服务组件之间的交互，这些组件被包括在服务消费者与服务提供者的交互中，这样的需求非常普遍，但是封装了 Web 服务接口的体系结构还未得到广泛应用。造成这种状态的其中一个主要原因就在于，尽管动态绑定的几种机制已被设计用来适应这种局限性，但是对动态绑定相关联的实际技术依然存在很多的误解。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-adventure1/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="IDAYCCOB">
						<span class="atitle">
								<font face="Arial" size="4">Web 服务调用的剖析</font>
						</span>
				</a>
		</p>
		<p>已经有许多关于 SOA 最重要的概念——服务接口（换句话说，调用功能）及在运行时如何定位并调用它们的文章。换句话说， Web 服务调用应该在后期绑定。需要指明的是 Web 服务调用已经被设计为传统的 Remote Procedure Call（RPC）方法，该方法准许一个应用程序调用由第二个应用程序发布的功能。RPC 工作方式如下（如<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-adventure1/#figure1"><font color="#996699">图 1</font></a> 所示）： </p>
		<ul>
				<li>被调用的应用程序的功能是以<i>本地</i>功能的形式展示给调用的应用程序的。 
</li>
				<li>通过向调用的应用程序提供功能存根达到定位透明性。 
</li>
				<li>功能存根，当它被调用时，访问一个中间件层，该层向被调用的应用程序传输调用及其相关的数据。 </li>
		</ul>
		<br />
		<a name="figure1">
				<b>图 1. 基于 RPC 的 Web 服务调用 </b>
		</a>
		<br />
		<img height="306" alt="基于 RPC 的 Web 服务器调用" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-adventure1/figure1.gif" width="433" />
		<br />
		<p>在 Web 服务中，存根代码通常是自动产生的，并且是基于使用被调用的功能的接口描述，它通过 Web 服务描述语言（Web Services Description Language，WSDL）来表示，并创建了存根 shell。此外，存根通常是在应用程序开发的编码阶段产生，因为存根是主要是从应用程序代码中直接调用，而且，结果是必须在编译时解决的（换句话说，即所谓的前期绑定）。 </p>
		<p>大多数应用程序开发者，主要是 Java 开发者，认为使用这样的存根是必要的，因为对他们来说，如何处理从调用服务返回的复杂数据类型是不清楚的。当然，来自被调用应用程序功能的数据必须同 SOAP 消息相分离，而且，当使用 Java 的时候，必须有一个相对应的（兼容的）实现序列化接口的类。显然，同样的存根产生工具被用于产生那些所需求的类。 </p>
		<p>本文的首要思想就是，一般来说，通常自动化是双刃剑。一方面，自动化准许行业内 Web 服务的快速适应，其原因是，有了自动化工具，大多数应用程序开发者的行为不再发生在 WSDL 自身的级别上。另一方面，不幸的是，市场仍需要一种主要的工具来选择需要使用的调用形式——<i>显式的存根</i>（存根在编译时解析）或<i>隐式的存根</i>（存根在运行时解析）。隐式的存根通常被当成 Web 服务的<i>无存根</i>调用。 </p>
		<p>大多数基于 Java 的 Web 服务工具提供了一些 Web 服务接口的运行时后期绑定功能。来自 webMethods 的 Glue 产品与 J2EE Web Services Developer 组件的 JAX-RPC 包就是两个例子。然而，这些尝试大多导致了软件深受供应商特定逻辑的影响。而且，问题并不仅仅存在于供应商指定的代码。在许多情况下，供应商专有的解决方案产生了实际的可管理性与可维护性的问题。 </p>
		<p>现在让我们回顾提到的问题点，例如用于后期绑定的 webMethods Glue 方式。目前，Glue 是广泛使用的工具。由于使用了一个代理用于 Web 服务的接口，Glue 看起来好象是无所不能。然而，仅仅通过自身使用一个代理并不能消除所有的问题。下面的 Java 代码片断描述了在它们的应用中的一个典型的负面情形： </p>
		<br />
		<a name="IDAGECOB">
				<b>清单 1. lateBindingGlue</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">public class lateBindingGlue 
{ 
public Document serviceInvocationGlue() 
throws Throwable { 
String wsdlName = "http://…../Service.wsdl?WSDL"; 
String operation = "…….."; 
String args[] = {  }; 
/* first, Glue creates a SOAP interceptor */ 
SOAPInterceptor responseHandler = new SOAPInterceptor(); 
/* second, Glue registers the SOAP interceptor to catch incoming responses */ 
ApplicationContext.addInboundSoapResponseInterceptor( 
(ISOAPInterceptor)responseHandler ); 
try { 
/* third, Glue gets a proxy to the Web service through its WSDL */ 
IProxy proxy = Registry.bind( wsdlName ); 
/* here, service's operation is invoked through a proxy */ 
proxy.invoke( operation, args ); 
} catch( java.rmi.UnmarshalException e ) { 
// Glue is catching the UnmarshalException that is perfectly expected 
} 
/* forth, Glue generates an XML document containing the SOAP body, */
/* and passes the whole document for parsing  */ 
 return new Document( responseHandler.getResponse() ); 
} 
} 
class SOAPInterceptor implements ISOAPInterceptor { 
private Element soapBody; 
public void intercept( SOAPMessage message, 
Context messageContext ) { 
try { 
soapBody = message.getBody(); 
} 
catch( Exception e ){ 
 System.err.println( e.toString()); 
} 
} 
public Element getResponse(){ 
 return soapBody; 
} 
} 

       
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>您能从上面的例子中学到很多东西。首先，由 Glue 引入的代码是一个两层代码。一层“消除”了 SOAP 分离的负面效应，通过使用 Java 异常处理程序和一个专门的组件——SOAP 拦截器来拦截这种特定的应用程序异常而实现。第二层将服务调用的结果作为完整的 XML 文档来提交给调用应用程序。然后，XML 文档通过使用一个诸如 DOM 结构的工具进行分离。显然，这样的方法不能“安全地”移植到其它 Web 服务工具中。但更重要的是，尽管拦截应用程序异常的技术广为人知，但它真的适合于 Web 服务调用吗？ </p>
		<p>一般而言，异常是 Java 语言极为有用的特性，特别是，这意味着一种检测错误位置、无计划的编程操作（如使用空指针）的简单方式。使用这种技术作为一个计划的控制操作，而不是写一个 <i>if-then</i> 逻辑段来测试一个指针是否真正为空，使代码的可管理性与可维护性显著地复杂化。显然，SOAP 分离并不同于空指针。您不能通过一个简单的 <i>if-then</i> 代码测试出来。不过，它们的负面影响是相同的——抛出异常并捕获它，这是一项代价非常高昂的技术，特别是如果您需要获得每秒数千次的 Web 服务调用的话。换句话说，运行时异常应该专门针对意外情况作为“防御线”而保留，以应对软件的错误。 </p>
		<p>我进一步指出为什么分离 SOAP 的问题不能通过一个 Java Exception API 进行处理的更多原因。但是，让我们先来看看引用的范例所显现的另外一个问题。由于调用操作需要直接分析 XML，它不得不访问响应信息的 XSD 定义，而且必须依次成为提供的 WSDL 文件的一部分（且被存根产生工具所使用）。这里的最终结果就是甚至一些后期绑定的形式也存在于引例之中；在 Web 服务伙伴之间的<i>紧耦合</i>依旧存在。换句话说，Web 服务的客户端必须访问 WSDL 文件，并且在大多数情况下，它必须是一个完整（而不是部分）的 WSDL 文件。 </p>
		<p>还存在一个与使用 JAX-RPC API 相关的问题。记住这是非常必要的：在 Java 语言中，由于在 XML schema 中的数据类型不能直接准确地映射到 Java 语言的数据类型当中，所以在调用的应用程序端 WSDL 中产生的服务终端接口将与 JAX-RPC 编译器在调用端产生的 WSDL 的形式不同。而且，生成的服务接口也将依赖于 SOAP 采用的编码体制。例如，使用文档文字编码利用了每个方法类的<i>封装版本</i>，并造成了额外的可管理性与可维护性的问题。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-adventure1/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="IDA1ECOB">
						<span class="atitle">
								<font face="Arial" size="4">Web 服务编程构件的自由应用程序逻辑：最佳实践设计模式 </font>
						</span>
				</a>
		</p>
		<p>根据到目前为止的讲述，您容易想到使用任何种类的动态调用技术（如后期绑定的动态代理），不幸的是，许多开发者都是这样做的。关于 Web 服务其中一个最常见的误解就是，使用动态调用取代静态存根的好处并没有那么大，而且最好是坚持用生成的存根作为 Web 服务调用的主要方法。 </p>
		<p>最后，我们的讨论转到第二个，而且是最重要的原则——它不是真正的编程技术，它确保不依赖服务编程构件（如 WSDL），但是取而代之的是，它的价值体现在高级设计中。这对于获得 SOA 的真正利益是必要的，因为随着服务的发展，服务消费者的代码将完全不受影响。无论如何，基于 SOA 的应用程序必须注重于提供弹性体系结构，且更少的关注于公共通信协议（比如 SOAP）。服务与应用之间不应该具有严格的界限。一个终端用户的应用程序可以被看作是其它终端用户的服务。整个企业 IT 环境应该被设计成高度模块化，允许开发者能够挑选适合他们需要的服务与应用组合。 </p>
		<p>在良好的 SOA 设计中，Web 服务消费者的应用逻辑能够使用两个基础体系结构原则来从服务构件完全解耦： </p>
		<ul>
				<li>“保持可适应性”——创建一种方法来支持多接口继承（理论上，这将不受限制），在开发有限数量的具体实现（在面向对象的设计当中，经常将匿名的内部类作为对象适配器使用，考虑上下文，允许工作行为的定制，实际上是嵌入在子类之中）。 
</li>
				<li>“使用所谓的好莱坞原则：不要调用我们，我们将调用您”——Web 服务调用模型应该只通过动态代理框架来指定发现，并假定客户端事先对服务一无所知；因此，Web 服务提供方应该能够通过将存根类信息声明到 XML 文档，从而在运行时宣传他们的服务。那实际上就以一种开放且可执行的方式，提供了发现之外的另一种调用方法（换句话说，优于 UDDI）。</li>
		</ul>
		<p>最终设计目标是，为 Web 服务消费者应用提供一组类，这些类根据上面引述的原则组成了可重用适配器层。这种适配器层封装了使用存根及其生成的类的代码。适配器的公共 API 并不公开任何存根类；而是将其映射到 Web 服务消费者应用可以理解的类。 </p>
		<p>为了得到最好的适配器灵活性与可扩展性，适配器的总体类结构均通过使用下列设计模式的组合来构建： </p>
		<ul>
				<li>
						<b>动态代理</b>是一种结构模式，它定义了一组类与方法调用，这些类和调用被分派给调用句柄（在动态代理类生成的时候指定）。使用动态代理是 Java 编程中模拟多实现继承的关键。通过动态代理，定制的 InvocationHandler 能够由一组表示合成子类的超类来构建；该子类的接口将是这些超类实现的接口的联合。 
</li>
				<li>
						<b>适配器</b>是一种结构模式，它通过对实现的抽象进行解耦来影响类层次（比如继承层次）的创建，因此两者可以单独改变。这种允许在运行时选择实现的解耦避免了抽象与其实现间的永久绑定。作为 Web 服务客户端的调用应用的类仅处理抽象。 
</li>
				<li>
						<b>服务配置器</b>是一种行为模式，它使您可以改变适配器超时性能，并添加或去除附加功能，这样就改变了调用框架的规范。例如，如果一个 Web 服务提供方引入了一个新的协议（如在 RMI 上的 SOAP），那么它只需要“宣传”新的传输性能。因此，适配器演示了这种新服务能力与这种调用功能的任何实现。使用一些元数据表示作为结果，必须具备一种方法能够引用提供了独立于特定规范与实现的功能类的接口。 
</li>
				<li>
						<b>工厂方法（Factory Method ）</b>是一种结构模式，它使一个类延迟实例化到子类。在 Web 服务调用的情况下，本地与远程实现类都必须是子类，以实现它们的特定于服务的实现。需要访问服务的调用应用将得到这个工厂的一个句柄，并给服务一个调用。因此，根据从服务配置器得来的信息，工厂封装了访问服务必须使用的实现知识。 
</li>
				<li>
						<b>装饰（Decorator）模式</b>是一种结构模式，它定义了缓存、发布与交换服务声明的封装器，用于连接合适服务与可重用的代理类。 通过使用装饰模式，实现执行调用的代码与提供缓存的代码相分离，将非常简单。</li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-adventure1/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="IDAYFCOB">
						<span class="atitle">
								<font face="Arial" size="4">关键实现指南</font>
						</span>
				</a>
		</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-adventure1/#figure2">
						<font color="#996699">图 2</font>
				</a> 演示了使用上面引用的设计原则而设计的“好莱坞”类型适配器的概念模型。 <a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-adventure1/#figure3"><font color="#996699">图 3</font></a> 展示了使用适配器时的基本交互的序列图。 </p>
		<br />
		<a name="figure2">
				<b>图 2. Web 服务适配器的概念模型</b>
		</a>
		<br />
		<img height="291" alt="Web 服务适配器的概念模型" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-adventure1/figure2.gif" width="545" />
		<br />
		<br />
		<a name="figure3">
				<b>图 3. 包含 Web 服务适配器的序列图</b>
		</a>
		<br />
		<img height="552" alt="包括 Web 服务适配器的序列图" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-adventure1/figure3.gif" width="537" />
		<br />
		<p>创建一个使用适配器的服务，包括创建一个使用服务描述符（代表 SOAP 服务）的服务类。这个描述符被包括在服务类成员之中。服务类被作为 SOAP 来部署，例如，使用来自 Open Source Foundation 的 Axis。 </p>
		<p>服务描述符包括： </p>
		<ul>
				<li>类名：包含服务实现的全限定类名的元素。 
</li>
				<li>名称：包含服务名的元素。 
</li>
				<li>版本：包含服务版本名的元素。 
</li>
				<li>创建者：包含服务创建者名称的元素。 
</li>
				<li>AssertURI：包含指向一个 XML 文件的统一资源标识符（URI）的元素。其中，XML 文件包括服务声明（规范）。 
</li>
				<li>描述：包含服务描述的元素。</li>
		</ul>
		<p>现在，有一个关于 Axis 的耦合注意事项。使用 Axis 作为 SOAP 引擎非常有助于实现 Web 服务的松耦合，理由如下： </p>
		<ol>
				<li>因为 Axis 定义了消息处理节点，该节点能够被封装以供服务请求者（客户端）与服务提供者（服务器）使用，适配器能够使用部署描述符作为一个 Web 服务部署描述符（WSDD），应用一个消息处理节点来部署 SOAP 服务。 
</li>
				<li>Axis 中的服务通常是 SOAP 服务的实例，它包含请求与响应链，但是必须包含实际服务类的提供方。结果是，通过将消息上下文传递给消息处理节点来完成 SOAP 服务的处理。 
</li>
				<li>Axis 客户端处理能够通过使用服务描述符和 XML 声明文件创建包含服务细节的调用工厂实例，从而构建调用对象。调用对象的属性被设定为使用相关的目标服务。然后，调用对象就通过调用 Service.createCall 工厂方法来创建。一旦建立起调用，<code>Call.SetOperation</code> 就通过被调用的方法名称来指定。然后，<code>Call.invoke</code> 通过相关的请求消息而被调用，它驱动 <code>AxisClient.invoke</code>，处理结果消息上下文，并向客户端返回响应消息。 </li>
		</ol>
		<p>在适配器的设计中，应该对性能进行特殊考虑。使用动态代理类具有性能含义。访问目标的直接方法快于访问代理类的方法。然而，这不应是在稳健体系结构与性能之间进行选择。这就是为什么目前适配器实现缓存封装器的原因。通过应用缓存，使用静态存根与基于适配器的解决方案之间的差异相对较小。根据如何实现缓存，必须提到可能的解决方案之一——记忆（Memoization）。 记忆是一种广泛使用的技术，它在 Lisp、Python 与 Perl 这样的功能编程语言中使用，给功能赋予预先计算的值。记忆一个功能将为功能添加一个透明的缓存封装，因此已经得到的值将从缓存中返回而不是每次都重建。记忆可以显著提高动态代理调用的性能。 </p>
		<p>总结我们关于此处描述的适配器的讨论，允许支持本地和远程服务实现的设计是非常重要的。服务类对适配器来说将是本地的，而远程 Web 服务则可以相互替换，因为服务类和代理类使用同样的接口来访问远程 Web 服务。本地服务类将实现与 Web 服务器远程实现相类似的方法 <code>getFunction()</code> 来返回功能的结果。下面的 Java 代码片断进一步说明了这一点： </p>
		<br />
		<a name="IDAIAMOB">
				<b>清单 2. 本地服务类及其接口</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">public class LocalServiceImpl implements IService
{
/* get the service results */
public ….. getFunction() 
{
………..
return …………;
}
}

</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>实现了 IService 的代理类采用了方法 <code>getFunction()</code>，但并未考虑该方法需要访问远程 Web 服务的代码。这些代码代表了需要用来访问部署在适配器内的任意 Web 服务的代理代码。 </p>
		<br />
		<a name="IDAXAMOB">
				<b>清单 3. 远程服务</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">public class RemoteServiceImpl implements IService 
{
/* get the service outputs */
/* outputs are from the web service running in the location */
/* mentioned in the serviceURI */

public ….. getFunction()
{
adapter.examples.Function service = null;
String serviceURI = "http://……../Function/";
String wsdlURI = "http://localhost:8080/Function/";
Try
{
// init the lookup
WebServiceLookup lookup = (WebServiceLookup)
……….
// get the instance of the Web services interface
// from the lookup
service = (adapter.examples.Function)
lookup.lookup(wsdlURI,
adapter.examples.Function.class,
serviceURI);
}
catch (Exception e) 
{
e.printStackTrace();
}
// now, call the methods on your Web services interface
return service.getFunction();
}


</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<font face="Lucida Console" size="2">
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<font face="Lucida Console" size="2">
																				<br />
																		</font>
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-adventure1/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="IDA3AMOB">
						<span class="atitle">
								<font face="Arial" size="4">结束语</font>
						</span>
				</a>
		</p>
		<p>显然，使用 Web 服务的静态存根与前期绑定是 Web 服务调用的最简单的形式。但是简单化也带来了明显的缺点。与紧耦合方法不同，使用本文提出的适配器方法将给您留下可高度重用和可配置的 Web 服务代码。由于 Web 服务 调用全部通过部署了服务描述符的公共适配器来引导，因此您能够动态地决定调用什么服务——在部署代码时或在运行时。 </p>
		<p>同样，那些可能寻找商业产品作为 Web 服务松耦合调用定制解决方案的组织应该研究企业服务总线（Enterprise Service Bus，ESB）技术（参见<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-adventure1/#resources"><font color="#996699">参考资料</font></a>），该技术提供了类似于上面所引述的功能的选项来连接企业内部及跨企业的可作为 Web 服务的应用程序，并具备一套功能来管理并监视已连接应用之间的交互。 </p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 03:56 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于 SOA 构建网格应用程序-----SOA 幕后的概念，以及如何将网格应用程序迁移到 SOA 模型</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5712.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 19:54:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5712.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5712.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5712.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5712.html</trackback:ping><description><![CDATA[
		<blockquote>网格和面向服务架构（SOA）是两个似乎相互冲突的系统。SOA 是构建离散服务的标准，它可能要跨越多台机器，这些机器可以进行合并以构建一个应用程序，从而降低集成成本。大部分现代网格都采用了类似于 SOA 的 Web 服务，但是在这两个系统之间实际上有更多东西可以进行合并，而不仅仅是采用几个 Web 服务。您还必须调整网格解决方案的体系结构。本文将简要介绍 SOA 幕后的一些概念，以及在将网格应用程序迁移到 SOA 模型时应该考虑的问题。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N10049">
						<span class="atitle">
								<font face="Arial" size="4">迁移到 SOA 和网格</font>
						</span>
				</a>
		</p>
		<p>网格应用程序的一个永恒的问题是，使其足够灵活，以在各种平台和环境中使用。尽管早期的网格使用了专用的解决方案，其中采用的是严格受控的硬件和环境，但是最近的发展已经清楚地表明，将网格应用程序放到更为广泛的平台上运行，这样您只需要添加一些机器就可以很容易地扩展网格的范围和处理能力。</p>
		<p>然而，平台之间微小的差异可能会导致非常令人头疼的事情。例如，Windows® 不同版本之间的改变，甚至是 Windows NT 和 Windows 2000 之间的差异，也都会导致那些网格环境中通常经过严格设计和优化了的应用程序出现问题。一个显然的解决方案是去掉那些高度与平台相关的元素，并切换到一个更加通用的环境中。</p>
		<p>SOA 幕后的准则遵守一些基本的规则。SOA 是一个用来构建应用程序的基于组件的模型，可以将应用程序划分为很多离散的服务，这些服务各自执行某个特定的功能，但是可以将它们组合在一起构成更大的应用程序。</p>
		<p>SOA 的基本原理现在已经并不新鲜了。面向对象的概念已经出现了很多年，分布式对象也已经在很多技术中存在很多年了，例如 CORBA。主要的区别在于，SOA 是基于面向对象和 Web 服务两个概念的组合，并在一个用来描述可用接口的开放系统中采用了这种结构。通过使得 Web 服务可以更容易发现和识别，SOA 可以极大地简化基于 SOA 应用程序的部署和分布。由于 Web 服务都是基于开放标准的，在其定义中就保证了体系结构和平台的无关性，因此基于 SOA 的应用程序可以部署到各种平台上。</p>
		<p>简而言之，SOA 是一种对外提供服务的方法，让计算机可以彼此进行交谈，并共享自己的处理能力和功能。网格正在慢慢地朝 Web 服务架构发展，首先是 Globus 采用开放网格标准基础设施（OGSI），然后是发布 Globus Toolkit 4.0（GT4）。SOA 和网格技术正基于诸如 Web Services Resource Framework（WSRF）以及其他的一些解决方案，朝 Web Standards Interoperability 技术方向发展。</p>
		<p>您还可以看到 SOA 和网格都可以为对方提供很多东西。这并不是网格技术利用 SOA 准则的情况，或者反之。从 SOA 的观点来说，网格为信息和资源的分布提供了一个异常模型，这是 SOA 模型的一个关键特性。从网格的观点来看，SOA 为调整网格解决方案的架构以及促进其透明性和更好地支持广泛的平台和环境，提供了一些可选的而又非常灵活的方法。</p>
		<p>下面让我们来了解一下传统的网格模型，然后介绍一下基于 SOA 的网格模型，从而比较二者之间的区别，以及如何开始将网格和 SOA 应用程序作为一个单一的资源进行考虑。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-soa/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10065">
						<span class="atitle">
								<font face="Arial" size="4">传统的网格模型</font>
						</span>
				</a>
		</p>
		<p>为了全面地理解 SOA 如何才能改进网格服务，以及需要如何修改应用程序，下面让我们来看一个基于传统的网格技术的典型网格服务，包括基本的 Web 服务。这个服务的基本结构非常简单。</p>
		<p>在图 1 中您可以看到一个典型的网格环境的结构图。其中我故意没有说明网格软件的类型，因为大部分网格软件都可以根据相同的原理进行工作。</p>
		<br />
		<a name="N10074">
				<b>图 1. 网格模型结构图</b>
		</a>
		<br />
		<img height="373" alt="网格模型结构图" src="http://www-128.ibm.com/developerworks/cn/grid/gr-soa/fig1.jpg" width="489" />
		<br />
		<p>总体上来看，这个结构相当简单。我们有一个网格协调者负责分发信息并与各个节点进行工作。这个协调者（它还有很多别的名字，包括分发和管理节点）的职责就是运行网格。协调者与工作节点之间的通信可能在很多解决方案中都存在，不过大部分系统（包括 Globus）都是依赖于 Web 服务的。此处使用的模型通常都称为级联服务，因为信息和工作请求都是通过服务进行级联，从而将其从某个地方分发到各个节点上。</p>
		<p>然而，不管采用哪种通信系统，其方法大体上是相同的： </p>
		<ul>
				<li>严格结构的意思是说，节点都是使用一个特定的 Web 服务或 Web 服务接口与某个软件的特定部分进行联系的，从而处理来自节点协调者的请求。 
</li>
				<li>任务提交是通过协调者进行处理的，它分布在各个节点上，通常使用一个 Web 服务来提交任务。在工作节点上，有一个类似的客户机将完成的任务发回给网格协调者。 
</li>
				<li>网格节点所需要的其他信息（例如大型的数据结构或引用材料）可以在网络上通过另外一个服务进行访问，Web 服务可能支持，也可能不支持。例如，有些网格使用一个集中的 SQL 数据库来存储节点不通过 Web 服务接口而是直接访问的信息。 </li>
		</ul>
		<p>总体来说，大部分网格服务（直到最近）都是基于大型的单一代码基础的，它使用了一些私有的方法来进行通信和共享信息。这使得 Web 服务模型也正在发生改变，但是即使采用了 Web 服务标准之后，很多解决方案也都可以对原有的单一应用程序使用一个 Web 服务接口。例如，从上面这个传统的模型中我们可以看出，将任务提交到一个节点是通过一个 Web 服务接口提交给网格节点的，这实际上会将面向 Web 服务的接口暴露给原来的应用程序。</p>
		<p>这种单块方法存在一个问题，即使使用 Web 服务，它也会限制扩展和增长的能力。采用这种单块风格，将应用程序移植到其他平台和环境就会变得更加复杂。如果您的系统不是基于 Web 服务的，那么问题可能就更加严重。增长之所以会受到限制是因为它依赖于单个协调系统来负责在网络间分发信息。如果您的客户机也是一个单块接口（即使它同时还使用 Web 服务来提供接口），那么将网格应用程序部署到很多机器上也会变得更加困难。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-soa/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1009B">
						<span class="atitle">
								<font face="Arial" size="4">SOA 应用程序模型</font>
						</span>
				</a>
		</p>
		<p>SOA 并不是使用 Web 服务来集成应用程序不同部分并在其间进行通信的另外一个简单术语。SOA 要走得更远，它定义了一种方法来部署应用程序，这样可以将注意力从由多个函数和对象组成的单个应用程序转移到一种将整个应用程序划分为多个单一服务的结构上来。例如，考虑一个记帐程序，它有一些组件负责开具发票并提供一种方法进行支付。除了传统的组件应用程序模型之外，您还可能会希望为这两个任务定义一些对象和相关方法。</p>
		<p>在一个简单的 Web 服务环境中，您要为对象和方法构建一个接口来允许访问需要远程访问的内容。例如，开具发票这个任务可能需要您通过网络连接进行访问。在所有的可能性中，Web 服务都会在一台专用的机器上有一个专用的接口，为其构建一个接口需要了解这台服务器上都在运行什么服务，以及为其提供接口需要的详细信息。</p>
		<p>在一个 SOA 中，这个记帐应用程序中的每个功能从技术上来说都可以作为一个 Web 服务。每个服务都会在网络上广播自己的存在，您可以在任何经过适当授权的机器上执行任何操作。而且，由于每个服务都是自己可以控制的一个组件，因此它们可以存在于网络上的任何地方。我们不再需要一台专用的服务器来处理请求。例如，我们可以使用一个服务器农场，由于服务会广播自己的存在，因此我们不必担心如何发现这些服务。</p>
		<p>从上面的介绍中，我们可以确定 SOA 的主要元素是：</p>
		<ul>
				<li>可以作为一个单独的服务使用 —— 所提供的服务质量的级别还需要作为一项标准确定。例如，我们还不知道是否要提供一个可以处理多个操作和多个服务的单一发票服务，每个都支持不同的操作，例如开具发票、支付发票或修改发票。 
</li>
				<li>独立性 —— 我们并不关心它们是如何来实现我们请求的任务的。它们只要实现这个功能就好了。类似地，服务也并不关心如何来达到这个结果。 
</li>
				<li>服务会广播自己的存在。 </li>
		</ul>
		<p>因此从理论上来说，应该可以将一个应用程序划分为更小的组件，然后可以将其连接在一起（通过相互调用），从而构成最终的应用程序。由于这些单元也可能会扩展到多台机器上，因此我们需要从这种单块、级联结构切换到一种更加灵活的分布式、自由通信的结构。在图 2 中您可以看到一个 SOA 结构的例子。</p>
		<br />
		<a name="N100BF">
				<b>图 2. SOA 网格模型的一个例子</b>
		</a>
		<br />
		<img height="313" alt="SOA 网格模型的一个例子" src="http://www-128.ibm.com/developerworks/cn/grid/gr-soa/fig2.jpg" width="559" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-soa/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100CE">
						<span class="atitle">
								<font face="Arial" size="4">SOA 网格模型</font>
						</span>
				</a>
		</p>
		<p>从上面对于 SOA 模型的介绍以及目前网格技术朝着 Web 服务结构发展的趋势可以清楚地看出，二者正在不断融合。使用简单的术语来说，网格是一个共享资源的分布式系统，而 SOA 则是一个分布式体系结构，后者最关注的是服务的相互操作能力、易于集成、简单性、可扩展性以及安全访问的特性。这两个系统有一些共同的问题，包括延时、并发和局部故障等问题。</p>
		<p>二者都使用了 Web 服务，图 3 给出了一个可以在 SOA 和网格环境中使用的简单布局。二者都大量地采用了 SOAP、XML Web 服务标准以及相关的安全性、管理和其他系统。</p>
		<br />
		<a name="N100DD">
				<b>图 3. SOA 操作模型</b>
		</a>
		<br />
		<img height="303" alt=" SOA 操作模型" src="http://www-128.ibm.com/developerworks/cn/grid/gr-soa/fig3.jpg" width="491" />
		<br />
		<p>不管现有的应用程序是否使用 Web 服务，您都可以看到在图 3 中详细介绍的开放标准构成了 SOA 标准的主体。总之，SOA 利用了以下的技术：</p>
		<ul>
				<li>使用 XML 来构成所有标准的核心部分，从用来交换信息的 SOAP 协议到用来共享描述信息的方法。例如， WSDL（一种基于 XML 的描述语言）就用来描述潜在的客户机可以使用的服务。 
</li>
				<li>SOAP 为交换对象和调用方法提供了一些基本的方法。底层的传输协议是高度不相关的，不过很可能会使用 HTTP。 
</li>
				<li>很多扩展用来为服务之间的交互操作提供关键的服务。例如，WS-Reliability 和 WS-Resource 就用来帮助提高通信的可靠性。 
</li>
				<li>后台标准，例如 WS-Security 和新的 WS-Distributed Management 标准，用来帮助提供安全的通信和管理远程服务。 </li>
		</ul>
		<p>这些准则和技术早已在 Globus Toolkit 中得到了采用，并深入网格标准和应用程序之中。</p>
		<p>要在自己的应用程序中采用这些技术，需要改变一下开发应用程序的方法。例如，要在网格应用程序中采用 SOA 的准则，您需要：</p>
		<ul>
				<li>将应用程序迁移到服务模型。如果您还没有这样做，就必须考虑一下应用程序中的每个操作。稍后我们会更详细地介绍这个问题。 
</li>
				<li>将应用程序划分成更小的、离散的组件。例如，不采用一个带有 Web 服务接口的单块程序，而是将应用程序划分成单个基于 Web 服务的组件。您可以将为网格节点提供服务的应用程序划分成单个服务来接受任务、返回任务和汇报统计信息。 
</li>
				<li>确保节点和控制器可以独立工作。不要依赖于对数据库服务器或其他资源的持久连接。 </li>
		</ul>
		<p>反之，要在 SOA 应用程序中采用网格的概念，您需要：</p>
		<ul>
				<li>从应用程序中删除那些依赖于单一主机或环境进行操作的部分。 
</li>
				<li>将统计信息和监视信息集成到 SOA 服务中，从而确定典型的网格负载信息，例如 CPU 和存储资源。 </li>
		</ul>
		<p>这两种情况中的结果应该是可以构建一个更加灵活而且实际可用的应用程序。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-soa/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1011F">
						<span class="atitle">
								<font face="Arial" size="4">迁移应用程序</font>
						</span>
				</a>
		</p>
		<p>修改现有的应用程序是修改网格或 SOA 应用程序最困难的方法，因为您需要找到一种方法来修改应用程序，却不要极大地改变应用程序工作的方法和现有的服务。</p>
		<p>主要的问题是要确定应用程序的组织。建立要执行的操作列表，网格中的组件和节点之间通信是如何操作的，以及各个步骤的编译次序。例如，您可能会希望制作一个提交次序的模型：当提交作业时会发生什么，当发回响应时会发生什么，当需要有关某个给定资源的状态信息时又会发生什么。有了这些信息，就可以构建一个支持这些操作所需要的服务清单了。</p>
		<p>现在您需要考虑如何实现这些服务。SOA 和基于网格的服务方法之间有一点区别：SOA 组件被认为是无状态的，而网格则是有状态的。二者并不需要是互斥的。您可以开发一个无状态的应用程序来提供有状态的信息，这样就可以包含一个方法来记录可以汇报的服务的状态。</p>
		<p>记住，即使是在迁移到新的 SOA 模型时，应用程序中的关键部分也是相同的。例如在 CPU 敏感的网格中，网格中执行实际工作的核心的计算函数都是相同的，访问数据结构和信息的代码也都是相同的。例如，如果您考虑一个图像呈现网格，构成原始图像描述的数据以及将这些向量数据转换成最终图像的代码（函数或应用程序）都是相同的。只有各个节点之间进行通信和发送请求的方式会发生变化。</p>
		<p>最后，具备这些信息之后，就可以开始将应用程序迁移到新的基于组件的模型了。不幸的是，并没有什么简单的方法可以产生这些信息，现在也没有什么工具可以对此进行简化。您需要确定的很多信息都依赖于应用程序和转换应用程序时的源环境。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-soa/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10135">
						<span class="atitle">
								<font face="Arial" size="4">结束语</font>
						</span>
				</a>
		</p>
		<p>即使对于一个偶然的观察者来说，SOA 和网格都具有类似的目标：简化应用程序，扩充其功能和所支持的平台，可以将任务更容易地分发到多台机器上。它们当然会采用很多相同的基本组件 —— Web 服务和 XML —— 但是这些方法稍有不同。您还可以看到每种解决方案可以给另外一种解决方案提供很多优点，足以值得考虑利用这种技术。例如，网格技术的独立特性对于部署基于 SOA 的应用程序就非常有益。SOA 的灵活特性和异构特性对于网格扩充自己的平台基础来说则十分理想。</p>
		<p>采用基于 SOA 的网格，我们可以获得很多优点。单块模型消失了。现在不再采用一个单一的网格协调者来控制各个任务单元在网格上的执行，任务可以提交到任意的节点上。当任务进行分发时，如果节点不能及时处理这些任务，各个节点应该可以将任务直接发送到其他节点上。这种自治体系结构是可能的，因为各个组件可以彼此进行交互。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 03:54 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网格实践: 在网格中实现 SOA 和 Web 服务-----使用 GT4 和 Globus Resource Allocation Manager </title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5711.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 19:53:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5711.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5711.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5711.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5711.html</trackback:ping><description><![CDATA[
		<blockquote>保持与 Globus Toolkit 的同步更新对于维持最新的网格技巧来说非常重要。本文将介绍 Globus Toolkit 的版本 4，在 Service-Oriented Architecture（SOA）和 Web 服务领域中展示这个工具包，并详细介绍 Grid Resource Allocation Manager 组件（GRAM），以及为网格作业提交、监视和控制例子创造条件的支持服务。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>在本文中，我将在 Service-Oriented Architecture（SOA）和 Web 服务领域概要介绍 Globus Toolkit 4 的内容。重点介绍这个工具包中的 Grid Resource Allocation Manager（GRAM）组件（以及支持服务）—— 这是一组核心服务，可以帮助您在特定的资源上启动作业、检查状态并获取结果的实际操作。通过这个重点的介绍，我们将设置提交网格作业的一个例子中的步骤。网格作业的例子开始是以一个非常基本的例子形式出现的，然后逐渐向其中引入一些新的概念和特性，以支持更加复杂的作业 —— 最后通过 Globus GRAM 将多个作业提交给调度器。</p>
		<p>不过首先让我们来讨论一下有关 SOA 和网格的问题。</p>
		<p>
				<a name="N10057">
						<span class="atitle">
								<font face="Arial" size="4">SOA 和网格</font>
						</span>
				</a>
		</p>
		<p>SOA 是最近的一个热点问题。尽管这个概念已经并不新鲜，但是它却重新点燃了 Web 服务的活力。Web 服务可以通过一个使用标准协议仔细进行定义的接口为远程用户提供对程序的访问。高级的服务可以在现有的服务之上进行构建，应用程序可以通过将一系列 Web 服务连接在一起而进行开发。最后，我们还有一个非常有用的重用方法。</p>
		<p>如果应用程序提供了一个通用的可重用服务，并且它是无状态的，需要少量的输入和输出数据，那么这个应用程序就应该打包为一个 Web 服务。为了增加重用性，甚至还有一种发现并调用现有服务的机制。这种方法对于在分布式环境中提供对常用应用程序的访问来说非常有效，因为它是基于标准协议的，例如 SOAP over HTTP。</p>
		<p>在将 SOA 应用到网格实现上时，有一些常见的应用程序应该以 Web 服务的形式提供。然而，很多常见的应用程序都是特定于网格实现类型的，无论研究、科学方面的网格，还是教育网格。如果我们希望在这些应用程序域之间使用一些可重用的服务，那么应该区分任何网格实现中所需要的服务：</p>
		<ul>
				<li>安全性 
</li>
				<li>执行管理 
</li>
				<li>通知 
</li>
				<li>复制 
</li>
				<li>资源发现 
</li>
				<li>监视 </li>
		</ul>
		<p>如果我们将网格实现中所需要的服务进行合并，就会得到一个基本的网格基础设施，我们称之为“面向服务的基础设施”（Service-Oriented Infrastructure）。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4gram/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1007E">
						<span class="atitle">
								<font face="Arial" size="4">GRAM 功能和服务</font>
						</span>
				</a>
		</p>
		<p>这种环境中的 Web 服务为支持通用的作业提交方法提供了一个基础，当您希望在相关的输入数据之间提供可执行文件时，可能要在产生输出数据的同时访问这些数据，然后在执行过程中与作业进行交互，此时这种方法非常有效。这看起来可能有些超前，但是现在的确已经有了提供这种功能的工具和技术。</p>
		<p>Globus Toolkit 4.0 就是这样一种工具。它对一组 Web 服务进行了打包，这些服务为我们提供了一个面向服务的基础设施。应用程序关注的是某个具体的问题领域，而 Globus Toolkit 关注的则是整个基础设施。Globus Web 服务可以帮助您对分布式基础设施组件进行访问和管理。</p>
		<p>Globus Toolkit 的 GRAM 组件提供了一组 Web 服务，它们采用了 WS-Resource Framework，其设计目标是帮助您在网格环境中提交作业和管理作业。GRAM 可以用于那些需要信任证书、可靠执行以及协调文件步骤的作业。GRAM 可以帮助实现信任证书的管理，从而提交作业，监视作业的进展状况，控制作业的执行情况，并分阶段地处理相关的数据。不同的信任证书可以用来代表不同的功能。GRAM 提供了一个可靠的执行环境，并集成了多个专门用来在复杂环境中对作业执行管理进行优化的调度器。GRAM 和支持服务提供了文件分段传输的功能，甚至还提供了在作业运行时访问输出数据文件的功能，从而有效地实现对输出数据的利用。</p>
		<p>
				<a name="N1008D">
						<span class="smalltitle">GRAM 调度器</span>
				</a>
		</p>
		<p>当您提交一个作业时，GRAM 创建一个 <code>ManagedJob</code> 对象，并返回其句柄。然后您就可以使用这个句柄与这个作业进行交互，这实际上是一个 WS-Addressing Endpoint Reference（EPR）。稍后我们将讨论一个典型的交互过程，并给出几个例子；但是首先让我们来了解一下支持作业执行所使用的基础设施。</p>
		<p>网格作业可能会消耗大量的计算周期，因此一个网格环境通常会包含很多资源集群。这些集群通常是由一个调度器进行控制的。调度器负责对资源的使用进行优化，从而按照定义好的策略来有效地执行作业。有很多调度器可以使用，其中包括 Load Sharing Facility、Condor 和 Portable Batch System。</p>
		<p>GRAM 使用调度器适配器将作业描述语法转换成调度器可以执行的命令。除了为调度器提供一个接口之外，GRAM 还包含了一种派生新的 UNIX® 进程来启动作业的机制。这适用于小型的串行作业，它们在运行时不需要集群资源，也不需要共享内存或消息传递。在后面的例子中，我们就会使用这个简单的派生进程。</p>
		<p>派生进程使用一个 Fork Starter 程序来启动并监视针对 GRAM 的作业进程。它还记录了一些数据，例如启动时间、结束时间以及该作业的退出代码。当提交作业时，事件会被写入日志文件中。当有重要的事件发生时，会继续在后面添加日志。这些调度器日志文件是由称为 Scheduler Event Generator （SEG）的进程进行监视的，它会让 GRAM 通过监听相关的事件并与其通信，来保持与作业状态的同步。</p>
		<p>
				<a name="N100A2">
						<span class="smalltitle">GRAM 支持服务</span>
				</a>
		</p>
		<p>GRAM 提供了作业和执行管理服务来提交、监视和控制作业，但是这都依赖于用来传输文件和管理证书所使用的支持服务。GridFTP 所提供的文件服务用来帮助 GRAM 实现对输入和输出文件的分段传输。证书管理服务处理证书对其他服务和所需要的分布式网格资源的委托。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4gram/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100AA">
						<span class="atitle">
								<font face="Arial" size="4">GRAM 作业提交</font>
						</span>
				</a>
		</p>
		<p>现在我们已经基本了解了这些功能和支持服务，接下来让我们讨论一下实际的作业提交系统。</p>
		<p>
				<a name="N100B3">
						<span class="smalltitle">作业提交的基础知识</span>
				</a>
		</p>
		<p>可以使用应用程序编程接口（API）或者通过命令行工具，以编程的方式提交作业。命令行工具是用来测试 Globus 安装的一种简单方法，因此我们首先介绍一下这种方法。</p>
		<p>
				<code>globusrun-ws</code> 命令行工具取代了 <code>managed-job-globusrun</code> 命令，它用来提交、监视和控制作业。它可以协调文件的分段传输、证书委托和身份验证问题。信息可以使用命令行选项进行指定，也可以包含在一个基于 XML 的对象描述文件中。<code>globusrun-ws</code> 命令是同步执行的，因此作业在提交时并不会返回控制权。相反，它会通过显示作业的状态，以交互方式提供一些反馈。基于这些状态信息，您可以选择使用 <b>Ctrl C</b> 来取消某个作业。</p>
		<p>
				<a name="N100CD">
						<span class="smalltitle">作业提交的前提条件</span>
				</a>
		</p>
		<p>所有的用户都必须通过身份验证并具有有效的证书才可以提交作业。这个作业可能需要将证书委托给他人来执行远程操作，例如分段传输文件。</p>
		<p>下面的例子假设已经使用 <code>grid-proxy-init</code> 命令生成了一个有效的代理。然而，证书也可以通过作业请求进行传输，或者上传到 Delegation 服务中。清单 1 是提交一个简单作业（用来获取日期）的例子。<code>-c</code> 选项指定要运行 <code>/bin/date</code> 命令。</p>
		<br />
		<a name="N100E8">
				<b>清单 1. 提交作业来获取日期</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
[globust@gt4-test ~]$ grid-proxy-init
Your identity: /C=US/O=UTAustin/OU=TACC/CN=Globus User/UID=globust
Enter GRID pass phrase for this identity:
Creating proxy .............................................. Done
Your proxy is valid until: Thu May 19 23:35:47 2005

[globust@gt4-test ~]$ globusrun-ws -submit -c /bin/date
Submitting job...Done.
Job ID: uuid:254e353e-c884-11d9-9304-0011435a15ac
Termination time: 05/20/2005 16:36 GMT
Current job state: Active
Current job state: CleanUp
Current job state: Done
Destroying job...Done.
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N100EE">
						<span class="smalltitle">作业描述文件</span>
				</a>
		</p>
		<p>在命令行中指定多个作业参数可能会是一件令人讨厌的事情。当有多个参数与一个作业相关时，可以使用作业描述文件。</p>
		<p>作业是使用 <code>-f</code> 选项提交的，后面跟着作业描述文件名。在作业描述文件中可以使用变量。在提交作业时，GRAM 会处理作业描述文件，并替换变量的值。</p>
		<p>在下面这个例子中，变量 <code>GLOBUS_USER_HOME</code> 对应我的主目录。这个变量会被替换成解析后的值，这是到主目录的实际路径。在清单 2 中，我们提交了一个使用提交描述文件 simple_test.xml 描述的作业。这个作业使用 echo 命令将输入参数重定向到标准输出上。在这里，我们规定，应该将标准输出重定向到主目录中的 stdout 文件。</p>
		<br />
		<a name="N10108">
				<b>清单 2. 使用作业描述文件</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
globust@gt4-test ~]$ globusrun-ws -submit -f simple_test.xml 
Submitting job...Done.
Job ID: uuid:db96c126-c884-11d9-8a94-0011435a15ac
Termination time: 05/20/2005 16:41 GMT
Current job state: Active
Current job state: CleanUp
Current job state: Done
Destroying job...Done.

[globust@gt4-test ~]$ cat simple_test.xml 
&lt;job&gt;
    &lt;executable&gt;/bin/echo&lt;/executable&gt;
    &lt;argument&gt;Wow, we're submitting Grid Jobs!&lt;/argument&gt;
    &lt;stdout&gt;${GLOBUS_USER_HOME}/stdout&lt;/stdout&gt;
    &lt;stderr&gt;${GLOBUS_USER_HOME}/stderr&lt;/stderr&gt;
&lt;/job&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N1010E">
						<span class="smalltitle">批处理模式</span>
				</a>
		</p>
		<p>除了同步模式之外，<code>globusrun-ws</code> 命令还可以使用批处理模式来提交后台作业。</p>
		<p>要使用批处理模式，则需要指定一个文件，其中 GRAM 应该将 Job EPR 保存到所管理的作业资源中，然后在与这个作业相关的一系列命令中指定这个文件。</p>
		<p>在这个例子中，我们将提交与上一个例子相同的作业，但是我们使用 <code>-batch</code> 选项指定它应该在后台运行。控制权会立即返回，因此您可以在这个作业运行的同时执行其他工作。后台作业的状态可以使用 <code>globusrun-ws</code> 命令的 <code>-status</code> 参数进行查询，并指定 -job-epr-file，该参数可以确定与这个作业相关的 <code>ManagedJob</code> 对象。</p>
		<br />
		<a name="N10134">
				<b>清单 3. 在后台运行清单 2 中的作业</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
globust@gt4-test ~]$ globusrun-ws -submit -batch -f simple_test.xml -o st.epr
Submitting job...Done.
Job ID: uuid:db96c126-c884-11d9-8a94-0011435a15ac
Termination time: 05/20/2005 16:41 GMT
Current job state: Active
Current job state: CleanUp
Current job state: Done
Destroying job...Done.

[globust@gt4-test ~]$ globusrun-ws -status -job-epr-file st.epr
Submitting job...Done.
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N1013A">
						<span class="smalltitle">作业变量</span>
				</a>
		</p>
		<p>您可以在作业描述文件中为这个作业设置环境变量，并通过指定一个 count 参数来控制该作业运行的次数。在下面这个例子中，环境变量 <code>CONDOR_CONFIG</code> 已经设置，以指定 condor 配置文件的位置；count 变量说明这个作业应该运行 25 次。</p>
		<br />
		<a name="N1014A">
				<b>清单 4. 确定一个作业运行多少次</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
    &lt;environment&gt;
        &lt;name&gt;CONDOR_CONFIG&lt;/name&gt;
        &lt;value&gt;/usr/local/condor/condor-6.7.7/etc/condor_config&lt;/value&gt;
    &lt;/environment&gt;

    ...
 
    &lt;count&gt;25&lt;/count&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N10150">
						<span class="smalltitle">文件分段传输</span>
				</a>
		</p>
		<p>作业描述符文件可以包括文件传输指令，它控制输入和输出文件的分段传输。这些指令使用了 Reliable FileTransfer（RFT）语法，在指定源 URL 和目的 URL 时可以支持第三方的文件传输。</p>
		<p>RFT 服务是通过 GRAM 调用来分段传输输入文件和输出文件的。RFT 类似于一个 GridFTP 客户端，通过持续进行传输来管理数据的传输和状态信息。它通过支持检查点和为崩溃的文件传输提供重启功能而增强了可靠性。</p>
		<p>除了要对输入和输出文件进行分段传输之外，GridFTP 还可以用来在作业执行期间对输出文件进行监视。GridFTP 可以检查输出文件的状态，并传输任何新信息，从而有效地处理输出数据。</p>
		<p>清单 5 给出了文件分段传输指令，它用来从一个远程机器 gt4-test1 上获取一个文件，并将其复制到 /tmp/simpleTestFile 中的本地文件系统中。</p>
		<br />
		<a name="N10165">
				<b>清单 5. 文件分段传输指令</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
&lt;fileStageIn&gt;
     &lt;transfer&gt;
         &lt;sourceUrl&gt;gsiftp://gt4-test1:2811/tmp/simpleTestFile&lt;/sourceUrl&gt;
         &lt;destinationUrl&gt;file:////tmp/simpleTestFile&lt;/destinationUrl&gt;
     &lt;/transfer&gt;
&lt;/fileStageIn&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>除了对文件进行分段传输之外，还可以使用 <code>&lt;fileCleanUp&gt;</code> 指令自动删除文件，如清单 6 所示：</p>
		<br />
		<a name="N10176">
				<b>清单 6. 自动清除文件</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
&lt;job&gt;
     &lt;fileCleanUp&gt;
        &lt;deletion&gt;
            &lt;file&gt;file:////tmp/simpleTestFile&lt;/file&gt;
        &lt;/deletion&gt;
    &lt;/fileCleanUp&gt;
&lt;/job&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N1017C">
						<span class="smalltitle">多作业支持</span>
				</a>
		</p>
		<p>作业描述 XML 模式支持<i>多作业</i> 的概念，即由多个作业或子作业组成的作业。这种方法可以用来将一组相关的作业绑定在一起，并将其一次提交给 GRAM。</p>
		<p>GRAM 使用一个集中地点来对多作业环境中的各个进程进行同步。这用于那些在完成其他计算之前需要在执行过程中的某个特定地方集中的并行作业。</p>
		<p>作业描述符文件中的每个子作业都必须为工厂指定一个端点。这允许并行地向多个主机提交作业。</p>
		<p>下面这个例子为一个由两个子作业做成的作业使用了一个多作业的描述文件 —— 一个作业用来获取日期，另外一个作业使用 <code>echo</code> 命令将输入参数传递给标准输出。第一个子作业的输出被发送到主目录中的 stdout.p1 文件中，第二个子作业的输出被发送到 stdout.p2 文件中。</p>
		<br />
		<a name="N10198">
				<b>清单 7. 两个作业，只花一份钱</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;multiJob xmlns:gram="http://www.globus.org/namespaces/2004/10/gram/job" 
     xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing"&gt;
    &lt;factoryEndpoint&gt;
        &lt;wsa:Address&gt;
            https://localhost:8443/wsrf/services/ManagedJobFactoryService
        &lt;/wsa:Address&gt;
        &lt;wsa:ReferenceProperties&gt;
            &lt;gram:ResourceID&gt;Multi&lt;/gram:ResourceID&gt;
        &lt;/wsa:ReferenceProperties&gt;
    &lt;/factoryEndpoint&gt;
    &lt;directory&gt;${GLOBUS_LOCATION}&lt;/directory&gt;
    &lt;count&gt;1&lt;/count&gt;

    &lt;job&gt;
        &lt;factoryEndpoint&gt;
            &lt;wsa:Address&gt;https://localhost:8443/wsrf/services/ManagedJ
            obFactoryService&lt;/wsa:Address&gt;
            &lt;wsa:ReferenceProperties&gt;
                &lt;gram:ResourceID&gt;Fork&lt;/gram:ResourceID&gt;
            &lt;/wsa:ReferenceProperties&gt;
        &lt;/factoryEndpoint&gt;
        &lt;executable&gt;/bin/date&lt;/executable&gt;
        &lt;stdout&gt;${GLOBUS_USER_HOME}/stdout.p1&lt;/stdout&gt;
        &lt;stderr&gt;${GLOBUS_USER_HOME}/stderr.p1&lt;/stderr&gt;
        &lt;count&gt;2&lt;/count&gt;
    &lt;/job&gt;

    &lt;job&gt;
        &lt;factoryEndpoint&gt;
            &lt;wsa:Address&gt;https://localhost:8443/wsrf/services/ManagedJ
            obFactoryService&lt;/wsa:Address&gt;
            &lt;wsa:ReferenceProperties&gt;
                &lt;gram:ResourceID&gt;Fork&lt;/gram:ResourceID&gt;
            &lt;/wsa:ReferenceProperties&gt;
        &lt;/factoryEndpoint&gt;
        &lt;executable&gt;/bin/echo&lt;/executable&gt;
        &lt;argument&gt;Hello World!&lt;/argument&gt;        
        &lt;stdout&gt;${GLOBUS_USER_HOME}/stdout.p2&lt;/stdout&gt;
        &lt;stderr&gt;${GLOBUS_USER_HOME}/stderr.p2&lt;/stderr&gt;
        &lt;count&gt;1&lt;/count&gt;
    &lt;/job&gt;

&lt;/multiJob&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<font face="Lucida Console" size="2">
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<font face="Lucida Console" size="2">
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
										</font>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<font face="Lucida Console" size="2">
																				<br />
																		</font>
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4gram/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1019E">
						<span class="atitle">
								<font face="Arial" size="4">调度器</font>
						</span>
				</a>
		</p>
		<p>上面我们简要介绍了网格是如何包含在调度器的控制之下进行操作的集群资源。调度器会对吞吐量进行性能和效率的优化。</p>
		<p>GRAM 使用实现 GRAM WS 适配器插件 API 的适配器来对调度器进行协调。这些调度器的安装和配置应该在安装或配置 Globus Toolkit 之前完成。</p>
		<p>GRAM 调度器适配器包含在 Globus PBS （Portable Batch System）的发行版、 Condor 和 Platform Load Sharing Facility （LSF）中。 Globus 文档介绍了 PBS 的设置步骤，因此我们下面将介绍一下 Condor 和 Platform LSF。我们假设您已经正确安装并配置了 Globus（这包括导出的环境变量，例如 <code>ANT_HOME</code>、<code>JAVA_HOME</code> 和 <code>GLOBUS_LOCATION</code>）。在 Globus 的安装目录中，执行下面的命令：</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">% configure -prefix=$GLOBUS_LOCATION -enable-wsgram-lsf -enable-wsgram-condor
% make
% make install
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>假设这个步骤成功完成了，那么在 $GLOBUS_LOCATION/etc 目录中，每个调度器都会有一个 gram-service，如清单 8 所示：</p>
		<br />
		<a name="N101C5">
				<b>清单 8. 创建一个 gram-service 监听</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
[mausolf@gt4-test etc]$ pwd
/usr/local/globus/globus-4.0.0/etc
 [mausolf@gt4-test etc]$ ls gram-service-*
gram-service-Condor:
jndi-config.xml

gram-service-Lsf:
jndi-config.xml

gram-service-Fork:
jndi-config.xml

gram-service-Multi:
jndi-config.xml
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N101CB">
						<span class="smalltitle">jobType</span>
				</a>
		</p>
		<p>在提交作业时，您可以使用 <code>jobType</code> 指令指定使用哪一个调度器。在 <code>jobType</code> 中指定的名称必须与 JNDI 配置文件中这个服务所使用的名称完全匹配。</p>
		<p>例如，在下面这个例子中，作业 jndi-config.xml （位于 $GLOBUS_LOCATION/etc/gram-service-condor 目录中）将名称 <code>condor</code> 赋予这个服务。下面这个例子使用了一个作业描述文件 simple2test.xml 将作业提交给 <code>condor</code>。</p>
		<br />
		<a name="N101EA">
				<b>清单 9. 指定使用哪个调度器</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;job&gt;
    &lt;executable&gt;/usr/local/condor/condor-6.7.7/examples/sh_loop&lt;/executable&gt;
    &lt;directory&gt;${GLOBUS_USER_HOME}&lt;/directory&gt;
    &lt;argument&gt;123&lt;/argument&gt;
    &lt;stdin&gt;/dev/null&lt;/stdin&gt;
    &lt;stdout&gt;${GLOBUS_USER_HOME}/stdout&lt;/stdout&gt;
    &lt;stderr&gt;${GLOBUS_USER_HOME}/stderr&lt;/stderr&gt;
    &lt;jobType&gt;condor&lt;/jobType&gt;
&lt;/job&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>可以在命令行中使用 <code>globusrun-ws</code> 来提交这个作业，如下所示：</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">[globust@gt4-test ~]$ globusrun-ws -submit -batch -f simple2test.xml -o st2.epr
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在这个例子中，这个作业是在后台运行的。控制权会立即返回，您可以通过提供 job-epr-file 来获得后台作业的状态，如下所示：</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">[globust@gt4-test ~]$ globusrun-ws -status -job-epr-file st2.epr<br />
Current job state: Done
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>让我们来看一个更加真实的多作业提交系统，它可以用类似的方式提交作业。因为我们要提交多作业，所以将 <code>jobType</code> 指定为 Condor，然后通过 GRAM 和 Condor 来查询其状态。</p>
		<br />
		<a name="N10211">
				<b>清单 10. 为多作业指定调度器</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
 [globust@gt4-test ~]$ globusrun-ws -submit -batch -f multi3test.xml -o mt3.epr
Delegating user credentials...Done.
Submitting job...Done.
Job ID: uuid:b701732a-c95f-11d9-870d-0011435a15ac
Termination time: 05/21/2005 18:48 GMT

 [globust@gt4-test ~]$ condor_q
 Submitter: gt4-test.tacc.utexas.edu : &lt;129.114.50.64:54109&gt; 
 : gt4-test.tacc.utexas.edu
 ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD                
 62.0   globust         5/24 11:07   0+00:00:04 R  0   0.0  sh_loop 1100      
 63.0   globust         5/24 11:07   0+00:00:00 R  0   0.0  sh_loop 1200      

2 jobs; 0 idle, 2 running, 0 held


 [globust@gt4-test ~]$ globusrun-ws -status -job-epr-file mt3.epr
Current job state: Pending 
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>清单 11 给出了用于清单 10 中的多作业提交的作业描述文件。所指定的可执行文件 <code>sh_loop</code> 是 Condor 发行版中提供的一个示例程序，它会循环一段指定的时间。之所以选择这个例子是因为它非常简单，而且可以指定作业的持续时间，这让我们可以使用 Condor 和 GRAM 工具来展示查询作业的状态。</p>
		<br />
		<a name="N10222">
				<b>清单 11. 清单 10 中作业所使用的作业描述符</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console" size="2">				
[globust@gt4-test ~]$ cat multi3test.xml 
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;multiJob xmlns:gram="http://www.globus.org/namespaces/2004/10/gram/job" 
     xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing"&gt;
    &lt;factoryEndpoint&gt;
        &lt;wsa:Address&gt;
            https://gt4-test.tacc.utexas.edu:8443/wsrf/services/ManagedJ
            obFactoryService
        &lt;/wsa:Address&gt;
        &lt;wsa:ReferenceProperties&gt;
            &lt;gram:ResourceID&gt;Multi&lt;/gram:ResourceID&gt;
        &lt;/wsa:ReferenceProperties&gt;
    &lt;/factoryEndpoint&gt;
    &lt;directory&gt;${GLOBUS_LOCATION}&lt;/directory&gt;
    &lt;count&gt;1&lt;/count&gt;

    &lt;job&gt;
        &lt;factoryEndpoint&gt;
            &lt;wsa:Address&gt;https://gt4-test.tacc.utexas.edu:8443/wsrf/serv
            ices/ManagedJobFactoryService&lt;/wsa:Address&gt;
            &lt;wsa:ReferenceProperties&gt;
                &lt;gram:ResourceID&gt;Condor&lt;/gram:ResourceID&gt;
            &lt;/wsa:ReferenceProperties&gt;
        &lt;/factoryEndpoint&gt;
        &lt;executable&gt;/home/mausolf/sh_loop&lt;/executable&gt;
        &lt;argument&gt;1100&lt;/argument&gt;        
        &lt;stdout&gt;${GLOBUS_USER_HOME}/stdoutM3.p1&lt;/stdout&gt;
        &lt;stderr&gt;${GLOBUS_USER_HOME}/stderrM3.p1&lt;/stderr&gt;
        &lt;count&gt;1&lt;/count&gt;
    &lt;/job&gt;

    &lt;job&gt;
        &lt;factoryEndpoint&gt;
            &lt;wsa:Address&gt;https://gt4-test.tacc.utexas.edu:8443/wsrf/serv
            ices/ManagedJobFactoryService&lt;/wsa:Address&gt;
            &lt;wsa:ReferenceProperties&gt;
                &lt;gram:ResourceID&gt;Condor&lt;/gram:ResourceID&gt;
            &lt;/wsa:ReferenceProperties&gt;
        &lt;/factoryEndpoint&gt;
        &lt;executable&gt;/home/mausolf/sh_loop&lt;/executable&gt;
        &lt;argument&gt;1200&lt;/argument&gt;        
        &lt;stdout&gt;${GLOBUS_USER_HOME}/stdoutM2.p2&lt;/stdout&gt;
        &lt;stderr&gt;${GLOBUS_USER_HOME}/stderrM2.p2&lt;/stderr&gt;
        &lt;count&gt;1&lt;/count&gt;
    &lt;/job&gt;

&lt;/multiJob&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<font face="Lucida Console" size="2">
												<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<font face="Lucida Console" size="2">
												<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
												<br />
										</font>
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<font face="Lucida Console" size="2">
																				<br />
																		</font>
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/grid/gr-gt4gram/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10228">
						<span class="atitle">
								<font face="Arial" size="4">结束语</font>
						</span>
				</a>
		</p>
		<p>本文对 Globus Toolkit 4.0 进行了简要的介绍，并详细介绍了 GRAM 和支持服务的内容。文中还包括几个网格作业提交的例子，用来提供通过 GRAM 来提交作业和监视作业的经验。在更复杂和实际的环境中，GRAM 还需要作出一个明智的决定，来确定将作业提交到哪一个资源和调度器上。这些信息可以通过 MDS（Monitoring and Discovery Service）获得。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 03:53 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面向服务的敏捷性：成功的面向服务体系结构 (SOA) 开发的方法，第 1 部分:: SOA 和敏捷方法基础</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5710.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 19:52:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5710.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5710.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5710.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5710.html</trackback:ping><description><![CDATA[
		<blockquote>本文是由两部分组成的系列文章的第 1 部分，阐述了普遍接受的方法学（例如 Scrum、极限编程（Extreme Programming，XP）、Crystal、动态系统开发方法（Dynamic Systems Development Method，DSDM）和主要研究精益软件开发（Lean Software Development，LSD）的其他方法学）内包含的敏捷开发的基本原则。当今，必须提高业务的灵活性和速度，以应对不断变化的客户需求、市场机会和外部竞争对手的威胁。为使这些业务得以成功，可以采用面向服务的体系结构 (SOA) 的开发方法来设计以适应性（对变化和需求做出响应的能力）为目标的 IT 系统。本系列的第 2 部分详细描述了它们用于开发 SOA 的适应性。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N1007B">
						<span class="atitle">
								<font face="Arial" size="4">引言</font>
						</span>
				</a>
		</p>
		<p>面向服务的体系结构 (SOA) 由 Mark Colan 等受人尊敬的思想领袖定义和阐述（请参阅“<a href="http://www.ibm.com/developerworks/webservices/library/ws-soaintro.html"><font color="#5c81a7">Service-Oriented Architecture expands the vision of Web services, Part 1</font></a>”），作为普遍接受的用于设计可适应的、企业级 IT 系统的新兴风格，它已经得到了很大的发展。虽然目标十分明确，但实现目标的方法却并非如此，因为还没有受到广泛接受的 SOA 方法学。不过，在这方面还是进行了一些研究（请参见 <a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1/#methodsoa"><font color="#996699">SOA 的方法学</font></a>）的。</p>
		<p>负责设计 SOA 的每个人都会面对两个主要挑战：1) 如何设计一个系统来很好地适应业务流程、业务目标和 IT 体系结构，2) 如何构建一个能对将来的变化做出响应的体系结构？第二个挑战与敏捷性相关，通常在敏捷软件开发方法的背景下进行讨论。在本文中，我们将介绍如何将此方法的思想扩展到 SOA 的设计。我们先回顾一些最常见的敏捷开发方法，然后再研究“精益软件开发”(LSD) 的原则。最后，我们讨论在构建 SOA 的过程中对 LSD 的初步分析。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1008F">
						<span class="atitle">
								<font face="Arial" size="4">SOA 入门</font>
						</span>
				</a>
		</p>
		<p>
				<a name="soa">
						<span class="smalltitle">什么是 SOA？</span>
				</a>
		</p>
		<p>在构建 IT 体系结构（特别是企业级体系结构）时，我们的目标始终是：支持业务流程并对业务变化做出响应。在最近几年中，出现了一些构建系统体系结构的新方法，这些方法主要围绕功能单元（称为服务）来构建复杂的系统。</p>
		<p>最新的理解是，服务包含 4 个主要方面： 
</p>
		<ul>
				<li>提供 
</li>
				<li>使用 
</li>
				<li>说明 
</li>
				<li>中介 </li>
		</ul>Web 服务也对以上这几个方面提供基于系统和标准的支持。因此，Web 服务具有无与伦比的敏捷性这一优点。例如，使用 Web 服务基础设施可以在运行时更改服务提供者，而不影响使用者。 
<p></p><p>某个系统本身要被称为基于 SOA 的系统，应具备以下特性： 
</p><ul><li>业务流程映射到软件服务；因此，业务可通过软件进行跟踪。 
</li><li>存在一种基础结构，支持上述服务的 4 个不同方面。这样服务级别就具有高度的敏捷性。 
</li><li>服务是监视和管理单元。因此，一个人可以跟踪业务流程的操作属性和问题。 </li></ul><p></p><p><a name="N100BF"><span class="smalltitle">SOA 应用程序</span></a></p><p><a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1/#figure1"><font color="#996699">图 1</font></a> 从应用程序角度展示了企业级 SOA 所包含的元素。<i>业务流程</i> 由<i>用户界面应用程序</i> 和<i>服务应用程序</i> 进行部分和完全支持。业务流程中的一个步骤或者通过人工执行，或者得到用户界面应用程序的支持。用户界面应用程序实现了许多宏工作流，而且它们还使用实现业务功能的服务。</p><p>在<i>服务编排</i> 层，<i>组合服务</i> 是通过编排语言（例如业务流程执行语言（Business Process Execution Language，BPEL））定义的。组合服务的编排通过<i>基本服务</i> 定义其流程和组成。编排层应由支持图形规范的编排工具提供支持，例如 IBM WebSphere® Business Integration Modeler 和 IBM Rational® Application Developer。</p><p>基本服务（由服务编排层使用，也由用户界面应用程序使用）通过服务应用程序实现。而服务实现又可以调用其他服务，这些服务通常来自另外的服务应用程序。</p><br /><a name="figure1"><b>图 1. SOA 的元素</b></a><br /><img height="352" alt="SOA elements" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1/figure1.gif" width="515" /><br /><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1/#main"><b><font color="#996699"></font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="methodsoa"><span class="atitle"><font face="Arial" size="4">SOA 的方法学</font></span></a></p><p>构建一个合理的 SOA 应采用何种开发方法？从前面的部分可以看出，有业务流程、应用程序和服务。显然，对服务建模是此类方法必须支持的主要任务。另一个重要的方面是确保业务流程和服务之间的链接（请参见<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1/#soa"><font color="#996699">什么是 SOA</font></a>）。</p><p>文章“<a href="http://www.ibm.com/developerworks/webservices/library/ws-soad1"><font color="#5c81a7">Elements of Service-Oriented Analysis and Design</font></a>”说明了现有的模型（例如面向对象的分析和设计（Object-Oriented Analysis and Design，OOAD）、企业体系结构框架和业务流程建模技术）对 SOA 设计的作用。本文还指出，您需要将其他方法元素用于 SOA，例如用于服务标识和聚合的方法和技术、业务跟踪能力、现有资产的集成和重用。</p><p>在另一篇 IBM developerWorks 文章“<a href="http://www.ibm.com/developerworks/webservices/library/ws-soa-design1"><font color="#5c81a7">Service-oriented modeling and architecture</font></a>”中描述了一种方法，回答了上述许多问题。本文主要介绍服务的建模，它是在域分解、现有系统分析和目标服务建模之类的技术支持下实现的。</p><p>引用的这两篇文章提出了许多问题，我们仍需要回答这些问题——例如，SOA 控制问题。我们要提出的另一个问题是：在 SOA 开发中应采用哪些规则和实践来确保服务模型能对将来的变化做出响应？在这里，我们可以求助于各种敏捷软件开发方法。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1/#main"><b><font color="#996699"></font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N10112"><span class="atitle"><font face="Arial" size="4">敏捷软件开发</font></span></a></p><p>敏捷软件开发是自上世纪 90 年代 Kent Beck 提出极限编程 (XP) 时开始兴起的，这种编程方法用一组价值标准、原则和实践来规划、编码、设计和测试软件。（有关对 XP 的介绍，请参见 <a href="http://www.extremeprogramming.org/"><font color="#5c81a7">Extreme Programming: A gentle introduction</font></a>。）</p><p>所有敏捷软件开发方法都具有以下几个共同价值标准，例如 
</p><ul><li>频繁检查和改写 
</li><li>频繁交付 
</li><li>协作和密切沟通 
</li><li>深思熟虑的改进 
</li><li>突出需求（递增）、技术和团队能力 
</li><li>授权和自我组织 
</li><li>基于事实而非假象进行处理 
</li><li>勇气和尊重 </li></ul><p></p><p>从这些价值标准可以看出，现在使用的各种敏捷方法都注重不同的实践。</p><p>2001 年 2 月定义了 <a href="http://agilemanifesto.org/"><font color="#5c81a7">Agile Manifesto</font></a>，它在流程和工具的基础上评价个体和交互操作，在综合性文档的基础上使用软件，在合共协商的基础上进行客户合作，并在遵循计划的基础上对变更做出响应。它是现今使用的所有敏捷方法的基础。</p><p>为了使本文的阐述更加清楚，我们简要介绍了最常用的敏捷方法，因为在开发 SOA 时它们中的许多都是非常有用的。我们知道，SOA 不仅与软件开发有关，而且还与业务和 IT 体系结构有关。因此，如果我们了解软件开发实践，则我们必须始终评估它们是否适合 SOA。在本系列文章的第 2 部分中完成此评估。</p><p><a name="N1014A"><span class="smalltitle">Scrum</span></a></p><p><a href="http://www.controlchaos.com/"><font color="#5c81a7">Scrum</font></a> 似乎是很简单的，但仍有一些实践会对工作体验产生深远的影响，并获得重要的适应性和敏捷性。在这些方法中，Scrum 与众不同的特点是对自我指导团队、每日团队评估和避免说明性流程进行了极大的提升。Scrum 的一些关键实践包括： 
</p><ul><li>自我指导和自我组织团队 
</li><li>每日就特殊问题（您做了什么、您将做什么和您遇到哪些问题）开站立会议 
</li><li>通常采用 30 天的日历循环 
</li><li>在每个循环的开始，制订客户驱动的适应计划 
</li><li>向参与者演示功能（在每个循环结束时） </li></ul><p></p><p>对于企业级活动，了解和管理项目间的依赖项非常重要。在 Scrum 中使用“Global Backlog”就可以很好地做到这一点，Global Backlog 是对用户有价值的功能和非功能需求的企业视图。Global Backlog 在全局区分优先级。每个项目从 Global Backlog 获得项目范围内的最重要的部分。“Scrum of Scrums”还涉及项目间的同步，这是一个每两天（或每周）一次的会议，来自每个团队的代表参加这个会议，以便在团队之间同步。</p><p><a name="N1016C"><span class="smalltitle">XP</span></a></p><p><a href="http://www.extremeprogramming.org/"><font color="#5c81a7">XP</font></a>（http://www.extremeprogramming.org 和 http://www.xprogramming.com）注重协作、快速和早期软件创建以及有技巧的开发实践。它由一组主要实践（坐在一起、整个团队、信息工作空间、成对编程、每周循环、放松、10 分钟构建、持续集成、测试优先编程、增量设计等等）和一组与之对应的实践（实际客户参与、增量和每日部署、根源分析、共享代码、单独的代码库、协商的范围合同、根据使用情况计费等）组成。</p><p><a name="N10179"><span class="smalltitle">Crystal</span></a></p><p><a href="http://alistair.cockburn.us/crystal/crystal.html"><font color="#5c81a7">Crystal</font></a> 是具有以下共同特征的一系列方法学：注重频繁交付、密切沟通和深思熟虑的改进。Crystal 的这些特征包括： 
</p><ul><li><a href="http://alistair.cockburn.us/crystal/articles/cgm/cooperativegamemanifesto.html"><font color="#5c81a7">经济合作游戏模型</font></a></li><li>所选的优先级 
</li><li>属性 
</li><li>原则 
</li><li>示例技术 
</li><li>项目示例 </li></ul><p></p><p>Crystal 系列通用优先级可以保证项目的最终成果，提高开发效率，并且符合常规习惯（换句话说，开发人员可以接受它们）。项目团队可以采用 7 个安全特性（前 3 个是 Crystal 的核心，而其余的可以按任何顺序添加，以增加安全性）： 
</p><ul><li>频繁交付 
</li><li>深思熟虑的改进 
</li><li>密切沟通；个人安全（信任的第一步） 
</li><li>聚焦 
</li><li>易于访问专家用户 
</li><li>带自动测试的技术环境 
</li><li>配置管理 
</li><li>频繁集成 </li></ul><p></p><p><a name="N101BD"><span class="smalltitle">动态系统开发方法</span></a></p><p>动态系统开发方法 (<a href="http://www.dsdm.org/"><font color="#5c81a7">DSDM</font></a>) 提供了一个用于构建和维护系统的控件框架，该框架满足紧急时间限制的要求，而且是成功进行可重复快速应用程序开发 (RAD) 的一剂药方。该方法不仅涉及开发人员对 RAD 的看法，而且还涉及对有效系统开发感兴趣的所有其他相关各方（包括用户、项目经理和质量保证人员）对 RAD 的看法。下面列出了 DSDM 的控制原则： 
</p><ul><li>活动用户必须参与。 
</li><li>必须授权 DSDM 团队进行决策。 
</li><li>注重频繁交付产品。 
</li><li>判断产品是否可接受的一个基本标准是要符合业务目的。 
</li><li>对准确的业务解决方案需要采用循环和增量开发。 
</li><li>开发期间的所有更改都是可逆的。 
</li><li>基本要求是高层次的并区分优先级（以在低优先级的项目上获得一定的灵活性）。 
</li><li>在整个生命周期集成测试。 
</li><li>在所有参与者之间采用协作和合作方法是一项基本要求。 </li></ul><p></p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1/#main"><b><font color="#996699"></font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N101E8"><span class="atitle"><font face="Arial" size="4">精益生产</font></span></a></p><p>制造业已经意识到存在两种生产问题——“可预测的生产”和“新产品开发”。前者的特征是确保具有提前了解需求的能力，因而可以制订确定性计划。后者的特征是没有事先明确了解需求的能力，因而需要随项目的进展不断地调整适应和重新评估。</p><p>Craig Larman 在他所著的 <a href="http://www.amazon.com/exec/obidos/ASIN/0131111558"><font color="#5c81a7"><i>Agile and Iterative Development</i></font></a>一书中对这些问题做了比较，得出以下结论：</p><p><a name="N101FB"><span class="smalltitle">表 1. 可预测的生产和新产品开发的比较</span></a></p><table cellspacing="0" cellpadding="0" width="100%" border="1"><tbody><tr><td><b>可预测的生产</b></td><td><b>新产品开发</b></td></tr><tr><td>可以首先完成规范，然后再构建。</td><td>几乎不可能创建提前的、不变的和详细的规范。</td></tr><tr><td>在即将开始时，可以可靠地评估所投入的精力和成本。</td><td>在即将开始时这是不可能的。随着经验数据的不断出现，进行计划和评估的可能性越来越大。</td></tr><tr><td>可以对所有详细活动进行标识、定义、安排和排序。</td><td>在即将开始时这是不可能的。需要采用通过构建反馈循环驱动的适应性步骤。</td></tr><tr><td>适应不可预测的变更不是标准要求，而且变更速度相对较慢。</td><td>创造性地适应不可预测的变更是标准要求。变更速度较快。</td></tr></tbody></table><p>例如，Toyota 在上世纪 80 年代使用“精益生产”方法对其汽车工业进行大规模改革，目的是消除浪费，精简价值链（甚至跨所有企业），按需求生产（实时生产），并注重增值人员。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1/#main"><b><font color="#996699"></font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N1023E"><span class="atitle"><font face="Arial" size="4">LSD</font></span></a></p><p>Mary 和 Tom Poppendieck 已将这些原则和实践从生产环境转用到开发环境（有关详细信息，请参见他们的<a href="http://www.poppendieck.com/"><font color="#5c81a7">网站</font></a>），目标是在整个持续改进期间确定和消除浪费，并减少缺陷和循环时间，而同时稳定地增加商业价值。LSD 的基础就在于诸如 Toyota、Dell 和 Wal-Mart 这些组织所采用的一组“精益生产”标准。</p><p>需要注意的重要一点是，像 XP、DSDM、SCRUM 等其他方法一样，LSD 在本质上并不是一种开发方法，而是提供许多应该应用于改进软件开发的基本原则，不考虑使用的开发方法和项目方法。本文的其余部分将快速回顾 LSD 的七个原则和一些工具（例如，下文中用斜体列出的思想）。</p><p><a name="N1024E"><span class="smalltitle">原则 1：消除浪费</span></a></p><p>消除浪费是最基本的精益原则。它是所有其他原则应遵循的原则。实现精益开发的第一步是<i>了解浪费</i>（没有提高代码质量，没有减少生产代码所需的时间和精力，或没有向顾客提供商业价值的任何东西）。第二步是公开最大的浪费源并消除它们。大量研究表明，在早期规范定义的功能中，最多有 45% 的功能在解决方案完成和交付后从未使用过。</p><p><a name="N1025A"><span class="smalltitle">原则 2：加强学习</span></a></p><p>在组织面对软件开发挑战时，往往在组织中安排一个用纪律强加约束的流程，这个流程有更严格的顺序关系。控制理论指出，这种做法会使情况变得更糟。当问题出现时，要做的第一件事是确保反馈循环都各司其职。要做的第二件事是在问题领域增加反馈循环的频率，因为短反馈循环将增强控制能力。</p><p>只要有几个人正在做同一件事，就需要进行“同步”。对同步的要求是任何复杂开发流程的基础。“循环”是同步的关键点（团队和客户将了解完成的任务）并强制做出决策。</p><p><a name="N10266"><span class="smalltitle">原则 3：尽可能推迟做出决定</span></a></p><p>在开发开始前确定需求是防止出现严重问题的一种通常的做法。顺序开发（例如瀑布开发模式）的问题是，它强制设计人员采用深度优先而非广度优先方法。最容易犯大错误的方式是深入研究细节的速度太快。</p><p>对于并行开发（例如，所有工作都在循环——即分析、设计、编程和测试——中完成），只要高级概念设计一确定，您就开始对具有最高价值的功能进行编程，甚至此时详细需求还在调查之中。这种探索性方法允许尝试各种选择，然后即可确定限制实现较不重要功能的做法（“选择思考”）。但并行开发要求开发人员在领域内具有足够的专门知识（以预期新兴设计可能的发展方向），并与客户和分析人员（他们设计系统如何解决现有的业务问题）进行密切合作。</p><p><a name="N10272"><span class="smalltitle">原则 4. 尽快交付</span></a></p><p>客户喜欢快速交付，这常常转化为业务灵活性的提高。对软件开发而言，快速交付是一种选择友好的方法。它允许您暂时不做出选择，直到您减少了不确定性，然后可以做出更明智的基于事实的决策。</p><p>所有人都必须始终明白，她或他应如何做才能对业务做出最有效的贡献。您可以告诉他们要做什么（“命令和控制”），也可以搭建一个舞台，让他们自己发挥（“自我组织”）。在快速变化的环境中，只有第二种选择行得通。为了有效地进行自组织，必须开发本地通信和委托方法（例如使用<a href="http://c2.com/cgi-bin/wiki?InformationRadiator"><font color="#5c81a7">信息发射器</font></a>）以<i>拉系统</i> 的方式协调工作。在具有适度可变性的复杂环境中，没有任何计划可以做出有效的细粒度工作分配。提早创建详细计划意味着将您的一些决定刻到石头上。进行计划和预期绝非坏事，但要避免根据推测做出不可更改的决定。</p><p>快速开发的好处通常大于您的预期。为下几年推出的某种新产品创建简单的经济模型（基本上为损益表 (P&amp;L)），并使用该经济模型推动开发决策。根据市场情况很好地评估哪些延迟将对销售量（例如，早期的高定价损失）和市场份额（例如，市场份额的长期损失）产生影响。该模型将显示在收入和市场份额之间哪种差异将对收益产生影响。</p><p><a name="N10288"><span class="smalltitle">原则 5：向团队授权</span></a></p><p>通常，改进计划其实并未改变完成工作的方式。这些计划增加了导致工作满意度下降的因素（策略、监督和管理）而没有增加导致工作满意度提高的因素（成绩、认同和责任）。精益思想利用一线工人的聪明才智，相信他们是有能力决定和继续改进其工作方式的人。要是没有遵守纪律、受到激励的人员，软件开发就不能成功，而实验和反馈往往比一次将事情做成更有效。</p><p><a name="N10291"><span class="smalltitle">原则 6：构建完整性</span></a></p><p>一个产品如果它的各个组件互相匹配并协调工作得很好，则这个产品就具有<i>概念上的完整性</i>；体系结构将在下列各项之间获得有效的平衡： 
</p><ul><li>灵活性 
</li><li>可维护性 
</li><li>有效性 
</li><li>响应能力 </li></ul>要获得概念上的完整性，请降低控制机制的重要性，这有利于： 
<ul><li>面对面讨论 
</li><li>小批量 
</li><li>速度 
</li><li>流程 </li></ul><p></p><p>不是从一开始就尝试预测将来的趋势，而是采用宽度优先的方法并保证基本要素正确。然后，让细节浮现出来并对定期重构制订计划，以让体系结构保持健康状态。重构意味着在检测到“异味”时停止工作（例如停止添加新功能），然后在继续开发前，花时间查找和修复问题的根源。</p><p>重构只能在测试具有严格的安全保证时才能进行。测试应尽可能自动完成，并作为每日构建和持续构建的一部分运行。请在系统的整个生命周期维护一组综合性测试。这样，系统即可在其有用的生命周期中安全地进行修复和重构。如果没有足够的时间来进行测试，则首先要重新分配在需求文档中编写客户测试所投入的精力。</p><p><a name="N102C1"><span class="smalltitle">原则 7：眼观全局</span></a></p><p>系统越复杂，就越倾向于将系统分为几部分并在本地管理这些部分。本地管理倾向于创建本地性能度量。这些本地度量经常产生导致整体性能降低的系统级结果（局部优化）。虽然 Lance Armstrong 赢得 1999 到 2005 的环法自行车赛的冠军，但他只赢得几次每日登台领奖的机会。就像环法自行车赛，优化每个任务通常是一个很糟糕的策略。</p><p>通过知识工作 (knowledge work)，很难度量每件事情是否重要，特别是在每次努力都是唯一性和不确定性占优势时。如果您不能度量每件事情的重要性，则部分度量就很有可能转为本地管理。如果您不能度量优化整体业务目标所需的每件事情，则在没有采用局部优化度量的情况下，最好停止度量。</p><p>从项目经理的角度看，在管理项目时，可以调整 4 个变量：时间、成本、质量和范围。在这 4 个变量中，可以修改时间、成本和质量——但范围除外。对功能区分优先级，但不在合同中指定要交付的固定功能集合。从固定范围移到<a href="http://c2.com/cgi/wiki?OptionalScopeContracts"><font color="#5c81a7">可协商范围</font></a>的方法：先交付高优先级功能，这样就可以早在完全满足客户的一系列期望前交付具有商业价值的大部分产品。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1/#main"><b><font color="#996699"></font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N102D4"><span class="atitle"><font face="Arial" size="4">敏捷体系结构</font></span></a></p><p><a name="N102DA"><span class="smalltitle">不预先进行任何宏大设计</span></a></p><p>软件开发方法采用不同的方法来开发项目的体系结构：Rational Unified Process (RUP) 解决了早期的体系结构风险问题（“如果您没有主动解决风险，则这些风险将会伤及您”），而 XP 要求<a href="http://xp.c2.com/BigDesignUpFront.html"><font color="#5c81a7">“不预先进行任何宏大设计”</font></a>。Scrum 只预先定义足够用的体系结构，但之后以增量的方式交付体系结构——区分优先级的方式与其余的功能相同。</p><p>从敏捷的角度看，以下这些做法是不明智的：在项目开始时了解所有需求，分析这些需求，然后为整个系统开发体系结构，就像在瀑布模型中一样。重要的是要平衡早期体系结构稳定性和更改的实现之间的需求。当然，一次又一次地修改重要的体系结构成本非常高。另一方面，如果决策很糟糕且不适合已变化的需求，则越早而非越迟改变决策就越好。</p><p><a name="N102EA"><span class="smalltitle">确认而非验证</span></a></p><p>不论您在开发体系结构时使用何种方法 (approach)，都需要根据用户的期望（而不根据需求）确认体系结构。这种确认只能通过开发部分解决方案（“骨架”、“衍生应用程序”和“曳光弹”）来演示体系结构是可行的。然后，逐步用细节充实体系结构骨架。</p><p><a name="N102F3"><span class="smalltitle">何时开展体系结构工作</span></a></p><p>传统上，在早期项目阶段，体系结构工作进展到何种程度是由开发团队来决定的。某些敏捷开发方法（例如 XP 和 Scrum）将功能需求和非功能需求放在公共 backlog 中，然后让客户优先选择需求。在客户根据商业价值和关键程度对需求进行优先选择后，开发团队评估投入的精力和成本，然后引入可能带来体系结构风险的专门知识。因此，体系结构是随着需求而逐步开发完成的。</p><p>最近，有关何时开展体系结构工作的决定已进行合理处理，该决定不仅是技术决定，而且也是商业和财务决定。<a href="http://csdl.computer.org/comp/mags/so/2004/03/s3toc.htm"><font color="#5c81a7">增量基金方法</font></a>将需求细分成最小可市场化功能（ Minimum Marketable Features，MMF），并将体系结构细分为体系结构元素（Architecture Elements，AE）。基于启发式方法，MMF 和 AE 按次序来优化各个财务目标（例如最大程度增加 ROI、最大程度减少现金投入、获得较早的回报等）。客户可以了解和评估各个体系结构选项及其财务负担。开发团队将了解提前开发所有体系结构和逐步交付体系结构的财务因素。</p><p>传统方法和早期的敏捷方法都是一种“贪婪的方法”：传统方法先“攻击”最具风险的部分，而早期的敏捷方法先“攻击”最有价值的部分。IFM 允许客户和开发团队选择最有益的方法。</p><p><a name="N10306"><span class="smalltitle">服务的持续重构</span></a></p><p>在 SOA 上下文中，一个应用程序决不会作为单独的应用程序出现。就像我们在 SOA 应用程序中所讲述的那样，服务应用程序有多种用户，因而存在各种应用程序之间的依赖关系，这一点作为服务模型中的服务依赖性清楚描述过。任何服务都应被考虑是否有可能被其他应用程序重用。因此，服务应用程序必须被认为是可重用的产品。实际上，这意味着敏捷性无可置疑地变得更重要了，因为应用程序使用者的数量增加了。这些使用者不仅有最终用户，而且也有成为应用程序的使用者/客户的其他应用程序。随着客户数量的增加，更改的数量当然也会增加，因为并非所有的用户都有预见能力。</p><p>在驱动敏捷开发的 SOA 中存在一个中心因素：服务模型，即服务、服务的依赖性、组织和流程的模型。在第一个订单交付后，服务模型就随着时间及服务接口的定义而发展。公司将认识到其服务模型的当前版本具有弱点，因为没有采用正确的方法定义服务的责任。它们不得不将责任从一个服务（或服务的一个版本）移到另一个服务，并更改服务接口。服务模型的重构是无法避免的，并且在敏捷软件开发中，我们鼓励进行持续重构。</p><p>重构服务意味着通过将责任从一个服务转移到另一个服务来更改接口。这可以使用服务模型有控制地完成。服务模型成为 SOA 中进行敏捷开发的基本工具，因为没有该工具，就很难控制服务重构。因为我们采用了服务模型，我们准备将敏捷软件开发扩展到 SOA 级别！</p><p>从敏捷 SOA 前沿传来一个好消息：敏捷性还变得较容易管理了。通过更改组合服务的服务编排，您可以捕获业务流程中的更改。编排中的更改比基本服务实现中的更改更简单。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1/#main"><b><font color="#996699"></font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N10318"><span class="atitle"><font face="Arial" size="4">结束语</font></span></a></p><p>在这个由两部分组成系列文章的第 1 部分，我们介绍了 SOA 的概念、敏捷软件开发和 LSD，并尝试概述敏捷或精益原则和实践对体系结构（包括服务体系结构）的影响。</p><p>本系列的第 2 部分尝试将每种精益软件原则与 SOA 开发混合起来。这种混合与文章的第 1 部分“敏捷开发”一章一起，构成了敏捷 SOA 开发的基础。</p><img src ="http://www.cppblog.com/zhangji198543/aggbug/5710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 03:52 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面向服务的敏捷：成功的面向服务的体系结构 (SOA) 开发的方法，第 2 部分: 如何使油和水相溶</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5709.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 19:50:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5709.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5709.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5709.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5709.html</trackback:ping><description><![CDATA[
		<blockquote>本文探讨了各种方法，例如 Scrum、极限编程（Extreme Programming，XP）、Crystal、动态系统开发方法（Dynamic Systems Development Method，DSDM）等等，它们专注于精益软件开发（Lean Software Development，LSD）的概念。在这个由两部分组成的关于敏捷软件开发的系列中，作者详细地评估了它们对于开发面向服务的体系结构（Service-Oriented Architecture，SOA）的适宜性。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N10078">
						<span class="atitle">
								<font face="Arial" size="4">引言</font>
						</span>
				</a>
		</p>
		<p>正如我们在本系列的<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1"><font color="#5c81a7">第 1 部分</font></a>中所阐释的，面向服务的体系结构 (SOA) 和敏捷开发两个概念都旨在用于可适应的企业 IT 系统。然而，在关于 SOA 开发和敏捷方法的主题的 <a href="http://www.cbdiforum.com/"><font color="#5c81a7">CBDI</font></a> 说明中提到，敏捷开发和 SOA，就如同油和水一样，不能溶合在一起。所以，如果头脑中已经有了这样的想法，您还真的可以像 SOA 那样来将敏捷开发原则扩展到多应用程序环境中吗？在本系列的这一部分中，我们提供了证据来证明答案是“肯定的”。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile2.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1008A">
						<span class="atitle">
								<font face="Arial" size="4">SOA 和精益软件开发：Fit-Gap 分析</font>
						</span>
				</a>
		</p>
		<p>通过依次介绍每个精益软件开发原则，我们研究如何使用它们来使 SOA 的开发从中受益。除此之外，我们还讨论了它们在使用敏捷方法的环境中的好处。下表给出了 LSD 原则与其在敏捷方法的环境中带给 SOA 开发和交付的基本好处之间的初始高级映射。</p>
		<br />
		<a name="table1">
				<b>表 1. LSD 与 SOA 原则的初始映射</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="1">
				<tbody>
						<tr>
								<td width="180">
										<b>LSD 原则</b>
								</td>
								<td>
										<b>SOA 的好处</b>
								</td>
						</tr>
						<tr>
								<td>1. 消除浪费</td>
								<td>
										<ol type="a">
												<li>宽度优先的服务模型开发有助于识别正确的服务候选者和重用能力。 
</li>
												<li>
														<i>值流映射 (Value stream mapping)</i>，一种用于系统地检测没有价值的处理步骤的技术，使您能够识别有价值的服务。 </li>
										</ol>
								</td>
						</tr>
						<tr>
								<td>2. 加强学习</td>
								<td>
										<ol type="a">
												<li>反馈有助于定义重用的服务。 
</li>
												<li>同步在服务的实现阶段特别有用。 </li>
										</ol>
								</td>
						</tr>
						<tr>
								<td>3. 尽可能晚地决定</td>
								<td>不确定服务接口的细节使得有可能通过实践来学习。</td>
						</tr>
						<tr>
								<td>4. 尽可能快地交付</td>
								<td>
										<ol type="a">
												<li>使用服务的情节串连图板 (Storyboard) 和“SRC 卡片”（服务 (Service)、责任 (Responsibility)、协作 (Collaboration)）来创建更小的工作单元和更高的吞吐量。 
</li>
												<li>创建约定的一个简单的经济模型，可以用于驱动开发决策。 </li>
										</ol>
								</td>
						</tr>
						<tr>
								<td>5. 向团队授权</td>
								<td>通过授权和委托微观设计决策给负责交付 SOA 中的服务的专业人员，您增加了交付服务的能力，该服务满足当前的业务需求，而不是先前预测的或者规定的业务需求。</td>
						</tr>
						<tr>
								<td>6. 构建完整性</td>
								<td>
										<ol type="a">
												<li>通过简化端到端的通信流程，确保业务流程和交付的 IT 服务之间具有更强的耦合性以及期望的服务质量（Quality of Service，QoS）。这种方法使开发人员能够确保交付的服务具有所需的完整性。 
</li>
												<li>通过解构代码和体系结构，确保开发和部署的服务能够交付所期望的 QoS，同时支持业务环境的持续改变。使用这种服务模型使受控解构成为可能。 </li>
										</ol>
								</td>
						</tr>
						<tr>
								<td>7. 眼观全局</td>
								<td>就其真实的本质来说，SOA 专注于业务流程联合，重点在于企业。通过确保工作团队坚持把工作重心放在全局性的问题上（<i>眼观全局</i>），您实现了用于确保服务验证和编排与核心业务流程紧密配合的最佳实践。</td>
						</tr>
				</tbody>
		</table>
		<p>让我们进一步详细地讨论上面的<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile2.html#table1"><font color="#996699">表 1</font></a> 中定义的映射：</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile2.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10125">
						<span class="atitle">
								<font face="Arial" size="4">原则 1：消除浪费</font>
						</span>
				</a>
		</p>
		<p>
				<a name="N1012C">
						<span class="smalltitle">宽度优先服务模型开发</span>
				</a>
		</p>
		<p>为了理解什么是重要的以及什么是多余的，使用<i>宽度优先 (breadth-first)</i> 取代<i>深度优先 (depth-first)</i> 是明智的，先取得总体认识，然后再深入细节。当开发企业级 SOA 时，您应该避免以遗漏关键部分为代价来预先构建系统无关紧要的部分的详细分析文档目录。当然，很难预知未来和灵活性的需求；因此，快速反馈是必要的。</p>
		<p>一些来自面向服务的建模和体系结构方法（Service-Oriented Modeling and Architecture Method，SOMA）的技术很好地支持“宽度优先”方法，即：自顶向下 (top-down) 域分解、自底向上 (bottom-up) 现有系统分析以及目标-服务建模（请参阅文章“<a href="http://www.ibm.com/developerworks/webservices/library/ws-soa-design1"><font color="#5c81a7">Service-oriented modeling and architecture</font></a>”）。在经过总体观察以后，决定在服务组合 (Service Portfolio) 中包含哪些服务。只有到这个时候，您才能详细地定义服务。</p>
		<p>
				<a name="N10142">
						<span class="smalltitle">值流映射</span>
				</a>
		</p>
		<p>映射值流是开始发现流程中的浪费的一种好方法。它把重点放在用户的产品及其价值上，而不是组织、资产、技术、流程和人员上。利用值流映射的结果，您可以将精力投入到给组织带来最多价值的流程和服务上。挑选最大的机会去增加流动和增值时间 (value-added time)。您可以利用这项技术来分析业务流程（将由 SOA 支持）或者软件开发流程（用于开发 SOA）。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile2.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1014B">
						<span class="atitle">
								<font face="Arial" size="4">原则 2：加强学习</font>
						</span>
				</a>
		</p>
		<p>
				<a name="N10152">
						<span class="smalltitle">反馈</span>
				</a>
		</p>
		<p>服务的“用户”是应用程序。预先设计一个用于所有应用程序的最佳重用的服务接口是不可能的。实际上，您是从初始的接口和演示程序开始，然后部署服务，最后从使用的应用程序获得反馈。一个小先遣队开发了一个简单跨系统的试验应用程序：</p>
		<ul>
				<li>采用一个业务流程 
</li>
				<li>分析和设计它的服务 
</li>
				<li>原型化用户接口 
</li>
				<li>与后端集成 
</li>
				<li>跨整个流程 </li>
		</ul>
		<p>如果可能，试验应用程序应该变成产品。当这种跨系统的应用程序在生产中得到证实时，您就知道了您有了可工作的应用程序。到了那时，多个小组就可以使用一样的方法并且每次进行多项工作。</p>
		<p>与采用瀑布方式开发整个 SOA 相比，依赖于快速交付和频繁反馈甚至更为重要，这是因为您不可能第一次就做出正确的设计。敏捷方法推动了快速反馈和热点 (Hot Spot) 的出现，这里需要灵活性。工程实践（例如测试优先开发和持续集成）减少了开发人员获得反馈的时间。增量功能的频繁交付支持来自客户或用户的直接反馈。</p>
		<p>
				<a name="N10173">
						<span class="smalltitle">同步</span>
				</a>
		</p>
		<p>敏捷方法至少使项目间的依赖关系可见，并且还有一些处理它们的工具（请参阅本系列<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1"><font color="#5c81a7">第 1 部分</font></a>中的 <i>Scrum</i> 部分）。项目间频繁同步的想法在服务的实现阶段特别有用，这里可能发生服务范围内的改变，因为正是在这一阶段详细地分析服务。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile2.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10183">
						<span class="atitle">
								<font face="Arial" size="4">原则 3：尽可能晚地决定</font>
						</span>
				</a>
		</p>
		<p>
				<a name="N1018A">
						<span class="smalltitle">不确定服务接口的细节</span>
				</a>
		</p>
		<p>在像 SOA 这样企业级的约定中，似乎最好是在非常详细的层次上设计服务接口，让不同的项目来实现它们。这种方法的优点好像是服务应用程序可以独自工作，而不需要长期地与其他项目同步。遗憾的是，这并不能正常工作，因为您无法预先确定所有的细节。面对不确定性，这样做的结果就是导致浪费（以错误的细节的方式）。长期进行来实现错误细节的项目将难以使它们的代码解构变得简单。这会产生一个未达到最佳状态、却又固定的服务模型。</p>
		<p>尽可能晚地决定意味着，在有证据可以清楚地判断服务应该是什么样子之前，不确定服务接口的细节，而不是假装无所不知。这就促使开发小组与公司的其他部门经常性地保持步调一致，而且它还产生更好的服务模型。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile2.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10196">
						<span class="atitle">
								<font face="Arial" size="4">原则 4：尽可能快地交付</font>
						</span>
				</a>
		</p>
		<p>
				<a name="N1019D">
						<span class="smalltitle">拉系统</span>
				</a>
		</p>
		<p>敏捷开发中的拉系统 (Pull System) 借助于信息发射源 (Information Radiator) 使人们能够自己确定去做什么（例如，走廊上可能有一个白板，所有相关的用户素材都写在上面的卡片上；分配工作意味着将素材卡片 (Story Card) 从白板的“to-do”区移到“checked-out”区）。</p>
		<p>在 SOA 环境中，您可以在卡片上编写用户素材和服务。通过添加服务，工作单元甚至变得更小，因为正如本系列的<a href="http://www.ibm.com/developerworks/webservices/library/ws-agile1"><font color="#5c81a7">第 1 部分</font></a>的 <i>SOA Application</i> 部分中所述，功能性是在用户界面应用程序、服务编排以及服务应用程序之间分配的。排队论指出，更小的工作包产生更高的吞吐量，例如功能的更快交付。</p>
		<p>众所周知的用于面向对象 (OO) 设计的 CRC 卡片（类 (Class)、责任 (Responsibility)、协作 (Collaboration)）技术（请参阅 <a href="http://c2.com/doc/oopsla89/paper.html"><font color="#5c81a7">A Laboratory for Teaching Object-Oriented Thinking</font></a> 以获得背景信息）可以修改成 SOA 设计中的 SRC 卡片。“<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soad1"><font color="#5c81a7">面向服务的分析与设计原理</font></a>”包括这种技术的初始示例。</p>
		<p>
				<a name="N101BB">
						<span class="smalltitle">约定的经济模型</span>
				</a>
		</p>
		<p>传统上，软件开发有时被看作是产生成本。近来，软件开发被看作是产生收入，可以帮助利用经济期权。<a href="http://www.niwotridge.com/Resources/PM-SWEResources/SWOptions.htm"><font color="#5c81a7">基于期权的软件经济</font></a>从金融市场提取出相似之处：交付运行的软件的短期迭代被看作是实物期权 (Real Option)。就像金融期权 (Financial Option) 一样，实物期权通过现在非常少量的投资，来向您提供可能从未知的将来获得收益的机会。</p>
		<p>但是并不需要走那么远：如果您创建约定的简单经济模型并使用它来驱动开发决策，甚至 SOA 约定也将从中受益。有了这个经济模型，就可以向团队成员授权，让他们自己明确什么对于业务是重要的：他们可以都从相同的假定开始工作。如果您考虑减少一些特性，销售部门可能推测出，没有这些特性，他们将少销售百分之“X”单位的产品。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile2.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101CB">
						<span class="atitle">
								<font face="Arial" size="4">原则 5：向团队授权</font>
						</span>
				</a>
		</p>
		<p>对于任何软件开发，最有资格作决定的人就是在第一线工作的人。在解决方案体系结构层次上仍然需要严格的控制，而基础服务开发应该尽可能地灵活。通过授权给最接近实现的专业人员去做微观决策，您可以确保服务的最终代码满足所需要的功能性。在企业 SOA 中，您可以从授权和委托设计决策给服务的开发人员（在定义的范围内）中受益。</p>
		<p>无论何时沿着层次结构向下委派决策权，您都必须确保所有的决策者都理解了统帅全局的愿景。通常，决策应该始终的是大家共同参与的活动，而不是孤立的活动。跨功能团队的环境（出现在敏捷项目中）促进了决策协作。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile2.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101D8">
						<span class="atitle">
								<font face="Arial" size="4">原则 6：构建完整性</font>
						</span>
				</a>
		</p>
		<p>构建在概念上具有高度完整性的 SOA 的方法是从客户到开发团队、以及开发团队的上游流程和下游流程之间都有良好的信息流。从我们的角度来看，我们认为这一原则在服务开发层次以及服务编排中具有很高的价值。通过维持业务和 IT 专业人员之间良好的通信水平，可以确信您所交付的 IT 解决方案满足当前以及未来的业务流程和需求。随着结构良好的 SOA 中的业务和 IT 之间的联系越来越紧密，逐渐要求所交付的服务能够满足和紧密配合超出目标的业务流程。如果没有这种高层次的完整性，那么交付的服务不满足必要的业务要求或 QoS 的风险将会增加。</p>
		<p>
				<a name="N101E2">
						<span class="smalltitle">解构</span>
				</a>
		</p>
		<p>现在，在 IT 产业中解构开发代码的实践得到认可已经有一段时间了。在 SOA 的环境中，这种实践同样重要。由于与业务的配合越来越紧密，以及需要确保所交付的服务可以支持不断变化且敏捷的业务环境，因此需要从本质上确保持续地评审和解构基础服务的设计。如果不能做到这一点，就将导致服务僵硬、不灵活，这对支持不断变化的业务环境没有益处。正如本系列的<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile1"><font color="#5c81a7">第 1 部分</font></a>中的 <i>Agile architecture</i> 部分所述，该服务模型是控制持续解构的出色工具。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile2.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101F2">
						<span class="atitle">
								<font face="Arial" size="4">原则 7：眼观全局</font>
						</span>
				</a>
		</p>
		<p>SOA 的一项基本原则就是企业层次上的业务联合。对于任何企业体系结构 (Enterprise Architecture) 约定，都存在一个内在的需求，即确保始终维护统帅全局的“城市规划 (city planning)”视图，并专注于将在 SOA 中部署的单个服务的详细设计。如果陷入以牺牲整体为代价来换取最佳的单个部分（或者服务）的诱惑中，您将承受交付不灵活的 SOA 的风险，它与企业中的关键业务流程是不相配的。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-agile2.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101FC">
						<span class="atitle">
								<font face="Arial" size="4">结束语和展望</font>
						</span>
				</a>
		</p>
		<p>正如我们在本系列中展示的，SOA 可以从敏捷软件实践和 LSD 的已证明有效的原则中获得极大的好处。敏捷和 SOA 这两种实践的匹配基于一个共性——两者都极力设法处理变化。服务接口应该当作实现可能将改变的应用程序的必要条件。敏捷项目为要求它们实现的服务接口的改变做好了准备。</p>
		<p>SOA 的“持续的”解构意味着经常更改服务接口和服务组合。SOA 中的这种敏捷需要实现项目中的敏捷。基于本文中所强调的要点，我们要说，当实现项目采用敏捷方法并接受改变时，SOA 中真正的敏捷将起作用。</p>
		<p>通常油和水并不能溶合在一起。不可否认，极限编程的想法和以可控的方式建立企业级服务体系结构之间存在着文化差异。但这仅仅是初步估计，在写完本文之后，我们可以声明存在一种乳化剂，即 LSD 的原则。</p>
		<p>所以，最后我们将声明，在 SOA 和 LSD 原则的上下文中，“油和水确实可以溶合”！</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 03:50 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用于实现 Web 服务的 SOA 编程模型，第 4 部分: IBM 企业服务总线介绍</title><link>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5708.html</link><dc:creator>ApriL</dc:creator><author>ApriL</author><pubDate>Sun, 16 Apr 2006 19:49:00 GMT</pubDate><guid>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5708.html</guid><wfw:comment>http://www.cppblog.com/zhangji198543/comments/5708.html</wfw:comment><comments>http://www.cppblog.com/zhangji198543/archive/2006/04/17/5708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangji198543/comments/commentRss/5708.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangji198543/services/trackbacks/5708.html</trackback:ping><description><![CDATA[
		<blockquote>企业服务总线（Enterprise Service Bus，ESB）体系结构模式支持在面向服务的体系结构 (SOA) 中虚拟化服务交互并对其进行管理。它使得交互可以在服务提供者和服务请求者之间进行，并且可以使用各种中间件技术和编程模型加以实现。它对本系列的前一篇文章中介绍的 SOA 编程模型进行了扩展。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N100AA">
						<span class="atitle">
								<font face="Arial" size="4">引言</font>
						</span>
				</a>
		</p>
		<p>SOA 提供了一种灵活的、可扩展且可组合的方法来重用和扩展现有应用程序以及构造新的应用程序。服务声明它们实现的或期望其他服务实现的接口，并且声明控制潜在伙伴交互的策略，从而公布各种功能（包括提供的和请求的）。Web 服务描述语言（Web Services Description Language，WSDL）和其他 Web 服务标准（如 WS-Policy）提供了用于这些声明的词汇。（请参阅<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#resources"><font color="#996699">参考资料</font></a>，以获得指向 WSDL Version 2.0 Part 0: Primer 的链接。）</p>
		<p>业务功能的虚拟化（SOA 的一个主要目标）是通过将服务的定义和使用与服务的实现分离开来而实现的。我们可以使用各种技术实现服务，这些技术包括 IBM WebSphere® MQ、IBM CICS® 或 IBM IMS™、Java™ 2 Platform Enterprise Edition (J2EE) Enterprise JavaBeans (EJB)、Java 类、IBM DB2® 查询、Java 消息服务 (JMS) 或 Microsoft® .NET。服务请求者将请求发送到提供其所需功能的服务提供者，而不必考虑它如何实现。</p>
		<p>ESB 是一种体系结构模式，支持虚拟化通信参与方之间的服务交互并对其进行管理。它提供服务提供者和请求者之间的连接，即使它们并非完全匹配，也能够使它们进行交互。此模式可以使用各种中间件技术和编程模型实现。</p>
		<p>本文将定义 ESB 模式和它在 SOA 内的角色。后续文章将详细描述其使用场景、使用目前的技术实现 ESB 模式的方法，以及 ESB 技术未来的发展方向。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100C0">
						<span class="atitle">
								<font face="Arial" size="4">什么是 ESB？</font>
						</span>
				</a>
		</p>
		<p>在 ESB 模式中，服务交互的参与方并不直接交互，而是通过一个总线交互，该总线提供虚拟化和管理功能来实现和扩展 SOA 的核心定义。IBM ESB 模式提供以下几方面的虚拟化：</p>
		<ul>
				<li>
						<b>位置和标识</b>：参与方不需要知道其他参与方的位置或标识。例如，请求者不需要知道请求是否可以由某个提供者提供服务。您可以随意添加或删除服务提供者，而不会带来任何干扰。 
</li>
				<li>
						<b>交互协议</b>：参与方不需要采用相同的通信协议或交互方式。表达为 SOAP/HTTP 的请求可能由仅理解 Java 远程方法调用 (RMI) 的提供者提供服务。 
</li>
				<li>
						<b>接口</b>：请求者和提供者不需要就公共接口达成协议。ESB 可以通过将请求消息转换为提供者所期望的格式来处理此类差异。 
</li>
				<li>
						<b>（交互）服务质量 (QoS)</b>：参与方声明其 QoS 要求，包括性能和可靠性、请求的授权、消息内容的加密/解密、服务交互的自动审核以及如何对请求进行路由（如根据工作负载分布标准将请求路由到可用的实现）。描述请求者和提供者的 QoS 要求和功能的策略可以由服务自己实现或者由进行不匹配补偿的 ESB 实现。 </li>
		</ul>
		<p>因此 ESB 模式使请求者不用了解服务提供者的物理实现——从应用程序开发人员和部署人员的角度来看均是如此。总线负责将请求交付给提供所需功能和 QoS 的服务提供者。提供者接收他们要响应的请求，而不知道消息的来源。ESB 本身对使用它的服务请求者和提供者均不可见。应用程序逻辑可以使用各种编程模型和技术调用或交付服务，而无需考虑是直接连接还是通过 ESB 传递的。连接到 ESB 是部署决策；应用程序源代码不会受到影响。</p>
		<p>ESB 支持许多交互类型，包括单向、请求/响应、异步、同步和发布/订阅。它还支持复杂事件处理（在复杂事件处理中，可能会观测到一系列事件），以产生一个事件作为该系列中的关系的结果。</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#fig1">
						<font color="#996699">图 1</font>
				</a> 对基本 ESB 模式进行了描述。消息流过将各个通信参与方相互连接在一起的总线。某些参与方会调用其他参与方提供的服务；而其他参与方则会向感兴趣的使用者发布信息。端点与 ESB 交互的位置称为<i>服务交互点</i> (SIP)。例如，SIP 可以是 Web 服务端点、WebSphere MQ 队列或 RMI 远程对象的代理。服务注册表将捕获描述以下内容的元数据：SIP 的要求和功能（例如，提供或需要的接口）、它们希望与其他 SIP 的交互方式（例如，同步或异步，通过 HTTP 或 JMS）、它们的 QoS 要求（例如，首选的安全、可靠交互）以及支持与其他 SIP 交互的其他信息（例如，语义注释）。</p>
		<br />
		<a name="fig1">
				<b>图 1. 基本 ESB 模式</b>
		</a>
		<br />
		<img height="307" alt="基本 ESB 模式" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/figure1.gif" width="433" />
		<br />
		<br />
		<p>将总线插入参与方之间，提供了将它们的交互通过称为<i>中介</i> 的构造进行协调的机会。中介对请求者和提供者之间动态传递的消息进行操作。对于复杂的交互，可以按顺序将中介连在一起。<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#medpat"><font color="#996699">中介模式</font></a>部分讨论了实现这些虚拟化、QoS 和管理概念的常用中介模式。</p>
		<p>ESB 模式为 SOA 实现提供了灵活且易于管理的方法。总线透明地插入端点之间，可以提高服务质量，可以促进请求者和提供者间的交互（而不受协议、交互模式或服务功能不匹配的影响），还可以支持监视和管理。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10113">
						<span class="atitle">
								<font face="Arial" size="4">SOA 用户角色及其任务</font>
						</span>
				</a>
		</p>
		<p>通过研究创建和管理 SOA 解决方案的用户的角色及任务，可以进一步深入了解 ESB 模式。ESB 工具和运行时将 SOA 解决方案的生命周期划分为四个阶段：</p>
		<ul>
				<li>
						<b>发现与描述：</b>对可以在整个 ESB 中进行互连的 SIP 进行标识和描述。这包括创建新的服务、发现现有服务、以及描述其接口、要求和功能。 
</li>
				<li>
						<b>建模与构建：</b>通过新建的或现有的中介进行 SIP 互连，以描述解决方案的端到端交互。 
</li>
				<li>
						<b>配置与部署：</b>针对特定的运行时拓扑配置解决方案的抽象声明，并对其进行部署，同时创建必要的运行时构件。 
</li>
				<li>
						<b>监视与管理：</b>通过 SIP 和中介的行为监视和管理解决方案。此阶段将使用 ESB 运行时中的检测和控制点、以及观测和响应消息流的中介。 </li>
		</ul>
		<p>对于 ESB 中间件，最重要的 SOA 解决方案开发角色是集成开发人员和解决方案管理员，但其中也涉及到业务分析人员、解决方案架构师、实现人员、适配器开发人员和操作人员。（这些角色都是概念性的；一个人可以担任其中的多个角色。）<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#fig2"><font color="#996699">图 2</font></a> 显示了这些角色交互的方式。</p>
		<p>业务分析人员确定业务需求，并检查业务流程。他们将概括出解决方案的目标、涉及的业务流程、监视解决方案的运行状况和状态的关键指标，以及 IT 系统需要提供的业务服务的类型。</p>
		<p>解决方案架构师确定哪些业务需求可以通过对现有 IT 资产进行重用、修改或组合得到满足，哪些需要编写或购买新的 IT 资产。他们定义 IT 资产间的交互，包括消息交换的内容。</p>
		<p>开发工作在三个角色中分配。实现人员编写新的应用程序代码，这些代码将通过服务接口调用。适配器开发人员构建包装现有或新采购的应用程序和软件包的服务，从而为其他服务提供可访问性。集成开发人员使用 ESB 的相关工具和技术构建逻辑，以控制请求在这些服务间路由的方式。</p>
		<br />
		<a name="fig2">
				<b>图 2. 用户角色</b>
		</a>
		<br />
		<img height="347" alt="用户角色" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/figure2.gif" width="600" />
		<br />
		<br />
		<p>解决方案管理员部署新的 IT 资产并将其服务定义导入到服务注册表中，从而使新的 IT 资产可用。当解决方案就绪后，操作人员将监视其执行，根据需要启动和停止 IT 系统，并给解决方案管理员提供建议（后者可能将据此调整解决方案配置）。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1015C">
						<span class="atitle">
								<font face="Arial" size="4">ESB 模式</font>
						</span>
				</a>
		</p>
		<p>集成开发人员和解决方案管理员会使用一组模式对 SOA 解决方案进行设计和部署。</p>
		<br />
		<a name="fig3">
				<b>图 3. 基本 ESB 模式的元素</b>
		</a>
		<br />
		<img height="334" alt="基本 ESB 模式的元素" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/figure3.gif" width="408" />
		<br />
		<br />
		<p>基本 ESB 模式将应用程序组件抽象为一个服务集，这些服务通过总线进行交互（而不是通过直接的点到点通信交互）。某个给定的服务既可以是提供者，也可以是请求者，或者同时兼有两个角色。任何 SOA 实现都会支持基本虚拟化，允许在不影响依赖请求者的情况下替换等效提供者实现。ESB 模式通过其对请求者/提供者交互的显式管理提高了此基本 SOA 功能。只要能提供与请求者所需的功能相似的功能，且 ESB 能对其进行协调，任何提供者都可以由另一个提供者替代。</p>
		<p>ESB 提供了交互点，服务可以在此将消息放到总线上或从总线取走。它会对动态消息应用中介，并保证这些托管交互的 QoS。</p>
		<p>从 ESB 的角度来看，所有的服务交互端点都是类似的，因为它们都发送或处理请求/事件；它们都要求特定的 QoS；它们可能都需要交互协助。ESB 模式允许集成开发人员以与处理新业务逻辑、流程编排组件或外部 Web 服务同样（面向服务）的方式对待与用户交互的请求者或提供者。</p>
		<p>用于构建基于 ESB 的解决方案的模式分为以下几类： 
</p>
		<ul>
				<li>
						<b>交互模式</b>：允许服务交互点将消息发送到总线或从总线接收消息。 
</li>
				<li>
						<b>中介模式</b>：允许对消息交换进行操作。 
</li>
				<li>
						<b>部署模式</b>：支持将解决方案部署到联合基础设施中。 </li>
		</ul>
		<p>
		</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10198">
						<span class="atitle">
								<font face="Arial" size="4">交互模式</font>
						</span>
				</a>
		</p>
		<p>ESB 允许端点通过总线以其本机交互模式进行交互。它支持各种端点协议和交互方式。交互模式的例子包括：</p>
		<ul>
				<li>
						<b>请求/响应：</b>处理端点间的请求/响应方式的交互。此 ESB 基于消息传递模型，因此由两个相关的单向消息流对请求/响应交互进行处理，一个用于请求，一个用于响应。 
</li>
				<li>
						<b>请求/多响应：</b>上述类型的变体，可以发送多个响应。 
</li>
				<li>
						<b>事件传播：</b>事件可以匿名分发到由 ESB 管理的相关方列表。服务可以将自身添加到该列表中。 </li>
		</ul>
		<br />
		<a name="fig4">
				<b>图 4. 交互模式</b>
		</a>
		<br />
		<img height="98" alt="交互模式" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/figure4.gif" width="315" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="medpat">
						<span class="atitle">
								<font face="Arial" size="4">中介模式</font>
						</span>
				</a>
		</p>
		<p>中介模式处理总线上的动态消息（请求或事件）。由请求者发出的消息会转换为稍微有些不兼容的提供者（从潜在的端点集中选择）能够理解的消息。</p>
		<p>这些中介操作单向消息而不是请求/响应对，因为 ESB 将交互模式放在中介模式上。</p>
		<br />
		<a name="fig5">
				<b>图 5. 中介模式</b>
		</a>
		<br />
		<img height="94" alt="中介模式" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/figure5.gif" width="590" />
		<br />
		<br />
		<p>中介有多种基本模式；更为复杂的模式可以通过组合简单模式构建：</p>
		<ul>
				<li>
						<b>协议变换：</b>允许服务请求者使用各种交互协议或 API（如 SOAP/HTTP、JMS 和 MQ Integrator——MQI）发送其消息。将请求代码转换为目标服务提供者的格式。可以应用到交互的请求者端或提供者端，或同时应用到两端或两者之间的任何位置。 
</li>
				<li>
						<b>转换：</b>将消息的有效负载（内容）从请求者的模式转换为提供者的模式。可以包含包封、反包封或加密。 
</li>
				<li>
						<b>充实：</b>通过添加来自外部数据源的信息（如由中介定义的自定义参数或者来自数据库查询的自定义参数）来增加消息的有效负载。 
</li>
				<li>
						<b>路由：</b>更改消息的路由，可从支持请求者的意图的服务提供者中选择。选择标准中可以包含消息内容和上下文、以及目标服务提供者的功能。 
</li>
				<li>
						<b>分发：</b>将消息分发到一组相关方，通常由订阅者的相关概要驱动。 
</li>
				<li>
						<b>监视：</b>在信息通过中介时观测其是否发生改变。可以用于监视服务水平；帮助确定问题或对用户进行后续支付使用的货币单位；或记录企业级事件（如价值超过一定数额的购买行为）。还可以用于将消息记入日志，以供审核和后续数据挖掘之用。 
</li>
				<li>
						<b>相关：</b>从消息或事件流中派生复杂事件。包括模式标识规则和响应模式发现的规则（例如，通过生成派生自触发事件流的内容的复杂事件）。 </li>
		</ul>
		<p>可以在解决方案中显式地配置中介。例如，集成开发人员可以配置一个 <i>enrich</i> 中介来修改消息内容。解决方案管理员可以配置一个 <i>route</i> 中介来允许其将某个服务提供者切换到脱机状态。</p>
		<p>其他中介由 ESB 设置，以满足服务请求者和服务提供者的 QoS 要求。例如，如果服务提供者的安全策略声明要求使用加密消息，则 ESB 可以自动配置一个 <i>encryption</i> 中介。</p>
		<p>策略同样也是服务的属性，解决方案管理员可以为交互（或交互集）设置策略。例如，为了将要发送到特定外部提供者或交易值超过 1 百万美元的所有消息记录到日志中。ESB 将通过配置中介（在本例中为<i>monitor</i> 中介）来实现策略。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10229">
						<span class="atitle">
								<font face="Arial" size="4">复杂模式</font>
						</span>
				</a>
		</p>
		<br />
		<a name="fig6">
				<b>图 6. 复杂模式</b>
		</a>
		<br />
		<img height="122" alt="复杂模式" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/figure6.gif" width="564" />
		<br />
		<br />
		<p>中介模式和交互模式可以进行组合，以实现更为复杂的模式。</p>
		<p>例如，在协议变换后转换格式可以实现<i>规范化适配器</i> 模式，在这种模式中，所有相关方使用的消息和业务对象集都标准化为规范的格式。规范化适配器模式将端点的本机总线附加协议转换为标准协议，实现有效负载规范化，并在交付时进行这些转换的反向转换。</p>
		<p>另一种常见的复杂中介是<i>转换、记录和路由</i> 模式。</p>
		<p>
				<i>网关</i> 模式是一个复杂的协议变换变体。它可以合并转换和监视中介，以提供加密、日志记录或审核等功能。它还可以对一对多关系中的消息进行聚合和反聚合。服务门户是此类模式的代表，它为多个服务提供单一联系点，并隐藏内部服务的细节。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10256">
						<span class="atitle">
								<font face="Arial" size="4">部署模式</font>
						</span>
				</a>
		</p>
		<p>解决方案管理可以选择多种 ESB 拓扑。下面是一些常见的例子：</p>
		<ul>
				<li>
						<b>全局 ESB：</b>所有服务共享一个名称空间，每个服务提供者对环境（异构、集中管理但分布在多个地理位置）中所有服务请求者均可见。供部门或小型企业使用，其中，所有服务都可能在整个组织中应用。 
</li>
				<li>
						<b>直接连接的 ESB：</b>公共服务注册中心使几个独立的 ESB 安装中的所有服务均可见。用于由业务部门提供和管理服务但整个企业中均可使用这些服务的场合。 
</li>
				<li>
						<b>代理 ESB：</b>桥接服务有选择地将请求者或提供者公开给其他域中的合作伙伴，从而控制多个 ESB 安装（每个安装都管理自己的名称空间）间的共享。ESB 间的服务交互通过实现桥接服务的公共代理进行。供各个部门使用，这些部门开发和管理自己的服务，但共享其中部分服务或者有选择地访问企业提供的服务。 
</li>
				<li>
						<b>联合 ESB：</b>将多个依赖 ESB 联合到其中的主 ESB。服务使用者和提供者连接到主 ESB 或某个依赖 ESB，以访问整个网络中的服务。供希望在一个监管部门的保护下联合有适度自治权的部门的组织使用。 </li>
		</ul>
		<br />
		<a name="fig7">
				<b>图 7. ESB 部署模式</b>
		</a>
		<br />
		<img height="347" alt="ESB 部署模式" src="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/figure7.gif" width="573" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel4/#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1028A">
						<span class="atitle">
								<font face="Arial" size="4">结束语</font>
						</span>
				</a>
		</p>
		<p>ESB 模式扩展了 SOA 的虚拟化功能。可以由标准功能单元组成中介，然后进行部署，以帮助不匹配的请求者和提供者进行交互。ESB 还提供了用于部署和管理服务的通用模型。ESB 概念允许根据用户角色单独进行考虑，从而减少了单个工作人员的概念上的负担，并改进了体系结构的可用性。ESB 的综合编程模型、组件化工具以及基础设施极大地支持了 SOA 原则的提前实现。</p>
<img src ="http://www.cppblog.com/zhangji198543/aggbug/5708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangji198543/" target="_blank">ApriL</a> 2006-04-17 03:49 <a href="http://www.cppblog.com/zhangji198543/archive/2006/04/17/5708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>