﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-esoa-文章分类-f. 架构.SOA研究</title><link>http://www.blogjava.net/esoa/category/16073.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 04:01:31 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 04:01:31 GMT</pubDate><ttl>60</ttl><item><title>links</title><link>http://www.blogjava.net/esoa/articles/83705.html</link><dc:creator>comchyi</dc:creator><author>comchyi</author><pubDate>Mon, 27 Nov 2006 01:14:00 GMT</pubDate><guid>http://www.blogjava.net/esoa/articles/83705.html</guid><wfw:comment>http://www.blogjava.net/esoa/comments/83705.html</wfw:comment><comments>http://www.blogjava.net/esoa/articles/83705.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/esoa/comments/commentRss/83705.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/esoa/services/trackbacks/83705.html</trackback:ping><description><![CDATA[
		<div class="postTitle"> </div>
		<div class="postText">
				<table height="148" cellspacing="1" cellpadding="0" width="781" bgcolor="#003366" border="0">
						<tbody>
								<tr>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://www-304.ibm.com/jct09002c/isv/soa/index.html" target="_blank">SOA from IBM for Business Partners </a>
										</td>
										<td class="STYLE19" width="529" bgcolor="#ffffff">
												<a class="STYLE20" href="http://www-304.ibm.com/jct09002c/isv/soa/index.html" target="_blank">http://www-304.ibm.com/jct09002c/isv/soa/index.html</a>
										</td>
								</tr>
								<tr>
										<td class="STYLE19" width="249" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://www-306.ibm.com/software/info/developer/solutions/soadev/index.jsp" target="_blank">SOA design &amp; development</a>
										</td>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://www-306.ibm.com/software/info/developer/solutions/soadev/index.jsp" target="_blank">http://www-306.ibm.com/software/info/developer/solutions/soadev/index.jsp</a>
										</td>
								</tr>
								<tr>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://www-128.ibm.com/developerworks/webservices/newto/" target="_blank">New to SOA and Web services</a>
										</td>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://www-128.ibm.com/developerworks/webservices/newto/" target="_blank">http://www-128.ibm.com/developerworks/webservices/newto/</a>
										</td>
								</tr>
								<tr>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://www-128.ibm.com/developerworks/webservices" target="_blank">SOA and Web services</a>
										</td>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://www-128.ibm.com/developerworks/webservices" target="_blank">http://www-128.ibm.com/developerworks/webservices</a>
										</td>
								</tr>
								<tr>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<span class="STYLE20">
														<a href="http://www-900.cn.ibm.com/cn/software/websphere/partner/soa/index.shtml" target="_blank">IBM SOA 合作伙伴社区(</a>
														<a href="http://tech.ccidnet.com/pub/series/s627.html">中文)</a>
												</span>
										</td>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://www-900.cn.ibm.com/cn/software/websphere/partner/soa/index.shtml" target="_blank">http://www-900.cn.ibm.com/cn/software/websphere/partner/soa/index.shtml</a>
										</td>
								</tr>
								<tr>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://tech.ccidnet.com/pub/series/s627.html" target="_blank">赛迪网SOA专区(中文)</a>
										</td>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://tech.ccidnet.com/pub/series/s627.html" target="_blank">http://tech.ccidnet.com/pub/series/s627.html</a>
										</td>
								</tr>
								<tr>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://www-128.ibm.com/developerworks/tw/library/ws-soa-govern/" target="_blank">SOA 管理案例(繁体中文)</a>
										</td>
										<td class="STYLE19" bgcolor="#ffffff" height="20">
												<a class="STYLE20" href="http://www-128.ibm.com/developerworks/tw/library/ws-soa-govern/" target="_blank">http://www-128.ibm.com/developerworks/tw/library/ws-soa-govern/</a>
										</td>
								</tr>
						</tbody>
				</table> <br /><br /><p id="TBPingURL">Trackback: <a href="http://tb.blog.csdn.net/TrackBack.aspx?PostId=1110612">http://tb.blog.csdn.net/TrackBack.aspx?PostId=1110612</a> 转贴</p></div>
<img src ="http://www.blogjava.net/esoa/aggbug/83705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/esoa/" target="_blank">comchyi</a> 2006-11-27 09:14 <a href="http://www.blogjava.net/esoa/articles/83705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是SOA(续)</title><link>http://www.blogjava.net/esoa/articles/74129.html</link><dc:creator>comchyi</dc:creator><author>comchyi</author><pubDate>Mon, 09 Oct 2006 09:19:00 GMT</pubDate><guid>http://www.blogjava.net/esoa/articles/74129.html</guid><wfw:comment>http://www.blogjava.net/esoa/comments/74129.html</wfw:comment><comments>http://www.blogjava.net/esoa/articles/74129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/esoa/comments/commentRss/74129.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/esoa/services/trackbacks/74129.html</trackback:ping><description><![CDATA[
		<center>
				<span style="FONT-SIZE: 20px">
						<b>[SOA介绍]什么是SOA? <b><a class="wiki_link" title="wiki link" href="http://wiki.matrix.org.cn/Wiki.jsp?page=Varargs"><font color="#002c99">Varargs</font></a></b></b>
				</span>
		</center>
		<br />
		<center>An introduction to SOA </center>
		<br />
		<center>作者：Raghu R. Kodali </center>
		<br />
		<center>译者：<a href="http://www.matrix.org.cn/user.shtml?username=tetsu" target="_new"><font color="#002c99">tetsu</font></a></center>
		<br />
		<br />
		<br />
		<br />
		<br />
		<span style="COLOR: red">版权声明：本文可以自由转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明</span>
		<br />作者:Raghu R. Kodali <a href="http://www.matrix.org.cn/user.shtml?username=tetsu" target="_new"><font color="#002c99">tetsu</font></a>(作者的Blog:<a href="http://blog.matrix.org.cn/page/tetsu" target="_new"><font color="#002c99">http://blog.matrix.org.cn/page/tetsu</font></a>)<br />原文:<a href="http://www.javaworld.com/javaworld/jw-06-2005/jw-0613-soa.html" target="_new"><font color="#002c99">http://www.javaworld.com/javaworld/jw-06-2005/jw-0613-soa.html</font></a><br />中文:<a href="http://www.matrix.org.cn/resource/article/44/44070_SOA.html" target="_new"><font color="#002c99">http://www.matrix.org.cn/resource/article/44/44070_SOA.html</font></a><br />关键字:SOA<br /><br /><b><span style="FONT-SIZE: 16px">摘要</span></b><br />在最近的软件发展中，面向服务架构（SOA, service-oriented architecture）成为了时下的热门话题。这篇文章将向大家介绍SOA， 讨论企业为什么需要SOA，什么是SOA， 从核心，平台，服务品质3个层面来解释SOA的基础构成。<br />By Raghu R. Kodali <br /><br /><br /><br />对于面向同步和异步应用的，基于请求/响应模式的分布式计算来说，SOA是一场革命。一个应用程序的业务逻辑（business logic）或某些单独的功能被模块化并作为服务呈现给消费者或客户端。这些服务的关键是他们的松耦合特性。例如，服务的接口和实现相独立。应用开发人员或者系统集成者可以通过组合一个或多个服务来构建应用，而无须理解服务的底层实现。举例来说，一个服务可以用.NET或J2EE来实现，而使用该服务的应用程序可以在不同的平台之上，使用的语言也可以不同。<br /><br />SOA有以下特性<br />        SOA服务具有平台独立的自我描述XML文档。Web服务描述语言（WSDL, Web Services Description Language）是用于描述服务的标准语言。<br />        SOA 服务用消息进行通信，该消息通常使用XML Schema来定义（也叫做XSD, XML Schema Definition）。消费者和提供者或消费者和服务之间的通信多见于不知道提供者的环境中。服务间的通讯也可以看作企业内部处理的关键商业文档。<br />        在一个企业内部，SOA服务通过一个扮演目录列表（directory listing）角色的登记处(Registry)来进行维护。应用程序在登记处（Registry）寻找并调用某项服务。统一描述，定义和集成(UDDI, Universal Description, Definition, and Integration)是服务登记的标准。<br />        每项SOA服务都有一个与之相关的服务品质（QoS, quality of service）。QoS的一些关键元素有安全需求（例如认证和授权），可靠通信（译注：可靠消息是指，确保消息“仅且仅仅”发送一次，从而过滤重复信息。），以及谁能调用服务的策略。<br /><br /><b><span style="FONT-SIZE: 16px">为什么选择SOA？</span></b><br /><br />不同种类的操作系统，应用软件，系统软件和应用基础结构（application infrastructure）相互交织，这便是IT企业的现状。一些现存的应用程序被用来处理当前的业务流程（business processes），因此从头建立一个新的基础环境是不可能的。企业应该能对业务的变化做出快速的反应，利用对现有的应用程序和应用基础结构（application infrastructure）的投资来解决新的业务需求，为客户，商业伙伴以及供应商提供新的互动渠道，并呈现一个可以支持有机业务（organic business）的构架。SOA凭借其松耦合的特性，使得企业可以按照模块化的方式来添加新服务或更新现有服务，以解决新的业务需要，提供选择从而可以通过不同的渠道提供服务，并可以把企业现有的或已有的应用作为服务， 从而保护了现有的IT基础建设投资。<br /><br />如图1的例子所示，一个使用SOA的企业，可以使用一组现有的应用来创建一个供应链复合应用（supply chain composite application），这些现有的应用通过标准接口来提供功能。<br /><br /><img style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2005_12_26_013605_JkeHCgsFiO.gif" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />Figure 1. Supply chain application. Click on thumbnail to view full-sized image.         <br /><br /><br /><b><span style="FONT-SIZE: 16px">服务架构</span></b><br /><br />为了实现SOA，企业需要一个服务架构，图2显示了一个例子：<br /><br /><img style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2005_12_26_013611_yqrBhZilNV.gif" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />Figure 2. A sample service architecture. Click on thumbnail to view full-sized image.        <br /><br />在图2中， 服务消费者（service consumer）可以通过发送消息来调用服务。这些消息由一个服务总线（service bus）转换后发送给适当的服务实现。这种服务架构可以提供一个业务规则引擎（business rules engine），该引擎容许业务规则被合并在一个服务里或多个服务里。这种架构也提供了一个服务管理基础（service management infrastructure），用来管理服务，类似审核，列表（billing），日志等功能。此外，该架构给企业提供了灵活的业务流程，更好地处理控制请求（regulatory requirement），例如Sarbanes Oxley（SOX），并且可以在不影响其他服务的情况下更改某项服务。<br /><br /><b><span style="FONT-SIZE: 16px">SOA基础结构</span></b><br /><br />要运行，管理SOA应用程序，企业需要SOA基础，这是SOA平台的一个部分。SOA基础必须支持所有的相关标准，和需要的运行时容器。图3所示的是一个典型的SOA基础结构。接下来的章节将逐一讨论该结构的每个部分。<br /><br /><img style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2005_12_26_013615_etaJVHxcqM.gif" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />Figure 3. A typical SOA infrastructure. Click on thumbnail to view full-sized image.         <br /><br /><b>SOAP, WSDL, UDDI</b><br />WSDL，UDDI和SOAP是SOA基础的基础部件。WSDL用来描述服务；UDDI用来注册和查找服务；而SOAP，作为传输层，用来在消费者和服务提供者之间传送消息。SOAP是Web服务的默认机制，其他的技术为可以服务实现其他类型的绑定。一个消费者可以在UDDI注册表（registry）查找服务，取得服务的WSDL描述，然后通过SOAP来调用服务。<br /><br /><b>WS-I Basic Profile</b><br />WS-I Basic Profile，由Web服务互用性组织（Web Services Interoperability Organization）提供，是SOA服务测试与互用性所需要的核心构件。服务提供者可以使用Basic Profile测试程序来测试服务在不同平台和技术上的互用性。<br /><br /><b>J2EE 和 .Net</b><br />尽管J2EE和.NET平台是开发SOA应用程序常用的平台，但SOA不仅限于此。像J2EE这类平台，不仅为开发者自然而然地参与到SOA中来提供了一个平台，还通过他们内在的特性，将可扩展性，可靠性，可用性以及性能引入了SOA世界。新的规范，例如 JAXB（Java API for XML Binding），用于将XML文档定位到Java类；JAXR（Java API for XML Registry）用来规范对UDDI注册表（registry）的操作；XML-RPC（Java API for XML-based Remote Procedure Call）在J2EE1.4中用来调用远程服务，这使得开发和部署可移植于标准J2EE容器的Web服务变得容易，与此同时，实现了跨平台（如.NET）的服务互用。<br /><br /><b>服务品质</b><br />在企业中，关键任务系统（mission-critical system，译注：关键任务系统是指如果一个系统的可靠性对于一个组织是至关重要的，那么该系统就是该企业的关键任务系统。比如，电话系统对于一个电话促销企业来说就是关键任务系统，而文字处理系统就不那么关键了。）用来解决高级需求，例如安全性，可靠性，事物。当一个企业开始采用服务架构作为工具来进行开发和部署应用的时候，基本的Web服务规范，像WSDL，SOAP，以及UDDI就不能满足这些高级需求。正如前面所提到的，这些需求也称作服务品质（QoS，quality of services）。与QoS相关的众多规范已经由一些标准化组织（standards bodies）提出，像W3C（World Wide Web Consortium）和OASIS（the Organization for the Advancement of Structured Information Standards）。下面的部分将会讨论一些QoS服务和相关标准。<br /><br /><b>安全</b><br />Web服务安全规范用来保证消息的安全性。该规范主要包括认证交换， 消息完整性和消息保密。该规范吸引人的地方在于它借助现有的安全标准，例如，SAML（as Security Assertion Markup Language）来实现web服务消息的安全。OASIS正致力于Web服务安全规范的制定。<br /><br /><b>可靠</b><br />在典型的SOA 环境中，服务消费者和服务提供者之间会有几种不同的文档在进行交换。具有诸如“仅且仅仅传送一次”（ once-and-only-once delivery），“最多传送一次”（ at-most-once delivery），“重复消息过滤”（duplicate message elimination），“保证消息传送”（guaranteed message delivery）等特性消息的发送和确认，在关键任务系统（mission-critical systems）中变得十分重要。WS-Reliability 和 WS-ReliableMessaging是两个用来解决此类问题的标准。这些标准现在都由OASIS负责。<br /><br /><b>策略</b><br />服务提供者有时候会要求服务消费者与某种策略通信。比如，服务提供商可能会要求消费者提供Kerberos安全标示，才能取得某项服务。这些要求被定义为策略断言（policy assertions）。一项策略可能会包含多个断言。WS-Policy用来标准化服务消费者和服务提供者之间的策略通信。<br /><br /><b>控制</b><br />当企业着手于服务架构时，服务可以用来整合数据仓库（silos of data），应用程序，以及组件。整合应用意味着例如异步通信，并行处理，数据转换，以及校正等进程请求必须被标准化。在SOA中，进程是使用一组离散的服务创建的。BPEL4WS 或者 WSBPEL（Web Service Business Process Execution Language）是用来控制这些服务的语言。WSBPEL目前也由OASIS负责。<br /><br /><b>管理</b><br />随着企业服务的增长，所使用的服务和业务进程的数量也随之增加，一个用来让系统管理员管理所有运行在多相环境下的服务的管理系统就显得尤为重要。WSDM（Web Services for Distributed Management）规定了任何根据WSDM实现的服务都可以由一个WSDM适应（WSDM-compliant）的管理方案来管理。<br /><br />其它的qos特性，比如合作方之間的溝通和通訊，多個服務之間的事務處理，都在WS-Coordination 和 WS-Transaction 標準中描述， 這些都是OASIS 的工作.<br /><br /><b>SOA 不是Web服务</b><br />在理解SOA和Web服务的关系上，经常发生混淆。根据2003年4月的Gartner报道，Yefim V. Natis就这个问题是这样解释的：“Web服务是技术规范，而SOA是设计原则。特别是Web服务中的WSDL，是一个SOA配套的接口定义标准：这是Web服务和SOA的根本联系。”从本质上来说，SOA是一种架构模式，而Web服务是利用一组标准实现的服务。Web服务是实现SOA的方式之一。用Web服务来实现SOA的好处是你可以实现一个中立平台，来获得服务，而且随着越来越多的软件商支持越来越多的Web服务规范，你会取得更好的通用性。<br /><br /><b><span style="FONT-SIZE: 16px">SOA的优势</span></b><br /><br />SOA的概念并非什么新东西，SOA不同于现有的分布式技术之处在于大多数软件商接受它并有可以实现SOA的平台或应用程序。SOA伴随着无处不在的标准，为企业的现有资产或投资带来了更好的重用性。SOA能够在最新的和现有的应用之上创建应用；SOA能够使客户或服务消费者免予服务实现的改变所带来的影响；SOA能够升级单个服务或服务消费者而无需重写整个应用，也无需保留已经不再适用于新需求的现有系统。总而言之，SOA以借助现有的应用来组合产生新服务的敏捷方式，提供给企业更好的灵活性来构建应用程序和业务流程。<br /><br /><b>About the author</b><br />Raghu R. Kodali is consulting product manager and SOA evangelist for Oracle Application Server. Kodali leads next-generation SOA initiatives and J2EE feature sets for Oracle Application Server, with particular expertise in EJB, J2EE deployment, Web services, and BPEL. Prior to product management, Kodali held presales and technical marketing positions in Oracle Asia-Pacific, based in Singapore. Prior to Oracle, he worked as software developer with National Computer Systems, Singapore. He holds a master's degree in computer science and is a frequent speaker at technology conferences. Kodali maintains an active blog at Loosely Coupled Corner <br /><br /><b><span style="FONT-SIZE: 16px">资源</span></b><br />·<a href="http://www.matrix.org.cn/" target="_new"><font color="#002c99">Java开发者社区</font></a>:<a href="http://www.matrix.org.cn/" target="_new"><font color="#002c99">http://www.matrix.org.cn</font></a><br />·javaworld.com:<a href="http://javaworld.com/" target="_new"><font color="#002c99">javaworld.com</font></a><br />WS-I: http://www.ws-i.org <br />JAXB: http://www.java.sun.com/xml/jaxb <br />JAXR: http://java.sun.com/xml/jaxr <br />OASIS: http://www.oasis-open.org/home/index.php <br />SAML: http://www.oasis-open.org/specs/index.php#samlv1.0 <br />SOAP: http://www.w3.org/TR/soap/ <br />SOX: http://www.sarbanes-oxley.com/ <br />UDDI: http://www.uddi.org/specification.html <br />W3C: http://www.w3.org/2002/ws/ <br />WSDL: http://www.w3.org/TR/wsdl <br />WSBPEL: http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsbpel <br />WS-Reliability: http://www.oasis-open.org/specs/index.php#wsrv1.1 <br />WS-ReliableMessaging: http://xml.coverpages.org/WS-ReliableMessaging200502.pdf <br />Web Services Security: http://www.oasis-open.org/specs/index.php#wssv1.0 <br />WS-I Basic Profile:http://www.ws-i.org/deliverables/workinggroup.aspx?wg=basicprofile <br />WSDM: http://www.oasis-open.org/committees/tc_home.php <br />XSD: http://www.w3.org/XML/Schema <br />Gartner: http://www.gartner.com/Init <br />To read about BEA's recent product offering in the SOA space, read "BEA's Patrick Discusses Project Free Flow," Paul Krill, InfoWorld (JavaWorld, June 2005): http://www.javaworld.com/javaworld/jw-06-2005/jw-0613-iw-bea.html <br />For more on SOA, read "Event-Driven Services in SOA," Jeff Hanson (JavaWorld, January 2005): http://www.javaworld.com/javaworld/jw-01-2005/jw-0131-soa.html <br />For more articles on Web services, browse the Java and Web Services section of JavaWorld's Topical Index: http://www.javaworld.com/channel_content/jw-webserv-index.shtml <br />For more articles on enterprise development, browse the Enterprise Java section of JavaWorld's Topical Index: <br />http://www.javaworld.com/channel_content/jw-enterprise-index.shtml <br /><img src ="http://www.blogjava.net/esoa/aggbug/74129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/esoa/" target="_blank">comchyi</a> 2006-10-09 17:19 <a href="http://www.blogjava.net/esoa/articles/74129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOA架构中的事件驱动服务</title><link>http://www.blogjava.net/esoa/articles/74128.html</link><dc:creator>comchyi</dc:creator><author>comchyi</author><pubDate>Mon, 09 Oct 2006 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/esoa/articles/74128.html</guid><wfw:comment>http://www.blogjava.net/esoa/comments/74128.html</wfw:comment><comments>http://www.blogjava.net/esoa/articles/74128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/esoa/comments/commentRss/74128.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/esoa/services/trackbacks/74128.html</trackback:ping><description><![CDATA[
		<center>
				<b>
						<span style="FONT-SIZE: 20px">SOA架构中的事件驱动服务</span>
				</b>
		</center>
		<p>
				<br /> </p>
		<center>使用Mule框架设计事件驱动和面向服务的平台</center>
		<p>
				<br /> </p>
		<center>作者：Jeff Hanson</center>
		<p>
				<br /> </p>
		<center>译者:<a href="http://www.matrix.org.cn/user.shtml?username=steven_guo" target="_new"><font color="#002c99">steven_guo</font></a></center>
		<p>
				<br />
				<br />
				<span style="COLOR: red">版权声明：任何获得Matrix授权的网站，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明</span>
				<br />作者:Jeff Hanson;<a href="http://www.matrix.org.cn/user.shtml?username=steven_guo" target="_new"><font color="#002c99">steven_guo</font></a><br />原文地址:<a href="http://www.javaworld.com/javaworld/jw-01-2005/jw-0131-soa.html" target="_new"><font color="#002c99">http://www.javaworld.com/javaworld/jw-01-2005/jw-0131-soa.html</font></a><br />中文地址:<a href="http://www.matrix.org.cn/resource/article/43/43929_SOA_Event_driven.html" target="_new"><font color="#002c99">http://www.matrix.org.cn/resource/article/43/43929_SOA_Event_driven.html</font></a><br />关键词： SOA,Event-driven<br /><br /></p>
		<h4>摘要:</h4>
		<p>这篇文章讨论面向服务框架的技术和机制，这些技术使得该框架高效发送、接受那些跨越层级结构的同步和异步事件，而不需要知道产生这些事件的系统方面的细节. 本文讨论使用Mule实现一个高效的事件驱动和面向服务的平台，一个轻量级的事件-消息架构，企业信息总线（ESB）模式。组件和程序可以使用Mule通过公共的JMS或其他的消息处理技术去实现通信。<br />及时响应实时的变化和事件成为了企业级架构的最重要需求。这篇文章讨论面向服务框架的技术和机制，这些技术使得该框架高效发送、接受那些跨越层级结构的同步和异步事件，而不需要知道产生这些事件的系统方面的细节<br /><br />Internet事务，B2B系统，P2P程序，和实时工作流，这些系统有着非常高的动态性，复杂的系统处理，用传统的面向过程的处理方法不能有效地实现。<br /><br />一个面向服务的框架代表了一个动态的运行时环境，在那里服务提供者和服务消费者松散耦合、更灵活的组件交互。建立一个具备所有这些优势的交互模型，成为软件开发中最优先考虑的。一个事件驱动的交互模型，比通常的请求/响应机制对实时变化和激励有着更好的应答效率。<br /><br />面向服务的架构和事件驱动的架构天生就有着对分布式系统的适应性，这些架构都有着模块性、松散耦合，和适应性等特性。<br /><br />在这篇文章里，讨论使用Mule实现一个高效的事件驱动和面向服务的平台，一个轻量级的事件-消息架构，企业信息总线（ESB）模式。组件和程序可以使用Mule通过公共的JMS或其他的消息处理技术去实现通信。<br /><br /><b><span style="FONT-SIZE: 16px">面向服务架构概述</span></b><br />“面向服务”这个术语已经演变成一个架构，在那里服务作为一个软件组件嵌入在企业业务逻辑和特新的核心中，特性如下：<br />·        松散耦合：服务部与其它组件有着根深蒂固的关系<br />·        协议独立：多种协议透明访问<br />·        位置不可知：一个服务执行一组业务逻辑，针对这次调用返回一个结果<br />·        粗粒度：不论在什么位置均可访问该服务。<br />·        维护无用户状态<br /><br />服务是典型地专注于解决业务领域的问题。<br /><br />通常，服务使用端根据配置数据，注册项和软件工厂去决定给服务的位置，协议和公共接口。<br /><br />应用程序通常被表述成他们有什么功能，而不强调这个应用程序是什么东西，包含什么。基于这个院应，更多直接描述一个应用程序通过使用动词（服务）而不是用名词（应用主体）。因为，一个名词（应用主体）是定义了了一个事务，而不是动作，当强制把一个组件有什么功能作为一个组件是什么来定义，那就会出现误解。在SOA<a style="TEXT-DECORATION: underline" href="http://www.sogou.com/sogoupedia?query=%C1%EC%D3%F2" target="_blank"><font color="#002c99">领域</font></a>，一个应用程序能很自然的被描述，因为每个应用程序的业务逻辑操作能被描述成为一个服务的执行选择。因此，SOA解决了这种误解，它允许应用程序和组件去访问一个服务所能实现的功能，例如，他们执行什么动作。依次，应用程序开发者能更容易匹配他们的需要与适当的服务，因为服务接口的描述更完整地说清了他们要解决的问题。<br /><br /><b><span style="FONT-SIZE: 16px">事件驱动架构概述</span></b><br />一个事件驱动框架（EDA）定义了一个设计和实现一个应用系统得方法学，在这个系统里事件可传输于松散耦合的软件组件和服务之间。一个事件驱动系统典型地由事件消费者和事件产生者组成。事件消费者向事件管理器订阅事件，事件产生者向事件管理器发布事件。当事件管理器从事件产生者那接收到一个事件时，事件管理把这个事件转送给相应的事件消费者。如果这个事件消费者是不可用的，事件管理这将保留这个事件，一段间隔之后再次转送该事件消费者。这种事件传送方法在基于消息的系统里就是：储存（store）和转送（forward）。<br /><br />构建一个包含事件驱动构架的应用程序和系统，这样就使得这些应用程序和系统响应更灵敏，因为事件驱动的系统更适合应用在不可预知的和异步的环境里。<br /><br />事件驱动设计和开发的优势：<br />事件驱动设计和开发所提供的优势如下：<br />·        可以更容易开发和维护大规模分布式应用程序和不可预知的服务或异步服务<br />·        可以很容易，低成本地集成、再集成、再配置新的和已存在的英勇程序和服务<br />·        促进远程组件和服务的再使用，拥有一个更灵敏、没有Bug的开发环境<br />·        短期利益：更容易定制。因为设计对动态处理又更好的响应。<br />·        长期利益：系统和组织的状态变得更精准，对实时变化的响应接近于同步。<br /><br /><b><span style="FONT-SIZE: 16px">EDA 和 SOA 整合</span></b><br />不象请求/响应系统，要求请求者必须明确发送请求信息，而一个事件驱动 架构提供一个机制去动态响应事件。在一个EDA系统里，事件产生者发布事件，事件消费者接受事件。<br /><br />业务系统可以从SOA和EDA中受益匪浅，因为当事件发生时EDA能触发事件消费者，SOA服务可以快速地从相同的消费者中访问、查询。<br /><br />系统要有最高的响应性，当事件触发时这个系统必须能快速决定必须的动作。到事件结束，事件应该被发布和消费，而且事件要穿越SOA所有的边界，包括整个体系结构和物理层。<br /><br />图1演示了事件被激发和穿越体系结构的所有层<br /><img style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2005_11_07_214543_WXWJVDGdVk.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />图1：事件穿越体系结构的层级<br /><br />在图1的环境中，一个事件能被定义为任何系统的，平台的，组件的，业务的或英勇进程的变化。事件可能是高层的业务事件或底层的系统事件。因为事件能被传送和接收，订阅事件的英勇程序和服务能对这些变化做出响应。<br /><br /><b><span style="FONT-SIZE: 16px">事件分类和因果关系</span></b><br /><br />理解一个事件的秘诀是知道这个事件发生的原因，这个就是通常说的因果关系。事件的因果关系典型地分为两类：<br />·        平行关系：时间源和触发在体系结构的同一层。<br />·        垂直关系：时间源和触发在体系结构的不同层。<br /><br />垂直关系意味着一个事件的分类方法，这些事件保留了一些不变的东西而穿越一个系统不同的层，事件分类如下：<br />·        生命周期事件：一个实体生命周期的变化，例如一个进程的停止或启动<br />·        执行事件：运行时事件，例如服务或组件的调用<br />·        管理事件：当一个状态超过了预先的定义或一定范围时<br /><br />平行关系意味着一个事件的分类方法，这些事件保留了一些不变的东西而穿越一个系统不同的层，事件分类如下： <br />·        系统层事件：系统级动作，例如创建一个文件或关闭一个端口<br />·        平台层事件：平台级动作,例如修改一个数据源或增加一个新的服务<br />·        组件层事件：组件级动作，例如视图对象的转换或状态机变化<br />·        业务层事件：业务级动作，例如创建用户或删除帐号<br />·        应用层事件：应用级动作，例如增加保险金或报价提交<br /><br />许多ESB框架和平台意识到在SOA中包含基于事件驱动的通信有很多优势。在Java开发领域，Mule就是这些最有前景的平台之一。<br /><br /><b><span style="FONT-SIZE: 16px">介绍Mule</span></b><br />Mule是一个开源消息ESB框架，一个消息代理，一个分级事件驱动的框架（SEDA）。SEDA定义了一个依照分级队列、高度并行的企业级平台。Mule使用SED的概念增加事件处理的性能。<br /><br />Mule支持同步、异步和请求响应事件，事件处理和传输实用不同的技术例如JMS，HTTP，电子邮件和基于XML的RPC。Mule能很容易地嵌入到任何应用框架中，明确支持Spring框架。Mule也支持动态的，预定义的，基于内容的和基于规则的消息路由。Mule使得预定义的和计划性的事务更容易，包括XA事务支持。Mule提供一个有代表性的状态调用（REST）API提供给与Web的事件访问。<br /><br />Mule ESB模式驱动系统中所有服务，这个系统有着一个分离的消息通讯中枢。服务注册在总线上，但不知道其他任何被注册的消息；因此，每个服务只关心处理它收到的事件。Mule也把容器，传输，转换细节从服务中分离出来，允许任何对象作为服务注册到总线的。<br /><br />我使用Mule框架去演示这篇文章所讨论的概念和思想<br /><br /><span style="FONT-SIZE: 16px"><b>Mule框架</b></span><br />Mule框架主要包含下列内容：<br /><br /><b>通用消息对象（UMO）API</b><br />UMO API第一了所有被Mule 管理的服务和对象交互<br /><br /><b>UMO组件</b><br />在Mule系统中，UMO组件可以使任何在系统中接收、处理和发送事件消息的组件<br /><br /><b>Mule服务器</b><br />Mule服务器组件是一个在Mule应用环境中自动加载的服务器应用程序<br /><br /><b>描述器</b><br />描述器组件描述一个Mule UMO属性。新的Mule MUO对象能被它们所关联的描述器初始化。一个描述器包含：<br />·        UMO组件名<br />·        UMO组件版本<br />·        UMO组件实现类<br />·        异常策略<br />·        入站和出站提供者<br />·        入站和出站路由器<br />·        拦截器<br />·        接收和发送切入点<br />·        入站和出站转换器<br />·        各种各样的特性<br /><br /><b>连接器</b><br />连接器是一些组件，它们可以连接到外部系统或其他协议、管理那些系统或协议的状态。一个连接器负责发送消息到外部消息接收器、管理消息接收器的注册和注销。<br /><br /><b>提供者</b><br /><br />提供者是一些组件，管理把事件数据发送到外部系统、从外部系统接受事件数据和转换事件数据等事项。在Mule框架里，他们能连接到外部系统或其他组件。一个提供者就像一个从外部系统进入Mule或从Mule内部访问外部系统的桥接器。实际上，提供者有一组对象组成，可以与下层系统连接并与之通信。提供者的组成部件是：<br />·        连接器：负责连接到下层系统<br />·        消息接收器：从系统接收事件<br />·        连接调度者：传送系统到系统<br />·        转换器：转换从系统接收到的或要发送到系统的数据<br />·        终端：所建立连接的通道地址<br />·        事务配制：定义连接的事务属性<br /><br /><b>终端调解者</b><br />当UMO组件接收到一个事件时，终端调解者决定去调用它的什么方法<br /><br /><b>转换器</b><br />转换器组件负责双向转换消息或事件的有效载荷。当一个事件到达接收的对象之前，转换器可以链接到一起去执行一系列的装换操作。<br /><br /><b>消息适配器</b><br />消息适配器提供一中公共的方式去读外部系统的异构数据。<br /><br /><b>消息接收器</b><br />消息接收器是一些列终端监听线程，负责从外部系统接收数据。<br /><br /><b>消息调度者</b><br />消息调度者发送（同步）或派遣（异步）时间到下层系统。<br /><br /><b>消息路由器</b><br />消息路由器是一系列组件，可以使被配制的UMO组件依据消息或其他配制图路有一个消息到不同的提供者。<br /><br /><b>代理</b><br />代理是一些帮定到外部服务的组建，例如JME服务器。<br /><br /><b>Mule模型</b><br />一个Mule模型封装和管理一个Mule服务器实例的运行时行为。一个模型包含：<br />·        描述器<br />·        UMO组件<br />·        一个终端调解者<br />·        一个生命周期适配器工厂<br />·        一个组件调解者 <br />·        一个池化工厂 <br />·        一个异常策略<br /><br /><b>Mule管理器</b><br />Mule管理器维护和提供以下服务 ：<br />·        代理<br />·        提供者<br />·        连接器<br />·        终端<br />·        转换器<br />·        拦截器堆栈<br />·        一个Mule模型 <br />·        一个Mule服务器<br />·        事务管理器 <br />·        应用程序属性<br />·        Mule配制<br /><br />图2演示了Mule框架上层消息流视图<br /><img style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2005_11_07_215151_LueGHMXqoh.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />图2：Mule上层架构<br /><br /><span style="FONT-SIZE: 16px"><b>Mule事件对象</b></span><br />Mule事件对象对象包含事件数据和被组件所感知和操控的属性。属性是任意的，在事件创建之后任何时间可被设置。<br /><br />org.mule.umo.UMOEvent类代表了一个在Mule环境中出现的时间。所有在组件之间发送或接收的数据都是org.mule.umo.UMOEvent的一个实体。可以访问一个原始的或被转换的Mule事件对象中的数据能。一个Mule事件对象使用一个与提供者管理的提供者转换数据，提供者收到数据后把事件中的有效载荷转换成当前组件所识别的格式。<br /><br />一个Mule事件对象的有效有效载荷能通过org.mule.umo.UMOMessage接口访问，一个org.mule.umo.UMOMessage实例由有效载荷和它的属性组成。这个接口是不同技术实现的消息对象的一个抽象。<br /><br />org.mule.extras.client.MuleClient类定义了一个简单的借口，允许Mule客户端从Mule服务器接收和发送事件数据。在大多数Mule应用程序里，时间是被一些外部的并发行为所触发，例如一个主题上接收到消息或在目录里一个文件被删除。<br /><br />下面演示了如何去发送一个同步事件到另外的Mule组件：<br /></p>
		<pre class="overflow">String componentName = "MyReceiver"; // The name of the receiving component. <br />String transformers = null; // A comma-separated list of transformers<br />                            // to apply to the result message. <br />String payload = "A test event"; // The payload of the event. <br />java.util.Map messageProperties = null; // Any properties to be associated<br />                                        // with the payload.<br />MuleClient client = new MuleClient();<br />UMOMessage message = client.sendDirect(componentName,<br />                                       transformers,<br />                                       payload,<br />                                       messageProperties);<br />System.out.println("Event result: " + message.getPayloadAsString()); </pre>
		<p>
				<br />
				<br />MuleClient类需要一个服务器URL区定义它所连接的远程Mule服务器的终端。URL定义了传输协议、接收消息的地址，提供者在派遣一个事件时可以随时使用这些信息。终端例示如下：<br />·        vm://com.jeffhanson.receivers.Default: 使用虚拟机的提供者派遣到一个com.jeffhanson.receivers.Default<br />·        jms://jmsProvider/accounts.topic:使用全局注册的jmsProvider派遣一个JMS消息到ccounts.topic.<br />·        jms://accounts.topic: 使用第一个（默认）的JMS提供者派遣JMS消息<br /><br /><b><span style="FONT-SIZE: 16px">Mule事件处理</span></b><br />Mule可以在三种不同的方式发送和节后艘事件：<br />1．异步方式：一个组件可通过不同的线程同时处理多个事件的发送和接收<br />2．同步方式：在一个组件重新工作之前，一个单一的事件必须被处理完。换言之，一个创建了事件的组建发送事件时将被阻断，直到发送任务完成，因此，一次只允许处理一个事件<br />3．请求-应答方式：一个组建专门请求一个事件，然后等待一个特定的时间去接收回应。<br />org.mule.impl.MuleComponent实现类提供了一个具体的组建类，它包括又有创建，发送和接收事件的功能。<br />执行同步动作的对象应该实现org.mule.umo.lifecycle.Callable接口，这个定义了一个简单的方法Object onCall(UMOEventContext eventContext)。Callable接口提供支持事件调用的UMO对象。虽然不是强制的，但这个接口提供了一个生命周期控制的方法，当实现这个接口的组建接收到一个消息时执行这个方法。下面展示了这个接口的简单实现。<br /></p>
		<pre class="overflow">import org.mule.umo.lifecycle.Callable;<br /><br />public class EchoComponent<br />   implements Callable<br />{<br />    public Object onCall(UMOEventContext context) throws Exception<br />    {<br />        String msg = context.getMessageAsString();<br />        // Print message to System.out<br />        System.out.println("Received synchronous message: " + msg);<br />        // Echo transformed message back to sender<br />        return context.getTransformedMessage();<br />    }<br />} </pre>
		<p>
				<br />
				<br />从onCall（）方法可返回任何对象。当组件的UMOLifecycleAdapter接收这个对象时，它首先看看这个对象是否是一个UMOMessage；如果这个对象既不是UMOMessage也不是Null，那么以这个对象作为有效载荷去创建一个新的消息。这个新事件经由所配制的出站路有器发布，如果UMO对象已经配制了一个出站路由器，那么在UMOEventContext实例中不能调用setStopFurtherProcessing(true)方法。<br /><br /><b><span style="FONT-SIZE: 16px">Mule使用的一个简单的事件框架</span></b><br />让我们把这几段Mule的代码放到一起去构建一个简单的事件框架。这个框架包含一个负责注册和注销事件的管理器，可以接收事件，和负责路有同步和异步消息到他们相应的服务。<br /><br />Mule的虚拟机协议要求有一个放置事件管理器工作目录META-INF/services/org/mule/providers/vm路径下的可配制文件，配制文件为协议定义了大量的组件，例如连接器和调度工厂。配制文件的内容如下：<br /></p>
		<pre class="overflow">connector=org.mule.providers.vm.VMConnector<br />dispatcher.factory=org.mule.providers.vm.VMMessageDispatcherFactory<br />message.receiver=org.mule.providers.vm.VMMessageReceiver<br />message.adapter=org.mule.providers.vm.VMMessageAdapter<br />endpoint.builder=org.mule.impl.endpoint.ResourceNameEndpointBuilder </pre>
		<p>
				<br />
				<br />一个简单的借口定义了事件管理器的公有结构：<br /></p>
		<pre class="overflow">package com.jeffhanson.mule;<br /><br />import org.mule.umo.FutureMessageResult;<br /><br />public interface EventManager<br />{<br />   /**<br />    * Sends an event message synchronously to a given service.<br />    *<br />    * @param serviceName    The name of the service to which the event<br />    *                       message is to be sent.<br />    * @param payload        The content of the event message.<br />    * @return Object        The result, if any.<br />    * @throws EventException on error<br />    */<br />   public Object sendSynchronousEvent(String serviceName,<br />                                      Object payload)<br />      throws EventException;<br /><br />   /**<br />    * Sends an event message asynchronously to a given service.<br />    *<br />    * @param serviceName    The name of the service to which the event<br />    *                       message is to be sent.<br />    * @param payload        The content of the event message.<br />    * @return FutureMessageResult The result, if any.<br />    * @throws EventException on error<br />    */<br />   public FutureMessageResult sendAsynchronousEvent(String serviceName,<br />                                                    Object payload)<br />      throws EventException;<br /><br />   /**<br />    * Starts this event manager.<br />    */<br />   public void start();<br /><br />   /**<br />    * Stops this event manager.<br />    */<br />   public void stop();<br /><br />   /**<br />    * Retrieves the protocol this event manager uses.<br />    * @return<br />    */<br />   public String getProtocol();<br /><br />   /**<br />    * Registers a service to receive event messages.<br />    *<br />    * @param serviceName      The name to associate with the service.<br />    * @param implementation   Either a container reference to the service<br />    *                         or a fully-qualified class name.<br />    */<br />   public void registerService(String serviceName,<br />                               String implementation)<br />      throws EventException;<br /><br />   /**<br />    * Unregisters a service from receiving event messages.<br />    *<br />    * @param serviceName  The name associated with the service to unregister.<br />    */<br />   public void unregisterService(String serviceName)<br />      throws EventException;<br />} </pre>
		<p>
				<br />
				<br />事件管理器类是被封装在一个工厂类里，因此，可以依据需要去改变它的实现而不会影响到它的客户端。事件管理器实现如下：<br /></p>
		<pre class="overflow">package com.jeffhanson.mule;<br /><br />import org.mule.umo.*;<br />import org.mule.extras.client.MuleClient;<br />import org.mule.impl.endpoint.MuleEndpoint;<br />import org.mule.config.QuickConfigurationBuilder;<br /><br />import java.util.HashMap;<br />import java.util.Map;<br /><br />public class EventManagerFactory<br />{<br />   private static HashMap instances = new HashMap();<br /><br /><br />   /**<br />    * Retrieves the event manager instance for a given protocol.<br />    *<br />    * @param protocol      The protocol to use.<br />    * @return EventManager The event manager instance.<br />    */<br />   public static EventManager getInstance(String protocol)<br />   {<br />      EventManager instance = (EventManager)instances.get(protocol);<br /><br />      if (instance == null)<br />      {<br />         instance = new EventManagerImpl(protocol);<br />         instances.put(protocol, instance);<br />      }<br /><br />      return instance;<br />   }<br /><br />   /**<br />    * A concrete implementation for a simple event manager.<br />    */<br />   private static class EventManagerImpl<br />      implements EventManager<br />   {<br />      private UMOManager manager = null;<br />      private QuickConfigurationBuilder builder = null;<br />      private MuleClient eventClient = null;<br />      private String protocol = null;<br />      private MuleEndpoint receiveEndpoint = null;<br />      private MuleEndpoint sendEndpoint = null;<br /><br />      private EventManagerImpl(String protocol)<br />      {<br />         this.protocol = protocol;<br />      }<br /><br />      /**<br />       * Starts this event manager.<br />       */<br />      public void start()<br />      {<br />         try<br />         {<br />            builder = new QuickConfigurationBuilder();<br />            manager = builder.createStartedManager(true,<br />                                                   protocol + "tmp/events");<br />            eventClient = new MuleClient();<br />            receiveEndpoint = new MuleEndpoint(protocol<br />                                               + "tmp/events/receive");<br />            sendEndpoint = new MuleEndpoint(protocol + "tmp/events/send");<br />         }<br />         catch (UMOException e)<br />         {<br />            System.err.println(e);<br />         }<br />      }<br /><br />      /**<br />       * Stops this event manager.<br />       */<br />      public void stop()<br />      {<br />         try<br />         {<br />            manager.stop();<br />         }<br />         catch (UMOException e)<br />         {<br />            System.err.println(e);<br />         }<br />      }<br /><br />      /**<br />       * Retrieves the protocol this event manager uses.<br />       * @return<br />       */<br />      public String getProtocol()<br />      {<br />         return protocol;<br />      }<br /><br />      /**<br />       * Registers a service to receive event messages.<br />       *<br />       * @param serviceName      The name to associate with the service.<br />       * @param implementation   Either a container reference to the service<br />       *                         or a fully-qualified class name<br />       *                         to use as the component implementation.<br />       */<br />      public void registerService(String serviceName,<br />                                  String implementation)<br />         throws EventException<br />      {<br />         if (!manager.getModel().isComponentRegistered(serviceName))<br />         {<br />            try<br />            {<br />               builder.registerComponent(implementation,<br />                                         serviceName,<br />                                         receiveEndpoint,<br />                                         sendEndpoint);<br />            }<br />            catch (UMOException e)<br />            {<br />               throw new EventException(e.toString());<br />            }<br />         }<br />      }<br /><br />      /**<br />       * Unregisters a service from receiving event messages.<br />       *<br />       * @param serviceName  The name associated with the service to unregister.<br />       */<br />      public void unregisterService(String serviceName)<br />         throws EventException<br />      {<br />         try<br />         {<br />            builder.unregisterComponent(serviceName);<br />         }<br />         catch (UMOException e)<br />         {<br />            throw new EventException(e.toString());<br />         }<br />      }<br /><br />      /**<br />       * Sends an event message synchronously to a given service.<br />       *<br />       * @param serviceName    The name of the service to which the event<br />       *                       message is to be sent.<br />       * @param payload        The content of the event message<br />       * @return Object        The result, if any.<br />       * @throws EventException on error<br />       */<br />      public Object sendSynchronousEvent(String serviceName,<br />                                         Object payload)<br />         throws EventException<br />      {<br />         try<br />         {<br />            if (!manager.getModel().isComponentRegistered(serviceName))<br />            {<br />               throw new EventException("Service: " + serviceName<br />                                        + " is not registered.");<br />            }<br /><br />            String transformers = null;<br />            Map messageProperties = null;<br />            UMOMessage result = eventClient.sendDirect(serviceName,<br />                                                       transformers,<br />                                                       payload,<br />                                                       messageProperties);<br />            if (result == null)<br />            {<br />               return null;<br />            }<br />            return result.getPayload();<br />         }<br />         catch (UMOException e)<br />         {<br />            throw new EventException(e.toString());<br />         }<br />         catch (Exception e)<br />         {<br />            throw new EventException(e.toString());<br />         }<br />      }<br /><br />      /**<br />       * Sends an event message asynchronously.<br />       *<br />       * @param serviceName    The name of the service to which the event<br />       *                       message is to be sent.<br />       * @param payload        The content of the event message.<br />       * @return FutureMessageResult The result, if any<br />       * @throws EventException on error<br />       */<br />      public FutureMessageResult sendAsynchronousEvent(String serviceName,<br />                                                       Object payload)<br />         throws EventException<br />      {<br />         FutureMessageResult result = null;<br /><br />         try<br />         {<br />            if (!manager.getModel().isComponentRegistered(serviceName))<br />            {<br />               throw new EventException("Service: " + serviceName<br />                                        + " is not registered.");<br />            }<br /><br />            String transformers = null;<br />            Map messageProperties = null;<br />            result = eventClient.sendDirectAsync(serviceName,<br />                                                 transformers,<br />                                                 payload,<br />                                                 messageProperties);<br />         }<br />         catch (UMOException e)<br />         {<br />            throw new EventException(e.toString());<br />         }<br /><br />         return result;<br />      }<br />   }<br />} </pre>
		<p>
				<br />
				<br />Mule框架依据消息有效载荷的类型来派遣消息。事件框架使用基于有效载荷的派遣机制，这种派遣机制把注册到事件管理器中一般定义的事件方法作为事件接收器。下面的类定义了一个包含三个重载的receiveEvent（）方法的服务：<br /></p>
		<pre class="overflow">package com.jeffhanson.mule;<br /><br />import java.util.Date;<br /><br />public class TestService<br />{<br />   public void receiveEvent(String eventMessage)<br />   {<br />      System.out.println("\n\nTestService.receiveEvent(String) received "<br />                         + "event message:  " + eventMessage + "\n\n");<br />   }<br /><br />   public void receiveEvent(Integer eventMessage)<br />   {<br />      System.out.println("\n\nTestService.receiveEvent(Integer) received "<br />                         +"event message:  " + eventMessage + "\n\n");<br />   }<br /><br />   public void receiveEvent(Date eventMessage)<br />   {<br />      System.out.println("\n\nTestService.receiveEvent(Date) received "<br />                         + "event message:  " + eventMessage + "\n\n");<br />   }<br />} </pre>
		<p>
				<br />
				<br />事件管理器客户端应用程序发送三个事件到测试服务中，去测试每一个receiveEvent（）方法。客户端应用程序如下：<br /></p>
		<pre class="overflow">package com.jeffhanson.mule;<br /><br />import org.apache.log4j.Logger;<br />import org.apache.log4j.Level;<br />import org.apache.log4j.BasicConfigurator;<br /><br />import java.util.Date;<br /><br />public class EventClient<br />{<br />   static Logger logger = Logger.getLogger(EventClient.class);<br /><br />   public static void main(String[] args)<br />   {<br />      // Set up a simple configuration that logs on the console.<br />      BasicConfigurator.configure();<br />      logger.setLevel(Level.ALL);<br /><br />      try<br />      {<br />         EventManager eventManager =<br />            EventManagerFactory.getInstance("vm://");<br />         eventManager.start();<br /><br />         String serviceName = TestService.class.getName();<br />         String implementation = serviceName;<br /><br />         eventManager.registerService(serviceName, implementation);<br /><br />         Object result =<br />            eventManager.sendSynchronousEvent(serviceName, "A test message");<br /><br />         if (result != null)<br />         {<br />            System.out.println("Event result: " + result.toString());<br />         }<br /><br />         result =<br />            eventManager.sendSynchronousEvent(serviceName, new Integer(23456));<br /><br />         if (result != null)<br />         {<br />            System.out.println("Event result: " + result.toString());<br />         }<br /><br />         result =<br />            eventManager.sendSynchronousEvent(serviceName, new Date());<br /><br />         if (result != null)<br />         {<br />            System.out.println("Event result: " + result.toString());<br />         }<br /><br />         eventManager.stop();<br />      }<br />      catch (EventException e)<br />      {<br />         System.err.println(e.toString());<br />      }<br />   }<br />} </pre>
		<p>
				<br />
				<br />Mule平台简化和抽象了前面所叙述框架的事件方面的处理，使得你发送和接收穿越一个层级结构的同步和异步消息时，不需要知道下层系统的细节。工厂模式和SOA准则的应用，则使得这个框架有了一个松散耦合和可扩展的设计。<br /><br /><b><span style="FONT-SIZE: 16px">总结</span></b><br />当服务和进程需要穿越多层结构，使用多种协议去交互时，设计一个有效地事件驱动的软件系统可能变得复杂了。可是，一个使用标准模式包含适当事件管理层的面向服务架构能减少，甚至消除这些问题。<br /><br />Mule 平台提供API，组件和抽象对象，这些都可以用于去建立一个强大，健壮，事件驱动的有着良好的伸缩性和可维护性的系统。<br /><br /><b>关于作者</b><br />Jeff Hanson 有着18年的软件行业从业经验，曾经作为高级软件工程师工作于Windows OpenDoc项目，作为主管架构师在Novell的Route66框架工作。现在，作为eReinsure.com的首席架构师，正在构建Web服务框架和基于J2EE再保险平台。Hanson已经写作了大量的文章和书籍，包括：《Pro JMX: Java Management Extensions》(Apress出版社,2003年11月; ISBN: 1590591011)和《Web Services Business Strategies and Architectures》(Wrox 出版社,2002年8月; ISBN: 1904284132)<br /><br /><b>资源</b><br />·javaworld.com:<a href="http://www.javaworld.com/" target="_new"><font color="#002c99">javaworld.com</font></a><br />·Matrix-Java开发者社区:<a href="http://www.matrix.org.cn/" target="_new"><font color="#002c99">http://www.matrix.org.cn/</font></a><br />·Mule主页: <a href="http://wiki.muleumo.org/display/MULEPROJ/Home" target="_new"><font color="#002c99">http://wiki.muleumo.org/display/MULEPROJ/Home</font></a><br />·Mule FAQ: <a href="http://wiki.muleumo.org/display/MULE/Mule+FAQ" target="_new"><font color="#002c99">http://wiki.muleumo.org/display/MULE/Mule+FAQ </font></a><br /></p>
<img src ="http://www.blogjava.net/esoa/aggbug/74128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/esoa/" target="_blank">comchyi</a> 2006-10-09 17:14 <a href="http://www.blogjava.net/esoa/articles/74128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是SOA</title><link>http://www.blogjava.net/esoa/articles/74125.html</link><dc:creator>comchyi</dc:creator><author>comchyi</author><pubDate>Mon, 09 Oct 2006 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/esoa/articles/74125.html</guid><wfw:comment>http://www.blogjava.net/esoa/comments/74125.html</wfw:comment><comments>http://www.blogjava.net/esoa/articles/74125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/esoa/comments/commentRss/74125.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/esoa/services/trackbacks/74125.html</trackback:ping><description><![CDATA[面向服务的体系结构（service-oriented architecture，SOA）是一个组件模型，它将应用程序的不同功能单元（称为服务）通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的，它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。 
<p>这种具有中立的接口定义（没有强制绑定到特定的实现上）的特征称为服务之间的松耦合。松耦合系统的好处有两点，一点是它的灵活性，另一点是，当组成整个应用程序的每个服务的内部结构和实现逐渐地发生改变时，它能够继续存在。而另一方面，紧耦合意味着应用程序的不同组件之间的接口与其功能和结构是紧密相连的，因而当需要对部分或整个应用程序进行某种形式的更改时，它们就显得非常脆弱。 </p><p>对松耦合的系统的需要来源于业务应用程序需要根据业务的需要变得更加灵活，以适应不断变化的环境，比如经常改变的政策、业务级别、业务重点、合作伙伴关系、行业地位以及其他与业务有关的因素，这些因素甚至会影响业务的性质。我们称能够灵活地适应环境变化的业务为按需（On demand）业务，在按需业务中，一旦需要，就可以对完成或执行任务的方式进行必要的更改。 </p><p>虽然面向服务的体系结构不是一个新鲜事物，但它却是更传统的面向对象的模型的替代模型，面向对象的模型是紧耦合的，已经存在二十多年了。虽然基于 SOA 的系统并不排除使用面向对象的设计来构建单个服务，但是其整体设计却是面向服务的。由于它考虑到了系统内的对象，所以虽然 SOA 是基于对象的，但是作为一个整体，它却不是面向对象的。不同之处在于接口本身。SOA 系统原型的一个典型例子是通用对象请求代理体系结构（Common Object Request Broker Architecture，CORBA），它已经出现很长时间了，其定义的概念与 SOA 相似。 </p><p>然而，现在的 SOA 已经有所不同了，因为它依赖于一些更新的进展，这些进展是以可扩展标记语言（eXtensible Markup Language，XML）为基础的。通过使用基于 XML 的语言（称为 Web 服务描述语言（Web Services Definition Language，WSDL））来描述接口，服务已经转到更动态且更灵活的接口系统中，非以前 CORBA 中的接口描述语言（Interface Definition Language，IDL）可比了。 </p><p>Web 服务并不是实现 SOA 的惟一方式。前面刚讲的 CORBA 是另一种方式，这样就有了面向消息的中间件（Message-Oriented Middleware）系统，比如 IBM 的 MQseries。但是为了建立体系结构模型，您所需要的并不只是服务描述。您需要定义整个应用程序如何在服务之间执行其工作流。您尤其需要找到业务的操作和业务中所使用的软件的操作之间的转换点。因此，SOA 应该能够将业务的商业流程与它们的技术流程联系起来，并且映射这两者之间的关系。例如，给供应商付款的操作是商业流程，而更新您的零件数据库，以包括进新供应的货物却是技术流程。因而，工作流还可以在 SOA 的设计中扮演重要的角色。 </p><p>此外，动态业务的工作流不仅可以包括部门之间的操作，甚至还可以包括与不为您控制的外部合作伙伴进行的操作。因此，为了提高效率，您需要定义应该如何得知服务之间的关系的策略，这种策略常常采用服务级协定和操作策略的形式。 </p><p>最后，所有这些都必须处于一个信任和可靠的环境之中，以同预期的一样根据约定的条款来执行流程。因此，安全、信任和可靠的消息传递应该在任何 SOA 中都起着重要的作用。 </p><h2 id="section-SOA-SOA_E7_9A_84_E5_8E_9F_E5_88_99">SOA的原则</h2><p>SOA是一种企业架构，因此，它是从企业的需求开始的。但是，SOA和其它企业架构方法的不同之处在于SOA提供的业务敏捷性。业务敏捷性是指企业对变更快速和有效地进行响应、并且利用变更来得到竞争优势的能力。对架构设计师来说，创建一个业务敏捷的架构意味着创建这样一个IT架构，它可以满足当前还未知的业务需求。 </p><p>要满足这种业务敏捷性，SOA的实践必须遵循以下原则： </p><h3 id="section-SOA-_E4_B8_9A_E5_8A_A1_E9_A9_B1_E5_8A_A8_E6_9C_8D_E5_8A_A1_E6_9C_8D_E5_8A_A1_E9_A9_B1_E5_8A_A8_E6_8A_80_E6_9C_AF">业务驱动服务，服务驱动技术</h3><p>从本质上说，在抽象层次上，服务位于业务和技术中间。面向服务的架构设计师一方面必须理解在业务需求和可以提供的服务之间的动态关系，另一方面，同样要理解服务与提供这些服务的底层技术之间的关系。 </p><h3 id="section-SOA-_E4_B8_9A_E5_8A_A1_E6_95_8F_E6_8D_B7_E6_98_AF_E5_9F_BA_E6_9C_AC_E7_9A_84_E4_B8_9A_E5_8A_A1_E9_9C_80_E6_B1_82">业务敏捷是基本的业务需求</h3><p>SOA考虑的是下一个抽象层次：提供响应变化需求的能力是新的“元需求”，而不是处理一些业务上的固定不变的需求。从硬件系统而上的整个架构都必须满足业务敏捷的需求，因为，在SOA中任何的瓶颈都会影响到整个IT环境的灵活性。 </p><h3 id="section-SOA-_E4_B8_80_E4_B8_AA_E6_88_90_E5_8A_9F_E7_9A_84SOA_E6_80_BB_E5_9C_A8_E5_8F_98_E5_8C_96_E4_B9_8B_E4_B8_AD">一个成功的SOA总在变化之中</h3><p>SOA工作的场景，更象是一个活的生物体，而不是象传统所说的“盖一栋房子”。IT环境唯一不变的就是变化，因此面向服务架构设计师的工作永远不会结束。对于习惯于盖房子的设计师来说，要转向设计一个活的生物体要求崭新的思维方式。如下文所写的，SOA的基础还是一些类似的架构准则。 </p><h2 id="section-SOA-SOA_E5_9F_BA_E7_A1_80">SOA基础</h2><p>在IT行业有两个越来越普遍的发展方向，一个是架构方面的，一个是方法学方面的，面向服务的架构设计师可以从中有所收获。第一个就是MDA（模型驱动架构），由提出CORBA的OMG模型提出。MDA认为架构设计师首先要对待创建的系统有一个形式化的UML（也是由OMG提出）的模型。MDA首先给出一个平台无关的模型来表示系统的功能需求和use cases，根据系统搭建的平台，架构设计师可以由这个平台无关的模型得到平台相关的模型，这些平台相关模型足够详细，以至于可以用来直接生成需要的代码。 </p><p>MDA的核心就在于在设计阶段系统就已经完全描述，这样，在创建系统的时候，几乎就没有错误解释的可能，模型也就可以直接生成代码。但MDA有一些局限性：首先，MDA假设在创建模型之前，业务需求已经全部描述，而这一点，在当前典型的动态业务环境中几乎是不可能的。第二，MDA没有一个反馈机制。如果开发人员对模型有需要改动的地方，并没有提供给他们这么一个途径。 </p><p>SOA的另一个基础是敏捷方法（AM），其中非常有名的方法是极限编程（XP）。象XP这样的AM提供了在需求未知或者多变的环境中创建软件系统的过程。XP要求在开发团队中要有一个用户代表，他帮助书写测试来指导开发人员的日常工作。开发团队中的所有成员都参与到设计之中，并且设计要尽量小并且非形式化。AM的目标是仅仅创建用户想要的，而不是在一些形式化模型上耗费工作量。AM的核心思想就在于其敏捷性－处理需求变更的敏捷性。AM的主要弱点是其规模上的限制，例如，XP在一个小团队和中型项目中效果不错，但是当项目规模增大时，如果没有一个一致的清晰的计划，项目成员很难把握项目中的方方面面。 </p><p>从表面看来，MDA和AM似乎是相对立的－MDA假定需求是固定的，而AM恰恰相反。MDA的中心是形式化的模型，而AM恰恰要避开它们。但是，我们还是决定冒险把这些不同方法中的一些元素提取出来，放入到一个一致的架构实践中。 </p><p>在SOA中有三个抽象层次，按照SOA的第一条准则：业务驱动服务、服务驱动技术。AM将业务模型直接和实践连接起来，表现在平台相关的模型之中。MDA并没有把业务模型和平台无关模型分开来，而是把平台无关模型做为起点。SOA必须连接这些模型，或者说抽象层次，得到单一的架构方法。我们将从五个视图的架构实现方法来实现这个连接。 </p><h2 id="section-SOA-SOA_E7_9A_84_E4_BA_94_E8_A7_86_E5_9B_BE_E5_AE_9E_E7_8E_B0_E6_96_B9_E6_B3_95">SOA的五视图实现方法</h2><p>企业架构设计师发现他们的职业非常有竞争力并且值得骄傲，因为他们要从很多方面来通盘考虑IT系统。Kruchten（RUP的开发负责人）将这些方面提取出来，在应用到SOA时，我们称为五视图实现方法（five-view approach）。 </p><p>四个方框表示对一个架构的不同审视方法，分别代表不同的涉众（stakeholder）。弟五个视图，use-case视图涵盖了其它视图，在架构中扮演的是一个特殊的角色。部署视图将软件映射到底层平台和相关硬件上，是系统部署人员对架构的视图；实现视图描述了软件代码的组织，是从开发人员角度出发的视图；业务分析人员则利用过程视图进行工作，它描述的是软件系统的运行时特性。最后，逻辑视图表示的是用户的功能需求。在SOA中，面向服务的架构必须能够以use-case视图中的用例将用户连接到服务，将服务连接到底层的技术。 </p><p>为了表示面向对象的架构是如何工作在这些视图之上，让我们将他们置于SOA元模型的上下文之中。SOA中两个领域存在重叠：由业务模型和服务模型表示的业务领域和由服务模型及平台相关模型表示的技术领域（两个领域共享服务模型）。业务用户通过逻辑视图和过程视图处理粗粒度的业务服务，根据变化的业务需求，按照需要将它们安排在过程之中。另一方面，技术专家的工作是创建并维护服务和地层技术之间的抽象层。表示这些服务的中间模型，起到的是轴心的作用，业务以它为中心进行。 </p><p>SOA元模型从MDA中继承平台无关模型和平台相关模型，但是添加了AM和用户交互以及敏捷的反馈这两部分，后者通过椭圆之间的双向箭头来表现。类似地，元模型通过引入由中心的服务模型提供的中间层抽象解决了AM在伸缩性方面的问题。这样，服务模型中的任何需求的变化，都会反映到用户每天的业务处理中。同样，由于底层技术是模型驱动的，技术专家也可以根据这些变化的需求迅速而有效地作出应变。 </p><p>SOA实践和过去解决企业架构传统方式的不同之处就在于其对敏捷性的支持。如前所说，SOA的第三条原则就在于它总在变化之中。这种恒在的变化性环境是SOA实践的基石。如图所示，涉众（stakeholders，译者注：RUP中也有这个词，表示软件开发中涉及到的各种角色如：用户、设计人员、开发人员乃至测试人员等等。）在一个必需的基础上影响到整个架构的变化。在当技术专家在每天的日常工作中不断对变化的业务需求作出响应的这种情况下，设计阶段和运行阶段之间的界限变得模糊起来，很难清晰地分离这两个阶段。 <br />转载：www.matrix.org.cn</p><img src ="http://www.blogjava.net/esoa/aggbug/74125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/esoa/" target="_blank">comchyi</a> 2006-10-09 17:11 <a href="http://www.blogjava.net/esoa/articles/74125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>