﻿<?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-铁手剑谱-随笔分类-企业架构</title><link>http://www.blogjava.net/SteelHand/category/1174.html</link><description>&lt;strong&gt;上善若水&lt;/strong&gt;</description><language>zh-cn</language><lastBuildDate>Sat, 01 Sep 2007 04:40:05 GMT</lastBuildDate><pubDate>Sat, 01 Sep 2007 04:40:05 GMT</pubDate><ttl>60</ttl><item><title>企业服务总线(ESB)(7)</title><link>http://www.blogjava.net/SteelHand/archive/2007/08/31/141660.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Fri, 31 Aug 2007 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2007/08/31/141660.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/141660.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2007/08/31/141660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/141660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/141660.html</trackback:ping><description><![CDATA[<h4><a>2.4重构到ESB</a></h4> <p>从偶然架构到一个全球规模的统一的集成基础设施可能是像一个使人畏缩的任务。 把一切都准备就绪，然后再象扳动一下开关那样将所有的应用都一下子转移到新的基础设施之上是不现实的。这已经是组织为什么老是要不断添加偶然架构方案作为权益解决之计的一个主要的理由，甚至他们确实知道这样使相关的问题永垂不朽也是如此。  <p>ESB 提供了能力来帮助减轻所介绍的痛苦。 第 9 章将通过一个案例来介绍如何远离一个完全建立在 FTP 和每夜批处理作业之上的早以存在的集成解决方案。  <p>让我们现在重新回到对偶然架构的讨论。 在图 2-6中，实线、虚线、点划线代表用于集成的不同类型的连接技术和通信协议。注意其中有一个用集成Broker表达的已存在的 &#8220;集成孤岛&#8221;，以及POS应用和财务应用之间的连接是使用FTP 文件传输。在POS应用和ERP应用之间先前已经升级来使用HTTP 之上的SOAP协议，正如销售自动化应用 (SFA) 和客户关系管理 (CRM) 之间的联结。  <p><a href="file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/4666ae9a-2158-4e9c-94b4-95434db98735/clip_image0021.jpg" atomicselection="true"></a><img height="244" src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB7_9C64/clip_image002.jpg" width="559"> <p>图表 2‑6 使用SOAP通信、 FTP 、手工插座（Socket）、而且包括一个集成Broker的代表性的偶然架构  <h5>2<a>.4.1 从单个项目层面引入</a> ESB</h5> <p>ESB 可以在一个部门级的层次或在一个项目的基础上被引入。 在项目层次采用 ESB 允许你能够习惯于使用 ESB 服务容器进行基于标准的集成，并且完全可以坚信该项目能够集成到一个更大的集成网络之中，并且与企业级的公司的集成策略目标相一致。  <p>我们采用ESB的例子中的第一个步骤是要集成前端应用（FrontOffice）。在图 2-7 中，前端的CRM、财务和SFA 通过&#8220;服务容器&#8221;连接到ESB 之中。这些容器是 ESB 架构的主要组件，我们将在第 6 章详细解释。 经过 ESB 服务容器进行的集成的特性可能会不同。 容器和应用之间的接口可以通过使用第三方的应用适配器来完成；容器可以暴露使用WSDL描述的XML数据；或者它可能被实现为完全用户定制的代码。  <p><a href="file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/4666ae9a-2158-4e9c-94b4-95434db98735/clip_image0033.gif" atomicselection="true"></a><img height="273" alt="figs/esb_0207.gif" src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB7_9C64/clip_image001.gif" width="449"> <p>图表 2‑7 ESB 可以在不打破原有点对点路径的前提下，在单个项目基础上采用  <p>但是也许更有趣的不是那些已经集成到ESB 之内的东西，而是还没有集成进去的东西。图 2-7 表示了已有的 FTP 和SOAP协议之间的通信线，原来是连接到前端应用的，现在直接连接到那些特别配制来使用那些协议进行通信的ESB组件。应用仍然处于总线&#8220;之外&#8221;，Pos应用和伙伴CRM应用可以与集成到ESB总线&#8220;之内&#8221;的前端应用进行通信而不需要做任何修改，对他们如何参与ESB基础设施也不需要知道任何东西。注意，现在POS应用是连接到ESB 上的一个 FTP 桥接器，而且伙伴CRM应用则是连接到配置为总线的一部分的Web Services端点。  <p>ESB 已经被引入了，但是对这些配备了ESB能力的应用以前所连接的点对点通信组合区没有产生任何影响。被插入总线的应用如今转而使用连接到ESB 集成容器的一个单一接口， 而且已经省却了对它们先前所有其他类型的通信连接的管理和维护。  <p>我们将会在第 9 章中看到，即使是总线域中最新集成的应用也可以就地将他们转移到完全的ESB方式，并且与它们各自的项目开发时间线相一致。  <h5><a>2.4.2 跨广泛分布的企业传播</a>ESB</h5> <p>在我们的ESB采用的例子得下一阶段中，POS应用将在每一个远端实现ESB能力，并且去除对不可靠的 FTP 联结上的依赖。 这可能会简单如在每一个远端安装一个ESB容器，并且插入到总部的ESB之中，或者涉及到在每一个远端的多个应用之间的一个&#8220;迷你&#8221;的集成环境。那么二个 ESB节点就可以通过一个基于可靠消息的安全连接进行通信(图 2-8)  <p><a href="file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/4666ae9a-2158-4e9c-94b4-95434db98735/clip_image0041%5B1%5D.gif" atomicselection="true"></a><img height="250" alt="figs/esb_0208.gif" src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB7_9C64/clip_image001_1.gif" width="452"> <p>图表 2‑8&nbsp; 在各个地点分立安装的ESB可以安全和可靠地连接在一起  <p>此外，远端位置仍然可以在他们自己的分离集成环境里面运行，并且可以按照需要有选择地共享数据。例如，远端位置可以独立地拥有并且运作一个属于集体特许经营的零售店铺。它们没有必须共享关于它们的日常运作的信息，但是的确需要共享诸如价格更新和库存信息之类的数据。远程ESB 节点可以连接到位于总部的 ESB 网络，有选择地暴露消息通道以共享价格变动之类的数据。  <h5><a>2.4.3 保留和分层</a>: 进入现有的 EAI Broker连接</h5> <p>我们的ESB 采用示例项目的第三阶段涉及到桥接进进一个已经部分地与一个集线器-和-插头 EAI Broker集成在一起的部门。我们先前提醒过，采用 ESB 不是一个全有或全无的概念。如图 2-9 所示， ESB 允许IT部门通过将一个已存在的 EAI Broker桥接到ESB之内来保护它里面的IT资产。  <p><a href="file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/4666ae9a-2158-4e9c-94b4-95434db98735/clip_image0051%5B1%5D.gif" atomicselection="true"></a><img height="250" alt="figs/esb_0209.gif" src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB7_9C64/clip_image001_2.gif" width="452"> <p>图表 2‑9 &#8220;保留-和-分层&#8221;方式允许将ESB桥接到EAI Broker安装之内  <p>桥接 EAI Broker可以一多种方式进行。比如，它可以通过使用一个Web Services接口来完成，或者绑定到下层的消息通道。依赖于ESB和 EAI Broker 的实现，ESB 更加可以建立在EAI Broker下面的消息队列基础设施之上，因此部分地替换EAI Broker的功能仍然可以保留较低层的、消息通道。  <h5><a>2.4.4&nbsp;集成伙伴</a></h5> <p>我们的 ESB 采用示例项目的最后步骤是解决和业务伙伴集成的问题。如图 2-10 所示，这可能包括原样保留SOAP联结，以及在每个伙伴端安装一个 ESB 节点。决定采用哪一种方法完全依赖于你的组织和伙伴之间的关系，以及业务伙伴是否允许你在其地点安装软件，或者他们已经有能够连接到你的ESB之上的ESB。  <p><a href="file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/4666ae9a-2158-4e9c-94b4-95434db98735/clip_image0065.gif" atomicselection="true"></a><img height="250" alt="figs/esb_0210.gif" src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB7_9C64/clip_image001_3.gif" width="452"> <p>图表 2‑10 ESB 可以个别地管理与业务伙伴的SOAP联结, 或者可以连接到另一个地点的ESB节点  <p>插入到一个 ESB 扩展的分层的服务能够管理对伙伴的连接的后勤保障。例如，一个特殊的伙伴经理者服务可以在每一个伙伴的基础上管理与伙伴之间的正在进行的协作的细节。这些细节可能包括正在使用哪一个更高层次的业务协议(比如， ebXML、RosettaNet 等)、以及对话的状态，比如消息交换的当前状态、是否收到一个期望的应答消息、以及从业务伙伴接收到一个业务响应所能够接受多长的时延。  <h4><a>2.5小结</a></h4> <p>本章包含下列主题：  <ul> <li>&nbsp;对更广泛的、更通用的集成基础设施的需要的各种驱动因素  <li>&nbsp;偶然架构是今天所使用的主要集成设计。 在这种系统中，当前的企业完全没有很好地联通的。  <li>&nbsp;只有 10% 的应用被联接。  <li>&nbsp;而这些之中，只有 15%的使用了某种类型中间件。  <li>&nbsp;到目前为止，分布式计算技术加重了，而不是解决了，偶然架构的问题。  <li>&nbsp;集线器-和- 插头EAI Broker已经有了一定程度的成功。然而，它们:  <li>&nbsp;大部分是专有技术  <li>&nbsp;没有为组织提供一个标准化的、可以在企业内通用使用的集成平台。  <li>&nbsp;ESB 借鉴了在 EAI Broker技术方面学习的经验的价值。  <li>&nbsp;集成作为是一个部门层面和公司文化的问题，和它作为一个技术上问题同样重要。  <li>&nbsp;ESB 允许逐渐增加的采用，以符合各个部门单独的开发时间表。</li></ul> <img src ="http://www.blogjava.net/SteelHand/aggbug/141660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2007-08-31 11:11 <a href="http://www.blogjava.net/SteelHand/archive/2007/08/31/141660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>企业服务总线(ESB)(6)</title><link>http://www.blogjava.net/SteelHand/archive/2007/08/17/137500.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Fri, 17 Aug 2007 04:19:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2007/08/17/137500.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/137500.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2007/08/17/137500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/137500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/137500.html</trackback:ping><description><![CDATA[<p></p> <h4>2.3<a>借鉴来自 EAI </a>和 SOA 的最佳实践</h4> <p>在我们继续前进并且牺牲我们的先前努力，丢掉前面的每个技术，并且向失败举起我们的双手之前，还有一条路能够让我们能够利用从学来的宝贵经验，并且仍然远离偶然架构—那就是采用ESB。 集成的最佳实践，已经经过对集成Broker的经验被精炼，如今还可以结合建立于XML、Web Services、可靠的异步消息、以及分布式的ESB集成组件之上的基于标准的架构来一起使用。 他们一起形成一个高度分布的、松散耦合的集成架构，以提供集成Broker的所有主要功能，却没有其所有的障壁。 <p>远离偶然架构并且使用 ESB重构到的一个统一的和一致的集成骨干，涉及到下面小结描述的步骤。 <h5>2.3<a>.1 采用</a>XML</h5> <p>虽然ESB 确实能够传送许多类型的数据格式，但是采用XML作为应用间交换数据的手段 (图 2-2)，如同已经被用在一些传统的 EAI 方式中一样，可以由很多好处。我们将会在第 4 章中看到，使用XML可以一劳永逸地隔绝全局的数据格式和接口的变更和偶然架构本身。ESB可以进一步通过检查XML消息的内容，并且控制其向何处提交，有时候还可以改变提交路径来包括可能会修改和增加数据的附加服务，一次来促进业务处理。 <p><img height="182" alt="figs/esb_0202.gif" src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB6_AC03/clip_image001.gif" width="457"> <p>图表 2‑2 ESB 使用XML来作为应用间共享数据的方式 <h5>2.3<a>.2 采用</a>Web ervices并实现 SOA</h5> <p>以 SOA 的方式来思考和规划在向 ESB重构的一个基本步骤。如图 2-3 所示，服务级接口的引入在提供了一个公共抽象层来创建接口和实现之间的分离。这样就通过使用一种通用的接口定义机制，比如Web Services描述语言(WSDL)，来减轻了由细粒度服务接口组成的复合业务流程定义的构造的难度。 <p><img height="213" alt="figs/esb_0203.gif" src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB6_AC03/clip_image002.gif" width="457"> <p>图表 2‑3 Web 服务和 SOA 提供了一个隔离接口和实现的通用抽象层 <p>虽然服务级接口的抽象是正确方向上的一步，结果仍然是一个路由逻辑密合于应用之内的硬连接 ( 注意在图 2-3 中，“流程逻辑”仍然黏附于应用)。Web Services中的传统智慧已经模仿了客户/服务器模式。甚至在一个Web Services分布式网络中，一个应用总是另一个 “客户”。范例用法仍然需要抽象层也包括胶水代码，比如说“调用服务X上的方法a，然后调用服务Y上的方法 b()….”诸如此类。。 <p>Web Services实现中所确实的东西是将流程路由逻辑从接口定义和应用逻辑中分离出来观念。如图 2-4所示，ESB 就提供了那种隔离，并且仍然完全利用SOA。 <p><img height="263" alt="figs/esb_0204.gif" src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB6_AC03/clip_image003.gif" width="457"> <p>图表 2‑4 ESB 将业务流程的路由逻辑从接口定义和应用实现中分离出来 <p>通过分离接口定义和流程路由逻辑，我们已经开始看到ESB 形式的总线层(图 2-5)。通过将流程业务路由逻辑和接口定义放入总线层之内，应用能够继续自己集中于实现逻辑。 我们在第 1 章中看到过，ESB 被实际上区分为多个功能层。它为应用间的可靠的、异步的、基于消息的通信提供了一种坚固的底板。也是在这里，流程路由通过基于检查消息中的XML内容来附加的条件决策点，从而变得具具智能。这个智能路由是被可管理地定义的、可以被修改、并且可以加上增值服务，比如补充数据变换功能。ESB 提供了一个可扩展的集成服务网络，并且可以无限伸展，同时仍然可以以逐渐增加的方式进行构建 <p><img height="230" alt="figs/esb_0205.gif" src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB6_AC03/clip_image004.gif" width="457"> <p>图表 2‑5 ESB 可靠地连接和协调SOA 的服务之间的交互</p><img src ="http://www.blogjava.net/SteelHand/aggbug/137500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2007-08-17 12:19 <a href="http://www.blogjava.net/SteelHand/archive/2007/08/17/137500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>企业服务总线(ESB)(5)</title><link>http://www.blogjava.net/SteelHand/archive/2007/08/15/136850.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 15 Aug 2007 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2007/08/15/136850.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/136850.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2007/08/15/136850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/136850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/136850.html</trackback:ping><description><![CDATA[<h4>2.2<a>企业集成的目前状态</a></h4>
<p>这一节将详细讨论，今天各个企业应用怎样进行集成、或者怎样没有集成。还包括对今天很多组织中很流行的集成方式：偶然架构的讨论。
<h5>2.2<a>.1 企业大都连接不善</a></h5>
<p>在过去二十年以来，无数分布式计算模型一一登场：包括 DCE、CORBA、DCOM、MOM、 EAI Broker、J2EE、Web Services、.NET。 然而，迹象表明，不管采用何种技术，只有很少数企业的应用时很好连通的。按照来自 Gartner 公司的一个研究报告<a href="#_ftn1">[1]</a>，这个数字少于10%。
<p>关于应用的连通性，其他的统计数结果更令人吃惊，— 只有 15% 的应用的集成采用了正式的集成中间件。其余则使用 ETL 和批量文件传输技术，其主要以手工编写的脚本和其他定制方案为基础。关于 ETL 和批量文件传输的更多信息，以及他们相关的问题，我们在第9章讨论。
<h5>2.2<a>.2 偶然架构</a></h5>
<p>Gartner 15% 统计值提供一个关于当今的集成状态的一个令人深思的数据。那么其他85% 的应用是如何连接的呢? 一种在今天的企业中普遍存在的情形，我将其称为是&#8220;偶然架构&#8221;。所谓偶然架构就是没有人公开宣布创造的；相反，是多年积累的一种&#8220;就事论事&#8221;的解决方案。在一个偶然架构中，公司的应用被永远锁定在一个不灵活的刚性基础架构之上。然后他们又被视为是信息&#8220;地牢&#8221;，因为集成基础设施不能适应新的业务需求。 (图 2-1)
<p>大多数集成尝试都从某个深思熟虑的设计开始，但是经过一段时间后，其他的部分好像都各就各位地&#8220;集成&#8221;了，但是手工编写的代码却早已飘移出原来的内容之外。经过逐渐进行的螺栓和补丁，所谓整合的系统已经失去了其原来的设计完整性，尤其是如果系统是被很多的人来维护的，而他们对最初的设计意图可能没有很好地沟通。事实上，这种&#8220;就事论事&#8221;的方法将完全失去集成的一致性，因为工程师总将是&#8220;只是做一点点修改&#8221;作为解决问题的权益之计。最后甚至对找出那些地方做了修改都变得非常困难，更不要说要理解这些结果导致了那些方面的副作用影响。在一个部署系统中，这可能会对你的业务造成损失惨重的悲惨结果。
<p>对集成遵守标准能够为你创建一个针对所期望功能的基线来遵从。如果基础设施是专有的， 不基于标准的，那么随时间变化保持计划的设计和指导原则就变成棘手问题。虽然也可以构造专有的平台并且变通规则，但是这通常又导致更加&#8220;多样性&#8221;的后果，结果更加锁定于其上。然而，你应该记住的是简单地遵守标准并不必然地阻止你构建一个偶然架构。
<p><img height=273 alt=figs/esb_0201.gif src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB5_9C8C/clip_image001_1.gif" width=640>
<p>图表 2‑1 偶然架构将永远使公司的应用成为&#8220;信息发射井&#8221;
<p>在偶然架构背后的技术是各不相同的。图 2-1中的实线、虚线和点划线表示了连接应用的不同技术。这些技术可能包括 FTP 文件传输、直接的socket连接 、专有的MOM、以及有时是 CORBA 或其他类型的远程过程调用(RPC) 机制。某些定向的点对点解决方案可能已经使用了XML信封定义，或者基于SOAP或者其他什么机制的技术，来为集成的应用之间承载数据。
<p>图中间的集成Broker表示了在部门级的层次连接应用的一个岛屿。然而这并不意味着它能够连接任何事物。集成Broker通常只是结交给基础设施中的某一块，因此资金丰富的项目可能会取得适度的成功，但是它们再也不能与其它所承诺的部分进行很好的集成。
<p>偶见架构表现为得到一个刚性的，不能对集成提供一致的、持久的基础设施。它不能如其应该达到的效果那样很好地解决你的组织性的问题。要改变偶然架构一直以来就是个挑战，因为点对点的解决方案的数量不断在增长。这通常也意谓着应用之间的互相依赖性是紧密耦合的。使应用中的数据的表现的修改意谓着你还必须修改共享该数据的其他所有应用。这就限制你快速地改变你的业务流程，以适应变化了的或者新的业务机会。这些紧密耦合的、硬连接的接口不仅仅是偶然架构的问题。因为控制流、业务应用之间的通信的编排被硬编码进应用本身之中，这进一步导致了复杂化。这些都增加了系统之间的紧密耦合和脆弱性，使变更业务流程更加困难，并且导致了厂商所定。
<h6>2.2.2<a>.1 部门和组织问题</a></h6>
<p>偶然架构的先天技术不足队组织中的人力协调问题具有推波助澜的作用。不管问题是紧密耦合的接口还是硬编码的流程编排，要想回头或者对其进行较大的翻新改造简直是一件恐怖的事情。这经常需要安排大量的会议，和属于不同项目的不同的开发组的人们开会，就紧紧对要做什么以及何时做这类的问题达成一致。如果应用，以及他们分属的开发项目组，分别处于不同的地理位置和时间区，应用改变所需的协调问题则会变得更加困难。
<p>有时某些应用程序被视为&#8220;遗留&#8221;系统，对他们你是不愿意或不能够对其进行多少修改，因为它们已经进入维护模式。我们通常说，&#8220;遗留系统&#8221;的一个定义就是那些你昨天刚安装的系统。即使你对自己开发的应用具有完全的访问和源代码的控制权，当开发人员继续进行其他项目或离开公司的时候，对其进行修改也是非常困难的。我们将会在第 4 章中看到， ESB 大大地减少了随时间变化，修改数据模式和格式所带来的影响。
<h6>2.2.2<a>.2 逃离偶然架构</a></h6>
<p>即使你已经对跟踪和修改应用数据及其接口建立了良好的公司实践，偶然架构仍然还有其他缺点。使用不同的连接技术意谓着安全模型可能是混杂的，所以没有确定的方式来建立和执行公司级的安全策略。 对插入新的应用没有一致的 API可以依赖，而且没有基础来在棋上构建公司关于集成的最佳实践。最近与一些领导的专家进行了交流，总结了偶然架构的下列各项问题:
<ul>
    <li><strong>不可靠性</strong></li>
</ul>
<p>应用之间的通信或许能得益于异步的消息的可靠性。如果一个大型业务流程中的某两个应用之间的通信连接失败，整个业务流程可能会事务性地返回或者重启。我们将会在第5章学到更多有关松散耦合的、异步的可靠消息的更多内容。
<ul>
    <li><strong>性能和可伸缩性分析</strong></li>
</ul>
<p>不管你是否你已经有了一个预先的性能规划并且试图分析一个现有的性能问题，由于偶然架构的许许多多的子系统和他们各自的运行特征，这个工作是极其困难的。通常的做法是采用混杂的、&#8220;投入资源到其中，直到它能正确运行&#8221;式的解决方法，这将造成磁盘、处理器、内存等上面的过度开支。
<ul>
    <li><strong>总体排错</strong></li>
</ul>
<p>没有哪个单一方法能够提供充分的诊断和报告能力。 意外架构需要很多具有很高能力的维护人员围着所有有缺陷得生产系统转，这将导致整体拥有成本 (TCO)的急剧上升。各部分实现的方式差异越大，在其失效时需要用来解决它们的问题的专家经验就越宽。另外，建立一个基线来描述期望的正确行为也是一个挑战。
<ul>
    <li><strong>冗余和弹性</strong></li>
</ul>
<p>没有任何方式能够保证这个泥潭中的所有组建都能够满足你的关于可接受的冗余、弹性和容错度的定义。这意谓着要为依赖于后段系统的新功能定义可达到的服务级别协议 (SLAs) 是很困难的。
<ul>
    <li><strong>帐单漏洞</strong></li>
</ul>
<p>如果你的系统携带又能够收费的帐单数据 ( 比如电信)，那么账单数据的利息就可以被丢失在偶然架构之中。因此，你可能会损失收入并且还一点都不知道。
<ul>
    <li><strong>监控和管理</strong></li>
</ul>
<p>没有一致的方法来监控和管理一个偶然架构。假定你的整合应用系统必须运行 24/7 ，而且你的职员负责关注运行监控工具，并且做出纠正。这些工具将不会以相同的方式工作，那么在无数不同的小方案的基础上进行培训 ( 和再培训) 将是非常昂贵的事情。简单地安装企业级的运行管理工具并不能自动地将自省能力提供给集成基础设施，并且偶然架构通常并不能提供所有可能需要的控制点。
<p>总而言之，偶然架构表现为一种刚性的、高成本的基础设施，并且不能满足你的组织变更的需要，还要承受以下缺点的痛苦：
<ul>
    <li>&nbsp;紧密耦合的、易碎的、对变更不灵活的
    <li>&nbsp;因为多个点对点解决方案导致的昂贵的维护负担
    <li>&nbsp;修改一个应用程序可能影响其他很多应用
    <li>&nbsp;路由逻辑是硬编码到应用程序之中的
    <li>&nbsp;没有通用的安全模型；安全是混杂的
    <li>&nbsp;没有通用的 API(通常)
    <li>&nbsp;没有通用的通信协议
    <li>&nbsp;没有建立和构建最佳实践的通用基础
    <li>&nbsp;难以支持异步处理
    <li>&nbsp;不可靠
    <li>&nbsp;没有对应用和集成组件的健康监控和部署管理</li>
</ul>
<p>如你所知，偶然架构的创建已经有些年头了，要替换和解决它并不是一蹴而就的事情。随着继承项目的需求的增加，解决方案应该更加柔性的、简单、以及运行便宜，而不是其他什么东西。偶然架构给了你的那些敏捷的竞争者得到好处，而你却不能够在一个合理的时间范围内实现新的业务机会。
<p>你需要一个内聚的架构，面向实践、标准来解决着大量的问题。ESB 提供了架构和基础设施，并且使你能够逐个项目的基础上采用它。采用 ESB 并不是全有或全无，推倒重来式的方式。而是，你可以渐进式地采用它，同时还能利用你的现有资产-包括偶然架构和集成Broker，以一种&#8220;留下而分层&#8221;的方式。
<h5>2.2.<a>3 ETL</a>，批量传输，和 FTP</h5>
<p>提取、转换、和载入 (ETL) 技术，比如 FTP 文件传输和每夜批处理式的集成在今天仍然是最流行的方法。
<p>这通常涉及到将位于各个应用中的数据打包然后上传这样的操作。问题是有很大的可能在应用间的数据失去同步。一个失败的打包上传的处理程序可能要花上一天的时间。在京及和业务全球化的情况下，系统以24/7 的方式运行，再也没有了&#8220;夜晚&#8221;的概念，那你得批处理又该在何时执行呢？
<p>其他问题也可能与每夜的批处理相关。因为批处理的反应期问题，在分析关键业务数据的时候，最好的情形是24 小时轮转时间。这一延迟可能严重地阻碍你对随时变化的业务事件进行反应的能力。
<p>有时，一次跨越多个面向批处理系统的端对端处理处理甚至会花费一整个星期才能完成。处理从源头到目标的数据的总体潜伏反应期完全阻止了收集具有意义的，反应目前业务情形的数据的洞察力。比如，在供应链的场景中，这将导致你永远不知道你的库存的真实状态。
<p>第 9 章将会呈现一个通过FTP进行成批传输的技术和业务意义的案例研究，并且会研究ESB如何能帮助你逃脱偶然架构的困境。
<h5>2.2.<a>4 集成</a>Broker</h5>
<p>集线器-和-插头的集成Broker，或者EAI Broker，提供了偶然架构的替代。集成Broker是从上世纪90年代出现在，现在已经被植入到MOM主干或应用服务器平台之中。
<p>集成Broker市场的一些公司包括:
<ul>
    <li>SeeBeyond
    <li>IBM
    <li>webMethods
    <li>TIBCO
    <li>Ascential (Mercator)
    <li>BEA (more recently)
    <li>Vitria</li>
</ul>
<p>集成Broker能够使用一个集线器-和-插头架构帮助偶然架构提供应用之间的集中路由。此外，他们还允许使用业务程序管理 (BPM) 软件将业务流程从下层的集成代码中分离出来。到此为止，所有的都是好消息。
<p>然而，对集成Broker方式也有缺点。一个集线器-和- 插头拓扑不允许对局部集成域之上进行局部控制。构建在一个集线器-和-插头拓扑之上的BPM 不能够建立跨越部门和业务单位的业务流程极其编排。 集成Broker也可能受限于下面的MOM不能越过物理的LAN网段和防火墙的能力限制。
<p>有许多公司已经在其集成策略中采用了集线器-和-插头的集成Broker解决方案。 这些技术具有较高的成本，并且成功也值得怀疑。1990 年代后期的昂贵集成Broker项目已经取得了名义上的成功，但是将组织置于专有的集成域的井中。一项Forrester在2001 年十二月发布的研究报告<a href="#_ftn2">[2]</a> 展示了下列各项统计:
<ul>
    <li>&nbsp;集成项目平均 20+ 个月才完成
    <li>&nbsp;少于 35% 的项目能够准时和在预算内完成
    <li>&nbsp;35% 的软件维护预算被花费在维护点对点应用连接之上
    <li>&nbsp;在 2003 年， 全球 3500 家企业平均期望花费六百四十万美元到集成项目上</li>
</ul>
<p>这项研究还是在EAI 在它的最尖峰的时候进行的，而且几乎没有迹象表明这一数字在那时候起之后得到了改善。注意一年六百四十万美元是公司会在集成项目上花费的平均数的一个预测。当于这些公司的领导们交流这些问题的时候，我进行了一个一般性的求证。
<p>照今天的预算标准来看，EAI Broker项目是很昂贵的。集成软件费用很贵的，通常单独对于软件许可费用，每个项目的价格范围就在从 $250,000 到一百万美元不等。这还不算一起的咨询服务组件，而这个组件的价格往往是软件许可费用的5到12倍。
<p>集成Broker高昂的启动成本又被另一事实所进一步恶化，即从一个项目中学到的知识不能很好地转移到下一个项目。由于传统的 EAI Broker技术的专有特性，通常具有很陡峭的学习曲线，对于每个项目来说，有时候实6个月。要试图弥补这个负担的通常方式是聘请事前对专有技术经过培训的特别的顾问。当然，高特殊性=高价格。这是高昂咨询费用的一个重要组成部分( 另一个大的组成是技术安装、配置、部署、和管理的复杂性)。并且一旦项目完成，顾问就不见了。
<p>集成项目的实现时间普遍是在 6-18 月之间。这意谓着。根据事前针对短期设定的标准、以及项目资金，实施时间吃掉了项目原本想要利用的策略性窗囗。
<p>集成Broker的专有性质，以及高昂的咨询费用通常导致供应商锁定和重启后续项目的巨大成本。这意谓即便对于成功的项目，增长和伸展也是令人恐惧的。而且在你对你的供应商或者实现心生不满的时候，你也得面对到底是就目前的情况继续走下去，还是选择完全重新开始，雇用更多的咨询顾问或者投入另一个新的学习曲线之间左右为难。因为所有这些，一些IT组织通常留下了一些难以再集成到其他项目的&#8220;集成孤岛&#8221;。总而言之，集成Broker已经证明是偶然架构里面的老套技术，而并非它的解决方案。
<p>当我们更详细地讨论集成Broker的时候，我们将看到导致这里所列的问题的技术屏障。另外，许许多多的非技术因素也导致了对采用ESB的需求的增长。
<hr align=left width="33%" SIZE=1>
<p><a href="#_ftnref1">[1]</a> [2]来自 Gartner 公司的统计,"集成Broker，应用服务器和 APSs,"10/2002.
<p><a href="#_ftnref2">[2]</a> [3]来自 Forrester 研究的统计学,"减少集成费用,"12/2001.</p>
<img src ="http://www.blogjava.net/SteelHand/aggbug/136850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2007-08-15 11:11 <a href="http://www.blogjava.net/SteelHand/archive/2007/08/15/136850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>企业服务总线(ESB)(4)</title><link>http://www.blogjava.net/SteelHand/archive/2007/08/13/136301.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Mon, 13 Aug 2007 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2007/08/13/136301.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/136301.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2007/08/13/136301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/136301.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/136301.html</trackback:ping><description><![CDATA[<h3><a>2集成的状态</a></h3> <p>各种因素，包括技术和业务层面的，导致对新的集成方式的需要。有许多新的业务驱动因素，比如经济条件的改变、新的革命性的硬件技术比如射频识别标签 (RFID)的出现、法规管制的遵从，都预示着从业务视图来看，应用集成和数据共享都要发生重大变革。这些驱动好像与企业中目前的集成状态不一致子，并不象你所想的那样超前。当我们在这一章中详细研究的时候，大多数应该只是简单集成的项目不能很好集成，主要是由于缺乏能够广泛采用的一致的继承策略所致。 <p>下面是影像着对更大规模的集成解决方案的需要的各种需要： <ul> <li>经济的驱动器。</li></ul> <p>这些已经改变了IT花费的形式。经济因素导致IT部门主要集中于使事情能够与他们当前已经有的应用一起工作。 <ul> <li>最高优先序: 集成。</li></ul> <p>调查结果表明集成继续处于CIO的优先序列的最顶层。 <ul> <li>法规的遵从</li></ul> <p>Sarbanes-Oxley法案、PATRIOT法案、以及 FCC 法规都强迫公司建立一个必须的内部基础设施来比以前一样更加详细地跟踪、路由、监控、和获取业务数据。 <ul> <li>直通处理 (STP) </li></ul> <p>STP 的目标是消除业务流程的无效率，比如数据的人工再输入、传真、纸面邮件、或者不必要的数据批量处理。在行业中，比如金融服务，这可以帮助达到几乎零反应期的交易处理。 <ul> <li>射频识别标签(RFID) </li></ul> <p>被视为下一代条形码的革新， RFID 可能会产生大量的新型数据，然后这些数据需要被路由、变换、聚集，和处理。 <p>不幸的是，公司的集成环境的目前状态在这些领域几乎没有取得什么进展。这又使得业界领袖不得不重新寻找更广泛的集成解决方案。而有关集成的目前状态的问题包括: <ul> <li>良好连接企业的普遍缺乏。</li></ul> <p>这阻碍了企业向自动化业务流程进步，然后由阻碍了其对不断变化的业务需求的快速反应。 <ul> <li>偶然架构</li></ul> <p>偶然架构是一种一直使用的事实上的集成方式，其结果是没有连贯一致的公司级的集成策略。这表现为老是要留下点对点的集成、每一个都有其自己的连接和集成风格。偶然架构表现为不连贯的脆弱和刚性架构、并且不能经受集成环境的新的附加条件和变化。 <ul> <li>ETL，批量传输和FTP。</li></ul> <p>使用FTP文件传输和每夜批处理的方式进行提取、变换和载入 (ETL) 的技术仍然是今天“集成”最流行的方法。 这些处理涉及到每夜对各种应用之上的数据进行打包上载的操作。由于这种做法的潜伏反应期和错误率，组织从来不会不真正拥有对它们的关键数据的好的快照。 <ul> <li>过去使用集成Broker的危险。</li></ul> <p>上世纪90 年代后期，昂贵的集成Broker项目看似成功，但是给组织留下了大量专有的集成领域难以消化。 <p>这章将会详细讨论这些因素。除此之外，它将会解释通过逐渐采用重构到ESB的好处，同时使用学习自集成Broker技术的最佳实践。 <h4><a>2.1业务驱动激发集成</a></h4> <h5><a>2.1.1 IT</a>开支的趋势</h5> <p>经济因素导致IT部门主要集中于使事情能够与他们当前已经有的应用一起工作。在Y2K之前，大多数公司都把它们的主要花费集中在准备应付 Y2K之上，包括购买打包的没有Y2K问题的应用。 <p>后来的经济低迷时期，不管是否归结于后Y2K时代、Internet泡沫破灭时代、9/11、或者战争的不确定性，都已经导致了IT花费的急剧变化。这已经有对集成造成了特殊的冲击，不管是正面的还是负面的。IT预算和前 Y2K时代相比已经今非昔比。再也不会出现IT经理手中握着对集成Broker软件和服务的数百万美元预算，并且还要花费18-24个月的时间来等待项目结果这样的事情了。IT花费现在变得都要通过执行层，每一个项目都要经过仔细审查。只有对业务生存能力至关重要的项目才能得到资金。公司在每一个项目的基础上要求在3-6个月的时间片内得到切实的效果和投资回报，虽然他们仍然维持着改良整体运行效率的策略目标。 <h5><a>2.1.2 &nbsp;作为高优先级的集成</a></h5> <p>新的节俭时代并没有减少对业务流程的改进和对集成的需要。 业务层面的驱动仍然存在；减少业务周转时间需要，减少存货水平的需要，消除重复IT服务的需要，如此等等。 <p>IDC的一分报告指出<a href="#_ftn1">[1]</a> 他们调查了557个CIO关于他们2004年事情的优先级。关于集成报告中这样说: <p>在2003年6月举行的IT和执行层交流会上，关于什么可以被称为“市场推动”趋势的问题，集成已经成为2004年IT规划中比安全具有更高优先级的事情。 <p>报告同时指出，集成和安全分别占第三和第四位，在最高的CIO优先级的列表中，仅仅排在“基础设施替换/升级”和“IT费用削减”之后。 <p>总体百分比则受到了有 21% 的“中间市场”公司将集成的重要性排在前面的影响，甚至超过了“减低成本”和“基础设施替换/ 升级”。表 2-1 战士了这个问题的答案:“ 下列各项问题，你认为在 2004 年终期待有最高的优先级吗? 选择一个。” <hr align="left" width="33%" size="1">  <p><a href="#_ftnref1">[1]</a> IDC，应用开发中的集成标准趋势: 着全赖于“开放”的真正含义，2003 年11月 (文件 #30365) ， http:// www.idc.com 。 <p>&nbsp; <p>&nbsp; <p><a href="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB4_8F12/2-1.png" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="768" alt="2-1" src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB4_8F12/2-1_thumb.png" width="982" border="0"></a>  <p>&nbsp; <h5>2<a>.1.3 法规遵从</a></h5> <p>有时候，对集成的需要在强加于你的，不管你是否喜欢它。 甚至在困难时期，当预算紧张时，为了集成目的而对基础设施进行修补也一定要遵从政府的法规管制。 如大部分它人们会证明,不有而有很多的仅仅继续尝试维持状态.为新的集成策略担忧。 然而,没有像有者监牢时间和强烈的罚款视野得到资深的管理注意。 <p>由于范规管制的问题，一些行业的公司必须向竞争者提供信息，并且对信息访问进行审计。比如，在电信业中，负有职责的电信营运商(ILECs) 应该提供信息给竞争的 LECs 。能源公用事业也应该提供账单信息给竞争者。保健机构和隐私法律需要跟踪客户记录访问以供审计之目的。这需要你的分离的数据能够以标准的协议和以标准的格式轻易被访问。 <p>下面是一些领域，在其中法规遵从是个驱动力。 <h6><a>2<a>.1.3</a>.1 电讯</a></h6> <p>一个 FCC 法规要求所有的电讯提供商和地方性的向地方性的营运商暴露他们的客户数据的某些部分。 一主修电讯供给者正在有强烈的罚款欺骗它为不遵从这一个需求。很明显，甚至一家主要公司也不能够负担得起继续基础上支付那么多的钱。与法律要求的共享信息相关的许多问题和高额成本，并且过滤掉那些法律不要求的部分。因此，一个过分单纯的方法不能同时满足法律要求又能保护敏感的公司数据。你需要又细粒度的过滤器和有选择的数据变换来只提供必需的数据 (也许只有在最后的一分钟) 来最小化你的竞争者可能访问所导致的对你的数据的利用。所有这些都需要有对业务流程的细粒度的访问和控制。 <p>电信提供商需要一个基于标准的、能够伸展到小的电信提供商的集成解决方案，使用较小的电信商也能够采用来作为集成策略的各种协议。为了满足这个需要，公司最终采用 ESB 。 <h6><a>1.1.1.2 Sarbanes-Oxley</a></h6> <p>2002年颁布的Sarbanes- Oxley 法案旨在通过改善公司信息披露的准确性和可靠性来保护投资者，它强制了新的报告需求，并且对公司的决策者和他们的企业引入了更高的问责性。 遵从Sarbanes- Oxley 法案需要面临一些真正的挑战。包括费用考虑，后勤复杂性，数据收集和管理问题，以及正确的数据的及时报告，不管数据存在于哪一个企业之中。 <h6><a>2<a>.1.3</a>.3 政府</a></h6> <p>美国联邦政府已经设定一个目标 在2003 之前变成无纸化。在2003年一月的美国政府CIO高峰会上，Brand Niemann，CIO理事会XML Web Services工作组的主席，对美国政府的集成中采用XML的驱动力是这样说的: <p>1998年的政府文书工作消除法案，要求联邦政府机构在2003年10月前，如果可行，允许与政府打交道的个人或者实体能够有选择地向政府机构电子化地提交信息和进行交易处理，或者如果可行，允许维持电子记录。 <p>法规遵守产生了巨大驱动能量，并且集中于跨越整个政府机构集成后端应用和数据源。当我们在第 11 章讨论门户环境中的ESB 的时候，ESB能够在门户服务器和多个后端应用之间扮演媒介中介而提供重要的价值。 <h6><a>2<a>.1.3</a>.4 直通处理</a> (STP)</h6> <p>直通处理 (STP)意味着对于跨越整个系统和组织的业务流程的事务性数据只需要输入一次。在其他行业中， STP 可能被称为“流通供给”、“无纸采集”、“lights-out”或者“hands-free”处理。 <p>达成 STP 的目标要消除业务流程的无效率，比如数据的手工重新输入、传真、纸面邮件、或数据的不必要的批处理。今天阻碍 STP 的事物的例子包括将采购订单重新输入到信用卡验证系统，或者周期性处理的数据分批。 <p>在金融服务、电信和公用事业中，STP 是一个主要驱动。在金融服务中，“T+1”的目标是将交易数据沉淀一天。自动化程序运行可以帮助公司在整个订单和贸易的生命周期中减少成本，更快捷地服务客户，以及更有效地管理业务风险。 <h6><a>2<a>.1.3</a>.5 射频识别标签</a> (RFID)</h6> <p>射频识别标签(RFID) 正在改变企业跟踪其整个供应链中各处的货物和供应的方式。RFID标签还承诺能够通过消除人们打开外包板条箱和托盘扫描条形码内容的需要从而自动化供应链。装备有RFID标签的货物通过安装在仓库或者装货码头的阅读器时，会差生大量的消息，而这些数据又将会产生大量的需要被捕捉、路由、变换和输入到其他队业务有意义的应用之中的数据。 <p>零售卖场中装备有RFID阅读器的“智能货架”能够自动跟踪货架上的货物数量，并且在货架存量低于标准的时候自动产生补货的订货命令。这些货架阅读器也会知道，消费者从货架上拿起一件商品平，然后可能又因为另一种商品而将它放回货架。这种类型的数据对于那件重新放回货架的商品的制造商来说也是很有价值的。 <p>领导零售商，比如Wal- Mart和 Tesco、和美国防卫部，已经对齐大型供应商强制要求在大外包装级别装备RFID标签了。其最终目标是要驱动标签本身的价格下降，使得最终对每一但见商品，比如一把牙刷或者一罐苏打，进行RFID标签识别变得可行。这样将大大增加在一个托盘经过阅读器是所产生的消息数量。这种数据量在人工扫描外包装上的条码的时候是不会产生的。当一个托盘经过阅读器的时候，ESB能够作为因为而缠身的爆发性数据的缓冲以便能够准确捕获这些数据。那些没有针对这种数据量进行设计的应用可以得到ESB 的消息层的保护，它能够将工作量分配到多个后端系统，或者进入消息队列排队，直到其能够被处理。 <p>因为个体物品级RFID标签而导致的消息的粒度更细，对那些没有针对处理超过大包装级别粒度的数据的应用也是个问题。ESB 能提供殊的缓存、聚集和变换服务，以便能够将收集更细粒度的数据，并将其聚集为大包装级别的数据，以便那些应用能够读取。 <p>EPCglobal 组织正在促使 RFID 标签、阅读器、以及将阅读器整合到应用的软件的标准化。为了要广泛地共享 RFID 数据，需要对整个供应链中的相关应用和阅读器网络定义集成规则。而为了避免网络中的RFID 数据洪水，过滤和聚集规则应该尽可能地分布到最靠近RFID 事件的产生点。ESB 是一个很好的管理和配置那些控制数据流得规则的理想远程集成平台。 <img src ="http://www.blogjava.net/SteelHand/aggbug/136301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2007-08-13 10:13 <a href="http://www.blogjava.net/SteelHand/archive/2007/08/13/136301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>企业服务总线(ESB)(3)</title><link>http://www.blogjava.net/SteelHand/archive/2007/08/11/135981.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Sat, 11 Aug 2007 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2007/08/11/135981.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/135981.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2007/08/11/135981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/135981.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/135981.html</trackback:ping><description><![CDATA[<h4><a>1.7采用ESB </a>的行业</h4>
<p>许多新生技术都经受过试图找到问题来解决以获得采用的痛苦经历。另一方面，ESB的概念是由业界领袖的架构师和技术社区中的领导厂商一起和定义和构建的，因此，ESB从诞生之时便得到采用。ESB正在或已经被用在多种行业，包括金融服务、保险、制造业、零售、电信、能源、食品分销和政府。下面是一些例子。
<h5><a>1.7.1 金融服务</a></h5>
<ul>
    <li>一个领先的Subprime借贷公司实现了 ESB，减少了60% 的业务处理费用。这是通过在eCredit 系统、第三方信用机构、以及他们自己的后端系统之上建立一个统一的客户数据视图来达到的。
    <li>领先的银行已经使用ESB实现了金融交易的直通处理，很客官地节省了手工处理成本。
    <li>一个派生的贸易系统依靠ESB每天为1,200用户处理超过100,000 笔交易，记录超过数十亿美元的帐务。</li>
</ul>
<h5><a>1.7.2 保险</a></h5>
<ul>
    <li>世界最大的寿命和健康再保险公司，年收入二百亿美元，将ESB作为理清在总部和销售及管理其政策的保险代理商之间的后端交易数据的交换的解决方案，产生了可观的费用节省。</li>
</ul>
<h5><a>1.8.3 制造业</a></h5>
<ul>
    <li>一个橱柜台面和地板制造商通过使用ESB实现了一个一体化管理的存货系统和&#8220;可用性承诺&#8221;查询系统，提高了供应链的预见能力，减少了最低库存报警的条件。在部署的第一阶段， ESB被用来连接该制造商和其60个分销商之间的供应链网络。</li>
</ul>
<p>ESB 的部署模型允许制造商在分销商的地点部署ESB 服务容器。这是在每个远程地点部署一个集成Broker方案的另一选择。
<ul>
    <li>一个主要的照明、电视和医学成像的制造商正在使用 ESB 创建一个统一的集成主干来连接其遍布全球的业务单位，并且为全球的客户创建一个统一的产品和订单视图。</li>
</ul>
<h5><a>1.7.4 零售</a></h5>
<ul>
    <li>&nbsp;使用一个基于标准的，集中的管理框架，一个全家的影像零售连锁店正在采用ESB 基础设施来通过一个中央管理和配置控制台动态地配置和管理 1,800个远程店铺，
    <li>&nbsp;世界最大的邮购公司 (收入一百二十亿美元)依靠 ESB 来从其许许多多的供应商订购产品。</li>
</ul>
<h5><a>1.7.5 电讯</a></h5>
<ul>
    <li>一个电话营运商的Web门户网站依靠ESB来对用户点击进行分析跟踪 (二小时的响应对 30 天的响应时间)， 并且每天处理一千六百万个消息。
    <li>美国第二大的电信营运商，收入四百三十亿美元，使用 ESB来从内部的系统向竞争者提供信息。</li>
</ul>
<h5><a>1.7.6 能源和公用事业</a></h5>
<ul>
    <li>一家一百亿美元的电力公司可靠地实现了 ESB，用来连接内部系统和政府强制的应用。 对帐务、系统管理、运行报告、以及法规强制的与竞争者的信息共享，提供了实时数据。</li>
</ul>
<h5><a>1.7.7 食品分销</a></h5>
<ul>
    <li>一个主要的欧洲食品分销网 ( 一个十二亿美元的分公司)在八个星期内实现了 ESB，并且节省了使用一个集中的集线器-插头 Broker的集成方式所需的三百万美元。ESB 通过管理供应链中的买、卖和物流协调，从肉类产品的配送到饲养家畜的饲料的生产，从而自动化了整个分销网络。
    <li>在这个食物分销网络中， ESB 集成了跨越三个不同的运行公司和许多第三方伙伴的应用，导致运行效率增加、可观的费用节省、以及更容易的集成新系统的方法。</li>
</ul>
<h5><a>1.7.8 政府</a></h5>
<p>n 一个美国政府机构正在使用ESB 来整合多个政府系统，以满足USA PATRIOT法案。USA PATRIOT法案允许政府跟踪金融交易，以防止恐怖份子得到资金。该项目包括使用 ESB 来集成门户服务器和各种政府机构中的后端系统，以提供一个统一的数据视图。
<h4><a>1.8小结</a></h4>
<p>概括起来， ESB 具有下列各项特性:
<ul>
    <li>普遍性</li>
</ul>
<p><em>ESB </em><em>可以采用来适应各种集成情形下的各种通用目的集成项目的需要。它能够构建跨越整个企业和其业务伙伴的集成项目。</em>
<ul>
    <li>高度分布的、事件驱动的 SOA。</li>
</ul>
<p><em>松散耦合的集成组件可以在总线上以广泛分布的地理拓扑进行部署，并且在总线中可以随处作为共享服务进行访问。</em>
<ul>
    <li>选择性的集成组件部署</li>
</ul>
<p><em>适配器、分布式的数据变换服务、基于内容的路由服务都可以在需要时有选择地部署，并且可以独立地伸缩。</em>
<ul>
    <li>和可靠性</li>
</ul>
<p><em>通过总线进行通信的所有组件能得益于可靠消息、事务完整性、以及安全的认证通信机制。</em>
<ul>
    <li>编排和处理流</li>
</ul>
<p><em>ESB </em><em>允许数据流过插入到总线中的任何应用， </em><em>不管是本地还是远程。</em>
<ul>
    <li>自治而联邦管理的环境。</li>
</ul>
<p><em>ESB </em><em>支持部门和业务单元级别的本地自治，并且仍然能够在较大的受管的集成环境中整合。</em>
<ul>
    <li>逐渐采用。ESB 可用于小项目。</li>
</ul>
<p><em>每个个别的项目能进入一个更大的集成网络，它们可以从总线上的任何地方进行远程管理。</em>
<ul>
    <li>XML支持</li>
</ul>
<p><em>ESB </em><em>可以充分利用XML</em><em>作为&#8220;</em><em>原生&#8221;</em><em>数据类型的好处。</em>
<ul>
    <li>即时洞察力</li>
</ul>
<p><em>ESB </em><em>提供了对及时业务数据的实时洞察能力。BAM</em><em>能力已经被构建到ESB </em><em>框架之内。</em>
<p>你现在应该有了关于 ESB的足够的信息来满足你的好奇欲了。 接下来，在更详细的章节中，你将会学到更多有关其底层技术方面的内容。下几章将会讨论 ESB 的进化、目前的集成状态，采用XML来作为一个通用的数据交换架构以在不同的数据表示之间协调的好处，以及异步消息和MOM。 </p>
<img src ="http://www.blogjava.net/SteelHand/aggbug/135981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2007-08-11 09:50 <a href="http://www.blogjava.net/SteelHand/archive/2007/08/11/135981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>企业服务总线(ESB)(2)</title><link>http://www.blogjava.net/SteelHand/archive/2007/08/09/135404.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Thu, 09 Aug 2007 01:26:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2007/08/09/135404.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/135404.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2007/08/09/135404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/135404.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/135404.html</trackback:ping><description><![CDATA[<h4><a>16.1ESB </a>的特性</h4>
<p>由于试图快速进入成长中的 ESB 范畴的厂商的慌乱，以及大量行业分析师和记者在分析报告中分别展示他们各自的观点，可以理解，这其中对于ESB 到底是什么还具有很多混淆。这一节将概略说明 ESB 的主要特性。
<h5><a>1.6.1 普遍性</a></h5>
<p>如第 1 章所示， ESB 能形成普遍的网格的核心。它能够跨越和超过扩展企业，并且横跨部门组织、业务单位和贸易伙伴形成全局的范围。ESB 也能很好地适合于局部的集成项目，并且对促进它们采用任何类型的集成环境提供柔性的支撑。
<p><a href="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image002_2.gif" atomicselection="true"><img height=174 alt=clip_image002 src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image002_thumb.gif" width=240></a>
<p>图表 1‑2 ESB 形成一个能跨越了一个全球企业网络的普遍网格
<p>应用可以按需插入总线，并且具有可视性，以及能够与其它已经插入到总线中的任何其他应用和服务共享数据。虽然Web Services是 ESB 架构的一个有机组成部份，但是所有的应用并不是一定要被修改成为真正的Web Services才能参与到 ESB。连接性是通过多种协议、客户端API 技术、遗留消息环境、以及第三方应用适配器来达到的。
<h5><a>1.6.2 基于标准的集成</a></h5>
<p>基于标准的集成是 ESB 的基本概念。对于连接性，ESB 可以使用J2EE组件，比如使用Java Message Service (JMS)来进行MOM连接，使用J2EE 连接器结构 (JCA 或 J2CA) 来连接应用适配器。ESB 也能够非常漂亮地与使用.Net、COM、C#、C/C++构建的应用进行集成。除此之外，ESB 也能集成支持SOAP和Web Services API的任何组件，这其中包括事实上的标准Web Services工具箱的实现，比如Apache Axis。为了处理数据操纵， ESB 可以使用XML标准，比如XSLT、XPath 和 XQuery 来提供数据变换、智能路由、以及在数据流过总线的时候提供&#8220;空中&#8221;查询。为了处理 SOA 和业务流程路由， ESB 可以使用 Web Services描述语言 (WSDL) 来描述抽象的服务接口，使用针对Web Services的业务流程运行语言(BPEL4WS)、WS- Choreography或者一些其他基于XML的词汇表，如 ebXML BPSS，来描述抽象的业务流程。
<p>如果你还不懂这些深奥的词汇的含义，也不要担心。虽然本书并不想作为是这些各个技术的详细参考或个别指导，我们也会在他们如何与 ESB 有关的语境中足够详细地解释它们。
<p>这些基于标准的接口和组件被整合到一个意义非凡的包含开放端点的可插入架构之中。ESB提供了一种基础设置来同时支持基于工业标准接口集成组件和使用标准化接口来实现的专有元素。下图展示了一个使用JMS和JCA集成一个 J2EE 应用、使用JCA应用适配器集成第三方打包软件、使用C#客户端程序集成一个.NET应用、使用Web Services集成两个外部应用的案例的高阶视图。
<p><a href="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image004_2.jpg" atomicselection="true"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=235 alt=clip_image004 src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image004_thumb.jpg" width=240 border=0></a>
<p>图表 1‑3 ESB 整合多种不同的技术
<h5><a>1.6.3 高度分布的集成和选择性部署</a></h5>
<p>ESB 在其中借鉴了传统EAI Broker的许多功能，比如从它提供集成服务 , 像是业务流程编排、数据路由、数据变换、以及应用适配器。然而，集成中介者通常是高度集中和单一的形态。ESB 将这些集成能力提供为独立的服务，能够以一种高度分布的形态一起工作，并且能够彼此间独立伸缩。在第 6 章中，你将会学习更多有关 ESB&#8220;服务容器&#8221;，ESB 的一项核心概念的内容，它允许对集成服务进行选择部署。
<h5><a>1.6.4 分布式数据变换</a></h5>
<p>任何集成策略的一个关键部分就是能够轻易地在应用之间转换数据格式的能力。许多应用对描述相似的数据并不共享相同的数据格式。
<p>数据变换是一个 ESB部署的一个固有部份。变换服务特别针对那些被插入总线的个别应用能够在总线的任何地方被定位和访问的需要。因为数据变换是ESB 本身的一个有机组成部份，解决应用之间的阻抗失配问题便可以想到ESB。
<h5><a>1.6.5 通过分层的服务来达到可扩展性</a></h5>
<p>ESB 能够为你提供本质上针对任何集成项目所必需的核心能力，并且可以通过使用分层的服务来处理特定的用途来增加。例如，特殊的能力，比如业务流程管理 (BPM) 软件能处理工作流相关的业务流程，而协作服务器能够提供对伙伴业务流程管理的特殊服务。专门的第三方翻译器能够将外部数据，比如EDI，转换到能进入目标企业资源规划 (ERP) 系统之内的格式，或者在通用总线之上的规范XML表现。
<h5><a>1.6.6 事件驱动的</a> SOA</h5>
<p>在 ESB驱动的、事件驱动的 SOA中，应用和服务被当做抽象服务端点，能够轻易地对异步事件做出响应。SOA 对其底层的连接性和管线细节提供了一个抽象的方式。服务的实现不需要理解协议。服务也不需要了解消息是如何路由到其它服务的。他们只是简单地将接收自 ESB 的一个消息作为一个事件，然后处理该消息。ESB 可以把消息发送到它想要去的其他任何地方。
<p>在 ESB SOA 中，用户定制服务可以被创建、扩展，并且被重用为ESB 功能。被暴露为服务的应用端点，可以同特殊的集成功能一起构造成复合业务服务和业务流程，并且它们可以根据不同目的重新组合，其目标是在一个即时企业中提供自动化的业务功能。
<p>第 7 章将会更详细地讨论 ESB 中的 SOA 。
<h5><a>1.6.7 处理流</a></h5>
<p>ESB的处理流从简单的优先步骤序列到使用条件分支和联合来并行执行的综合业务流程编排。这些特征可以使用简单的消息元数据或者通过使用诸如BPEL4WS 之类的业务编排语言来控制。
<p>ESB 的处理流能力使得定义属于某个部门或者业务单位局部的，或者共存于一个较大的集成网络中的业务流程成为可能。这点却是一个集线器-插头中介者或一个 BPM 工具自己所不能很好地自己解决的问题。第 7 章将会详细讨论分布式的流程能力，它能提供高度分布的流程编排能力而不需要中心化的流程和规则引擎。
<p>ESB的业务流能力也涉及到基于内容的消息的智能路由的特殊集成服务。
<p>因为ESB 的业务流能力构建于分布式的SOA之上，它也能够跨越高度分布的物理部署拓扑（甚至扩越大洋）而不用痛苦地忍受总线上各种应用和服务之间的物理边界和多协议的鸿沟。
<p><a href="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image005_2.gif" atomicselection="true"><img height=150 alt=clip_image005 src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image005_thumb.gif" width=240></a>
<p>图表 1‑4 跨越物理和逻辑边界之上的部署拓扑的编排和业务流
<h5><a>1.6.8 安全和可靠性</a></h5>
<p>在 ESB 上的节点之间的连结是具有防火墙能力的。应用和 ESB之间的安全性，甚至在 ESB 节点自身之间的安全性，能够建立和维护最高强度的认证、凭证管理、和访问控制。
<p>可靠性是通过处于ESB核心的企业级MOM来达到的。MOM核心提供异步通信能力、业务数据的可靠传输、以及事务的完整性。你们将在第 5 章中学到，这已经不是十年以前的传统MOM技术了。需求从那时以后开始进展，并且已经成熟，而 作为ESB 的核心的MOM必须符合今天的需求。
<h5><a>1.6.9 自治但联邦的环境</a></h5>
<p>传统的集线器-插头中介者方式往往具有组织性的边界问题，这主要是因为EAI Broker对跨越防火墙和网络域的无能的实际限制所引起。更重要的是，即使一个集线器-插头架构能够被伸展而跨过组织的交界，它仍然不允许各个业务单位彼此半独立地运行所需要的局部自治。与不断扩展的集成范围延伸超过部门层次所相关的最大问题之一是自治和集中控制之间的问题。
<p>作为大多数大型公司环境的业务文化的一部分，每个部门或业务单位需要彼此独立地运作。 然而，他们仍然依赖于共享资源，以及输入到通用业务功能之中的报告和帐户信息。
<p>在这样一个环境中，需要所有的消息流量都流过位于总部的一个集中的消息Broker的集成策略是不合理的。 这不只是一个技术上的障碍；它也是公司文化的问题。在一个松散耦合的业务单元环境中，诸如本地应用之间的业务流程，或者安全域，被一个集中化的公司IT功能管理简直没有一点道理。组织中的松散耦合业务单元需要彼此独立地运作。他们每一个都应该有其自己的IT功能，而不必须路由所有的消息流量，或代表它的业务规则和安全域的控制, 经过一个集中的集成经纪人在一个位置或另一个(第 1 章)。
<p><a href="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image006_2.gif" atomicselection="true"><img height=150 alt=clip_image006 src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image006_thumb.gif" width=240></a>
<p>图表 1‑5 如果使用一个集中的集线器，分开业务单位缺乏必需的自治-和-了集成经纪人
<p>本地业务单位和部门需要有对他们自己的局部IT资源的控制，比如在其站点运行的应用。集成基础设施应该支持部署拓扑来支持具有实用性的业务模型。ESB 也提供这种部署模型， 允许本地流量、集成组件以及适配器能够被本地安装、配置、加固和管理，并且仍然能够以一种集成的安全模型一起将本地集成域插入到一个更大的联邦集成网络之中。
<p><a href="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image007_2.gif" atomicselection="true"><img height=151 alt=clip_image007 src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image007_thumb.gif" width=240></a>
<p>图表 1‑6 自治的而且公布联邦制,ESB 允许横过组织的交界对合作地同盟的运算组织
<p>ESB 的分布式特征是通过从实际的部署细节和底层的连接协议中抽象出来的将端点定义，以及在那些端点之间的数据的编排和路由来达到的。联邦特征则是通过 ESB 能够隔离和选择地横过应用域和安全边界的能力来达到的。
<h5><a>1.6.10 远程配置和管理</a></h5>
<p>在一些业务模型中，在每一个远程地点都安排有本地的IT职员是不大可能的，虽然仍然需要松散耦合的、自治的联邦的集成网络。举例来说明这一个点，我们来想象一下部署在零售行业中的ESB 的案例。一个视频租借链可能有数百或数千个包含相同应用的地点，所有以相同的形态运行的操作涉及到目录管理、会计和报表等。
<p><a href="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image009_2.jpg" atomicselection="true"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=192 alt=clip_image009 src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image009_thumb.jpg" width=240 border=0></a>
<p>图表 1‑7 和数以千计遥远的储存一个视像零售链,所有的包含应用程序的相同组
<p>使用 ESB，可以建立一个集成蓝图来处理远程店铺中的局部应用之间的通信。这包括店内应用的接口定义、消息流量的路由、消息通道的管理、以及安全许可。它还可能包括集成组件，比如应用适配器、协议适配器或者数据变换器。这个集成蓝图，或称模板，可以在所有地点进行部署和定制，并且独立地扮演所有其他店铺。
<p><a href="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image011_2.jpg" atomicselection="true"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=141 alt=clip_image011 src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image011_thumb.jpg" width=240 border=0></a>
<p>图表 1‑8 ESB 配置蓝图在每个遥远的位置和很远地展开配置而且处理
<p>这个远程部署蓝图的能力并不单针对零售行业，它也可以扩展到所有其他行业的应用。联邦的集成域的远程管理对于在一个高度分布的环境中的任何ESB的成功部署都是非常关键的。
<p>安全、可靠的消息联结
<p>除了在每个店铺的本地应用之间共享数据之外，这些远程店铺还需要同总部共享信息以便进行帐务处理和报表、信用管理以及职员数据的追踪。远程店铺还需要彼此之间共享信息。举例来说，一个大型的音像连锁店可能会提供这样的服务，顾客可以选择从离家近的店租赁影碟，然后在离办公室近的另一个店归还。因此，在同一个地理区域内的店铺之间可能会需要以近乎实时的状态共享有关租赁的数据。因为在远程店铺和总部之间的卫星网络通信连接存在较大的反应期和弹性，要在总部维护一个有关所有租赁信息的实时集中访问点是不现实的。那些有关你只是在两个小时之租借的数据需要共享，或者通过远程店铺之间的一个集成的数据共享连接来进行访问。
<p>因为总部和远程店铺之间的连接是通过可靠的消息来达到的，因此由于不可靠的卫星电路所造成的网络服务终端可以从消息层得到补偿。也应该注意到，对于远程店铺之间来说，通过Internet来建立一个安全和可靠的消息通道也是可以的。
<h5><a>1.6.11 作为</a>ESB的&#8220;原生&#8221;数据类型的XML</h5>
<p>当数据通过ESB 在应用之间流动的时候，XML是一个表现它们的理想基础。被应用程序的一个巨大的行列生产而且耗尽的数据能以多种的格式存在和包装方案。有大量的应用产生和消费的数据，可以以各种格式或者打包的Schema存在。对ESB来说虽然的确可以依你喜欢的打包形式或者封装方案来承载数据，但将途中数据表现为XML具有莫大的好处，包括使用能够结合来自于不同的源数据以创建一个新的数据视图的产生数据的特殊 ESB 服务， 以及针对应用间高级数据共享的浓缩和重定目标。第 4 章将会探究使用XML功能本好处—将避免一个组织的应用间同步升级的需要—并且更详细地讨论分布式XML变换之后的基本原理。
<h5><a>1.6.12 业务数据的实时吞吐</a></h5>
<p>ESB通过为途中数据在总线之上的应用间传输的时候提供实时吞吐消除了潜伏反应问题。目前，最流行的集成方法之一是每夜进行批处理。 然而，打包的成批处理集成策略，不管是每夜还是其它，都具有较高的边际错误率，并且造成信息获取的延迟。其结果是高反应期产生获取了过时数据将使代价高昂的。第 9 章将详细讨论这个问题，并且研究 ESB 可以如何用来将你的业务数据从每夜批处理模式重构为实时吞吐模式。
<h5><a>1.6.13 运行感知</a></h5>
<p>运行感知意思是业务分析师能够获得对业务运行的状态和健康情况的洞察能力。 一个允许对数据在其以某个业务流程中的某个消息形式在组织中流动时进行实时跟踪和报告的基础设施，对于帮助建立运行感知是一个无价的工具。一个称为是业务活动监控 (BAM)的产品门类已经出现来解决运行感知的这些问题。
<p>使用XML作为ESB的原生数据格式的好处之一就是消息没有被处理为不透明的数据块。如果应用和服务之间的所有数据都被格式化为XML文档，ESB提供的基础支撑便允许你在ESB之上再构建一层高级能力，以获得对流过你的企业的业务数据的实时洞察能力。这些能力，不管是否是ESB的固有组成部分，还是有一个扩展来驱动，都表现为包括了路由、处理流、以及下层的管线，并且不需要再在其上锁定一个第三方的BAM产品的一个通用基础设施的一个有机组成部分。
<p>作为ESB的一个基础部分的审计和跟踪能力允许对在SOA中的所有流动的业务流程和消息流的健康状况进行监控和跟踪。诸如数据缓存、数据收集和聚集、以及XML数据的可视化表现之类的增值服务，可以用来创建一个基础服务，该基础服务可以在数据在企业中流动时，产生对业务流程的状况洞察的警告、提醒和报表能力。
<p><a href="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image012_2.gif" atomicselection="true"><img height=165 alt=clip_image012 src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image012_thumb.gif" width=240></a>
<p>图表 1‑9 增值型服务促成操作的觉察提供对活的业务数据的即时洞察
<p>对ESB中的数据的根踪和报表是通过在业务流中定义审计点来达到的，然后再对从业务消息中收集的重要内容在ESB中流动时提供插入点。可追踪数据例子是业务消息自身，以及指示某业务消息是否通过了某个特定的业务处理步骤的业务事件。
<p>高级的增值服务可以提供数据收集服务、查询机制以及报表能力，它们能够讲所有数据进行收集、进而表现为各种具有意义的形式。XML持久性服务可以提供缓存和聚集点，这样可以收集将要转换的数据从而向其他应用提供数据输入，或进入到可以被业务分析师使用的人可读的报表机制之内。这意味着流经ESB的数据可以进行实时分析，以提供有关你的业务状态的实时信息—比如，可以随时提供有关你的供应链中的存货的状态快照。
<h5><a>1.6.14 逐渐采用</a></h5>
<p>区别是否真正是 ESB 的一个主要方面是看其是否具有逐渐采用的能力，相对于另一个&#8220;全有-或-全无&#8221;的论断。在 Y2K 之后的开支削减中，数百万美元预算的项目数目已经今非昔比。有一些迹象表明，预算资金筹备正在开始释放以解决短期的战术性集成需要，但是预算仍然谨慎地处于一个执行层面。，然而，同时仍然有一些期望实现较大的公司范围集成策略计划—这些计划严重依赖于集成和现有IT资产的重用。
<p>图1-10说明了 ESB 可以如何用于小项目中，然后它们都可以进入到一个更大的集成网络之内。 当我们深入阅读本书的时候，我们会详细研究这是如何实现的。
<p><a href="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image013_2.gif" atomicselection="true"><img height=156 alt=clip_image013 src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB2_835C/clip_image013_thumb.gif" width=240></a>
<p>图表 1‑10 ESB 支持逐渐采用的集成，同时向着一个策略目标工作
<p>ESB 的联邦/自治能力也对一次一个项目采用 ESB的能力有助益。ESB 集成项目渐进式的分布部署能够在朝着一个更广的企业层面的计划目标的前提下得到立即价值。
<p>逐渐采用的观念将进一步通过桥接到一个已有的集成Broker集线机器和遗留系统Broker来得到进一步支持。集成Broker集线器和他们的特点将在第 2 章中详细研究。</p>
<img src ="http://www.blogjava.net/SteelHand/aggbug/135404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2007-08-09 09:26 <a href="http://www.blogjava.net/SteelHand/archive/2007/08/09/135404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>企业服务总线(ESB)(1)</title><link>http://www.blogjava.net/SteelHand/archive/2007/08/07/134929.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Tue, 07 Aug 2007 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2007/08/07/134929.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/134929.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2007/08/07/134929.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/134929.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/134929.html</trackback:ping><description><![CDATA[<p><em>本系列编译自 O'Reilly的《Enterprise Service Bus》，将陆续发布上来。</em></p>
<p><em></em>&nbsp;</p>
<h3>1 企业服务总线简介</h3>
<h4><a>1.1一个事件驱动型企业中的SOA</a></h4>
<p>在一个事件驱动型企业中，影响业务流程的正常进程的业务事件可以以任何顺序随时发生。那些以自动化的业务处理方式交换数据的应用需要使用事件驱动的 SOA 来彼此通信，以便能够对不断变化的业务需求具有敏捷的反应。SOA 向业务分析师和集成架构师提供了处理高阶服务的关于应用和集成组件的宽泛的抽象视图。而在 ESB，应用和事件驱动的服务彼此以一种松散耦合的紧密地与流行的 SOA 维系在一起，这允许它们彼此能够独立运行，并且仍然能够提供较宽广的业务功能价值。
<p>在 SOA 的王国，事件被表现为一种开放的XML格式文件，以及经过一个对验证开放的，可以协调的透明管线中的流（Flow）
<p>—John Udell, InfoWorld
<p>SOA 的服务组件暴露的是一种粗粒度的接口，其目的是使应用之间能够异步地共享数据。而使用 ESB，一种集成架构将应用程序和分离的集成组件拉在一起，以产生服务装配组合从而形成复合的业务流程，进而自动化一个即时企业中的业务功能。
<p>ESB 为SOA提供实现骨架。那就是说，它通过一个跨越多种协议的消息总线来提供一个有关命名路由目的地的高度分布的世界来提供松散耦合的，事件驱动的 SOA。ESB 中的应用程序 (和集成组件) 在理论上是彼此解耦的，而且通过总线彼此连接为暴露为事件驱动服务的逻辑端点。
<p>通过分布式的部署配置基础设施， ESB 能有效率地提供对在扩展企业中分布的服务的中心配置、部署和管理。一种普遍集成的新方式应用诸如SOA、EAI、B2B 和Web服务之类的技术的通常目标主要是创建一个集成架构，且能够深入并且跨越整个扩展企业。对于一个集成基础设施到达到这种普遍性，它必须具有下列各项特性:
<ul>
    <li>它必须能够适应多种集成情形项目的通常目的需要，不管是大型的还是小型的。适应性包括提供一个能够经受协议、接口技术、甚至流程模型的变化趋势的持久架构。
    <li>它必须以一种单一和统一的方式，以及一个通用的基础设施来连接扩越扩展企业的各种应用。
    <li>它必须能够扩展超出单一公司IT中心的边界。并且自动化伙伴关系，比如在B2B 和供应链的情况下。
    <li>它必须具有设计的简单性和较低的进入门坎，使得日常的IT专业人员也能够成为自我修练的集成架构师。
    <li>它必须提供一个跨越普遍集成的 SOA，它能使集成架构师能够对公司的应用资产和自动化业务流程有一个广泛的、抽象的视图。
    <li>它需要有能够反应和符合不断变更的业务需求和竞争的压力需要的灵活性和能力。 </li>
</ul>
<p>在 ESB中，应用和事件驱动服务以一种松散耦合的方式紧密地联系在SOA 中。 这使得它们能够彼此独立运行，并且仍然能够提供广泛的业务功能价值。
<p>ESB 架构解决了这些需要，并且正在被各种通用的集成项目所采用。它也能够在企业应用层面普遍地伸展，不管是物理位置还是技术平台。任何应用都可以通过大量的连接选择插入到一个 ESB 网络中，并且可以立即参与到与那些通过总线暴露为共享服务的应用之间的数据共享之中。这是 ESB 为什么经常被称为集成网络（integration network）或集成构造（fabric）的缘故。
<p>ESB 提供为集成提供了一种高度分布式的架构，并且具有能够让独立的部门和业务单元能够以一种逐渐增加的、可消化的分块来构建它们的集成项目的独特能力。使用 ESB，部门和业务单元仍然能够继续在独立的集成项目中维护它们自己的本地控制和自治，并且仍然能够将它们的集成计划连接到一个更大的、更全局的的集成网络或网格之中。
<h4><a>1.2针对 Web </a>服务的SOA，如今已经可用</h4>
<p>Web 服务已经通过为应用间的互操作性提供一种基于标准的方式为面向服务架构找到了新的重要性。Web服务的主要目的是提供了一种服务抽象，它允许应用之间的互操作性使用不同的平台和环境来构建。这一个目标的实现将能够提供一个应用之间的普遍集成的更容易的路径。
<p>由于ESB的出现，现在有了一种方式能够将Web Services和SOA合并到一个意义非凡的架构中，以将应用和服务以一种高度伸缩的状态集成到一个扩越扩展企业的骨架之中。ESB使用今天已经成熟的技术立刻使得Web Services、XML、以及其他集成技术更加有用。
<p>SOA 的核心原则对于普遍集成项目的成功至关重要，并且已经在 ESB 中被彻底实现。 Web Services标准正在有朝着正确的方向前进，但是在提供企业级能力方面还未完成，比如安全性、可靠性、事务管理和业务流程编排。ESB 以这些领域中今天已经确定的标准为基础，而且已经有实际实现部署在各种领域和行业中。ESB完全有能力跟上Web Services相关能力的革新进展步伐。第 12 章提供了更详细的关于这一个主题的讨论。
<h4><a>1.3常规的集成方式</a></h4>
<p>ESB 通过从EAI中介者（Broker）那里学来的概念和技术将Web Services和其他补充标准结合在一起。然而，ESB 并不仅仅是在同一个老式的EAI 集线器之上的简单的Web Services外衣。
<p>传统的形式化的集成方法都有其优缺点。第 1 章就展示了有关集成的一些高阶的显著特色， 范围从左下方最不令人想要的，到右上方象限中的最令人想要的。
<p><a href="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB1_B922/clip_image002_2.jpg" atomicselection="true"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=192 alt=clip_image002 src="http://www.blogjava.net/images/blogjava_net/SteelHand/WindowsLiveWriter/ESB1_B922/clip_image002_thumb.jpg" width=240 border=0></a>
<p>图表 1‑1 传统的 EAI 中介器，应用服务器，MOM和 ESB 的特性
<p>传统的 EAI 中介器，包括那些已经构建在应用服务器之上的，使用一种集线器和插头（hub-and-spoke）架构。集线器和插头有一些中心化功能的好处，比如路由逻辑和业务规则的管理，但是不能很好地伸展扩越部门和业务单位的边界。第 2 章将讨论使用集线器在集成中的早期尝试的巨大代价，以及它们的初步成功。
<p>应用服务器可以通过标准协议进行互操作，然而它们是以一种紧密耦合的方式进行连接的，并且集成逻辑和应用程序逻辑纠缠在一起。
<p>EAI 中介器通过将应用逻辑从集成和流程路由逻辑中分离出来提供了增加价值，然而你仍旧要忍受集线器-插头架构的痛苦。
<p>面向消息中间件 (MOM) 提供了以松散耦合和异步的方式连接应用的能力。然而，MOM自身需要在应用中进行低级的编码。使用传统的MOM，以及定制的编程技术，比可以在分布式的集成解决方案上走得更远。然而，没有对路由逻辑的高阶抽象，这种方式仍然要忍受集成逻辑难以连接，并且也和应用逻辑纠缠在一起的痛苦。依赖于MOM的使用，即使是分布式特征也会受到限制，因为一些传统的MOM基础设施对实际的网络边界的跨越也不是做得很好。
<p>最后，在 ESB 中，服务可以被配置而不是编码。处理流程和服务能够透明地跨越整个服务总线。ESB 提供了能够很好地扩越集线器-插头架构范围的高度分布式集成环境，并且清晰地分离了应用逻辑和路由数据变换之类的集成逻辑。一个 ESB 架构形成了一个消息集线器和集成服务的互连接性网格，具有一个彻底分布的集成网络的功能性和智能性。
<p>第 6 章更进一步描述在使用应用服务器集成和使用ESB集成之间的对比。MOM的概念在第 5 章讨论。第 2 章的 &#8220;附属架构&#8221;继续讨论业务流程路由逻辑和业务逻辑之间的分离。
<h4><a>1.4被IT</a>需要驱动的需求</h4>
<p>ESB 的一个关键特性就是要为支持分布式的、松散耦合的业务单位和伙伴，比如自动化供应链，提供支撑基础。ESB 的这些能力是其固有的必要特征，并且是中间件厂商与那些想要创建大规模集成架构的业界专家共同工作的结果。这些业界专家包括了大公司IT架构师、以及电子市集贸易社区中想要基于共享服务、消息、XML何其他众多的连接选择来建立B2B集成骨架的改革者，并且要坚持遵守工业标准。第 3 章将会讨论对 ESB 概念的创造有助益的许多催化剂。
<p>同时，仍然必须解决的最大需要在于如何还没有的最大需要被定址包括该如何有效地提供集成能力、比如应用适配器、数据变换、以及能够用于通用的集成项目，跨越多种集成情性的智能路由。并且需要超越于个别战术性的集成项目之上的，更加通用的技术和更加架构性的方式。
<p>IT专家已经对以前的一些技术趋势失望，比如CORBA、或者EAI什么的。CORBA 有着与SOA 一样的正确理念，但是其与生俱来就太复杂而难以维护，因为它依赖于应用和服务之间的紧密耦合接口。EAI 也痛苦于对单个项目上的陡峭的学习曲线和昂贵的进入负担 (下一章将详细讨论这个内容)。真正需要的是SOA的简单方式，以及可以被采用来适应任何集成工作，大型或者小型，的一种架构。此外，那就是需要一个能够经受协议、接口、甚至业务建模趋势的变革的持久架构。ESB的概念就是创建来解决这些需要的。
<h4><a>1.5行业的牵引</a></h4>
<p>自从ESB 概念在 2002 年被首次引入，ESB 的集成方式已经被中间件、集成和Web服务市场中的很多重要的厂商采用。其接受度正在稳定持续地增长。
<p>从2002年早期开始，分析公司，比如 Gartner 公司、IDC、ZapThink等，就已经开始跟踪和编写有关 ESB 的技术趋势。在Gartner 公司于2002年发布的一份报告(DF-18-7304)中，分析师 Roy Schulte 这样写道：
<p><em>一种新型的 </em><em>企业服务总线</em><em>架构- </em><em>结合了<strong>面向消息中间件</strong>（MOM</em><em>）、Web Services</em><em>、数据变换和智能路由的基础设施—</em><em>将会 2005 </em><em>之前在很多的企业中运行。</em>
<p>这些高功能、低成本的ESB能够被很好地适应作为面向服务架构和企业神经系统的主干。
<p>那四个支柱—MOM、Web Services、数据变换和路由智能 — 表现了任何优秀的ESB 的基础。当我们探究 ESB 的时候，本书将会集中于其中每一个基础和其他必须的组件的角色。我们还要讨论将会讨论 ESB 究竟能为企业做些什么、以及它的基本组件所扮演的角色。我们还要讨论一些高阶主题，包括横越多种行业之上的实践性使用的架构性概述。
<h5><a>1.5.1 采用</a> ESB的厂商</h5>
<p>有许多中间件和集成厂商已经，或者正在构建，符合ESB描述的某些产品。并且这个名单还在不断增加。附录中列出所有的已知厂商。一些厂商已经声称他们已经开始提供 ESB了 ；而有些则正在计划构建；有些则只是在市场宣传材料中使用这一技术术语而实际上背后还没有实质性的东西。当超过 25个厂商正在为相同的技术空间竞争的时候，这一个技术范畴注定要变成像上世纪90年代的应用服务器一样的炙手可热。
<p>这个清单中有个别厂商应该特别提及。Sonic软件最先倡导了这个概念，此后不久许多其他的较小厂商业进入此领域，声称他们也正在提供 ESB 或是正在开发之中。一但那些著名的集成公司，比如webMethods、SeeBeyond 和 IBM 最终搭上这趟巴士（&#8220;BUS&#8221;），并且想要开始建立他们的ESB，ESB 术语才真的开始广泛引起业界注意，是一个强大的不断发展技术范畴。
<p>在本书写作的时候，微软公司还没有对其Indigo项目和有关ESB发布任何公开的说明。然而，一些记者和分析师在Indigo项目宣布的时候还是将二者联系起来。2003 年11月 30 日， ComputerWorld 的文章说，&#8220;开发人员的兴趣被微软的技术伤害了&#8221;，Gartner 公司的 Roy Schulte关于Indigo项目提出。
<p>Roy Schulte，是Gartner 公司在斯坦福的一个分析师，注意到Indigo项目其实是微软消息队列（MSMQ）、公司的COM、COM+、.Net Remoting、以及Web Services技术的超集。&#8220;把它想成代表微软公司的通信中间件计划的简化和统一，&#8221;他说，并说他认为Indigo是一个非常好的企业服务总线(ESB)。
<p>Indigo以消息为基础，并且打算结合MSMQ 和Web Services。可以提供一个消息总线的基础。然而，其集成能力的其余部分则被锁定到BizTalk 之内，而它是一个集线器-插头风格的集成服务器。为了成为真正的ESB，分布式消息总线和分布式集成能力都要具备。
<p>如果Indigo项目完成，构建于微软平台之上的应用和服务将能够更加吸引人地作为端点连接到ESB之上。将Indigo包含到微软平台和开发环境之内将更加能够使得应用具有松散耦合和消息感知能力。</p>
<img src ="http://www.blogjava.net/SteelHand/aggbug/134929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2007-08-07 13:14 <a href="http://www.blogjava.net/SteelHand/archive/2007/08/07/134929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>老马的集成模式之概论篇</title><link>http://www.blogjava.net/SteelHand/archive/2006/03/08/34265.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 08 Mar 2006 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2006/03/08/34265.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/34265.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2006/03/08/34265.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/34265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/34265.html</trackback:ping><description><![CDATA[Martin的EIP之概论：<a HREF="/Files/SteelHand/1%E4%BD%BF%E7%94%A8%E6%A8%A1%E5%BC%8F%E8%A7%A3%E5%86%B3%E9%9B%86%E6%88%90%E9%97%AE%E9%A2%98.rar">使用模式解决集成问题：</a><br><br><img src ="http://www.blogjava.net/SteelHand/aggbug/34265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2006-03-08 14:16 <a href="http://www.blogjava.net/SteelHand/archive/2006/03/08/34265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RFID的领域应用 </title><link>http://www.blogjava.net/SteelHand/archive/2005/11/15/19795.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Tue, 15 Nov 2005 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/11/15/19795.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/19795.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/11/15/19795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/19795.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/19795.html</trackback:ping><description><![CDATA[<H1 class=style2 align=center><IMG height=1 alt=1 src="file:///C|/Documents%20and%20Settings/liusq/Application%20Data/Macromedia/Dreamweaver%208/OfficeImageTemp/clip_image002.gif" width=9>RFID的领域应用 </H1>
<P class=style2 align=left>RFID是一种自动识别技术。从本质上讲，它对其所标记的物品本身并不带来任何附加价值，甚至增加成本。但是，它却能够驱动与物品相关的背后应用带来巨大的价值，而这些则根据不同的应用体现而不同。这其中还有一个至关重要的驱动力，那就是以Internet、网络技术、通信技术、软件技术为代表的现代信息和通信技术（ICT）。只有在此基础上，RFID本身才能成为体系，自动标记和识别的数据才能得以广泛地传输和共享，从而连接随时随地的业务。即，企业和组织能够在前所未有的集成之基础上，自动地进行通信、协作、教育、销售、配送、采购、服务，以及企业内部的业务流程。<BR><BR>RFID 的本质是对物体或者人进行识别。其最大优点是自动化，不要求有人为干预，被标记的对象一旦处于阅读器的质询区域便能够被自动读取，而相关信息则实时传送到后段进行处理。被传递到业务系统的相关的数据主要包括： 标签编码（tag ID），阅读器编码（reader ID）以及读取时的时间片。所有的应用都是基于这些基本数据。 </P>
<P class=style2 align=left><STRONG>资产跟踪（<U>Asset Tracking）</U></STRONG> <BR>很自然，资产跟踪是RFID的最通用的应用。公司和组织可以将RFID标签置于那些流动的、分散的、易于丢失或者被盗的、难以定位和查找的物品之上。几乎每一种RFID系统都能够被用于资产跟踪。比如总部位于美国Secaucus, N.J.的一个第3方物流产商，NYK Logistics就使用RFID来跟踪其位于Long Beach, Calif.的集散中心的集装箱。它使用一种基于阅读器和主动标签的实时定位系统，可以将集装箱定位在10英尺之内。对于安全管理来说，一些敏感的信息设备，特别是移动设备（如笔记本电脑等），就可以使用RFID来跟踪管理。<BR><BR>加拿大航空公司使用RFID来跟踪用于世界各地机场的食品车，每年可以节约数百万美元。这样，不但因为使用了更少的食品车以及减少了保持库存的时间和费用，并且对世界各地移动的食品车的妥善管理也增进了效率和客户服务。 <BR>其它应用案例还包括，El Paso County使用915 MHz被动式标签来跟踪计算机和办公设备。一家法律公司Fish &amp; Richardson P.C.甚至使用13.56 MHz标签来跟踪重要文件。而一家新加坡公司使用13.56 MHz 技术来跟踪必须经过检测的建筑混凝土以保证建筑安全。 </P>
<P class=style2 align=left><STRONG>制造（<A href="http://www.rfidjournal.com/article/topics/10">Manufacturing</A>）</STRONG> <BR>RFID 应用在制造商其实已经很多年了。它可以对生产制造过程中的零件进行标识，甚至与工艺、制造参数、生产过程等相关。特别对自动化柔性生产线有巨大帮助。 <BR>波音公司就在其Wichita, Kansas的工厂中使用了一个915 MHz 的系统来跟踪零件的达到。而过去则是使用条形码来进行跟踪的，但条形码必须经过人工扫描，并且还必须经过特殊的化学处理。如果人工扫描环节出了差错，则会失去对零件的跟踪。而如今这些都是自动化的，并且减少了错误和需要的人手。 <BR>美国汽车通用公司（AM General ）也在其位于Mishawaka 的悍马汽车制造厂内使用了以一种主动式RFID 系统来跟踪零件。而 Club Car 则甚至将RFID作为其新的高尔夫球车装配线上的一个主要部件，将每辆车的生产时间从88分钟减少到46 分钟。 </P>
<P class=style2 align=left><STRONG>供应链管理（<A href="http://www.rfidjournal.com/article/topics/8/">Supply Chain Management</A>）</STRONG> <BR>RFID 技术过去已用于企业内部控制之用的供应链闭环控制。宝洁公司（Procter &amp; Gamble）在西班牙的配送中心使用了13.56 MHz 系统来增加吞吐量、减少了差错和成本。 </P>
<P class=style2 align=left>Paramount Farms公司，它加工大约整个美国60% 的pistachio 作物，并且出口到20多个国家，便使用了RFID来帮助自动化处理收购自越来越多的种植伙伴的产品。 </P>
<P class=style2 align=left>随着标准的出现，比如EPC等，使得不仅在企业内部进行供应链跟踪，借助于基于标准的编码和数据交换，以及Internet的网络支持，可以扩展到与企业相关的业务伙伴，从上游的供应商到下游的分销商。整个供应链在全球范围内形成，包括间接的第3方物流、运输商、以及零售商。并且，也在前所谓有的基础上提供了对生产（EPR）、零售（POS）、服务（CRM）的集成。 <BR>一家加拿大的护肤产品制造商Canus就使用了RFID 来减少其到零售客户的运输的检测成本，并且还使用基于RFID 的温度感应器来监控运输过程中的条件。 </P>
<P class=style2 align=left><STRONG>零售（<A href="http://www.rfidjournal.com/article/topics/9/">Retailing</A>）</STRONG> <BR>零售商们，如Best Buy, Metro, Target, Tesco 和 Wal-Mart 等，都是采用RFID技术的先驱。这些零售商都希望RFID能够整合供应链、有效管理库存和配送、以及有效的货架管理，以便减小成本和提高服务。 <BR>Wal-Mart已经有严格的时间表，已经要求他的前100家供应商提供RFID标记的产品，然后是前200家，500家直至全部供应商。与美国国防部DoD成为推动RFID的最大力量。 </P>
<P class=style2 align=left><STRONG>电子支付（<A href="http://www.rfidjournal.com/article/topics/11/">Payment Systems</A>）</STRONG> <BR>RFID 不仅在供应链中很火热，电子支付系统也很得到关注。包括不停车收费系统、泊车收费系统、公交车票务等等。 <BR>由于其中涉及到价值存储和转移，这里主要是高端RFID 系统，特别是智能卡。在世界很多城市、包括中国的很多城市，都采用非接触式的智能卡来进行公交系统：巴士、地铁、轻轨、电车甚至出租车。<BR>另外一个重要的方面就是银行支付，MasterCard 和Visa 都在计划将传统的磁卡转换成智能卡，增加安全性和解决其他很多问题。 </P>
<P class=style2 align=left><STRONG>安全和访问控制（<A href="http://www.rfidjournal.com/article/topics12/">Security and Access Control</A>）</STRONG> <BR>RFID 已经用于物理安全的访问控制很久了。以前一般使用低频的RFID标签。最近，供应商大都推介如今采用高频的13.56 MHz系统，提供更远的读取距离。 <BR><IMG height=1 alt=2 src="file:///C|/Documents%20and%20Settings/liusq/Application%20Data/Macromedia/Dreamweaver%208/OfficeImageTemp/clip_image002_0000.gif" width=9 border=0><BR>RFID 还用于保护重要财产。许多最新型号的汽车都使用这种技术来防盗。即在方向盘部位有一个内置的RFID reader，只有当读取到封装与钥匙中的标签发出的正确的识别号码时，才能够启动汽车。 <BR>主动式标签可以结合移动传感器来对极端敏感和高价值的东西，比如武器和珠宝进行监控，一旦检测到则会自动报警。RFID 标签也可以用于难以管理的移动计算和存储设备如笔记本电脑和USB存储设备等。 </P>
<P class=style2><STRONG>其他应用</STRONG> <BR>随着技术和领域的发展，会出现层出不穷的革新应用。比如，用于大型主题公园的儿童跟踪和识别，监狱犯人的识别和监控，钞票和票据的保安、病人和孤寡老人的监控等等。 <BR>无线传感器网络是下一代自主网络，它将无数的集成温度感应、移动感应、放射传感等等感应器的主动或者被动式RFID，并且具有自主的网络功能。美国军方已经研究出能够在实物中发现病原体的RFID传感器原型。这可以用于对通过食物感染疾病的恐怖袭击的检测和保护。 <BR>比如NASA的Jet Propulsion Laboratory 就在研究新一代的无线传感器网络。在其早期的实验中，可以用于检测土壤和空气的温度、湿度，以及光线、水流方向等等。 </P><img src ="http://www.blogjava.net/SteelHand/aggbug/19795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-11-15 09:28 <a href="http://www.blogjava.net/SteelHand/archive/2005/11/15/19795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>此Slashdot不是那个Slashdot</title><link>http://www.blogjava.net/SteelHand/archive/2005/10/19/15875.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 19 Oct 2005 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/10/19/15875.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/15875.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/10/19/15875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/15875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/15875.html</trackback:ping><description><![CDATA[今天看到一个网站，slashdotcn.org,嘿，风格、系统、内容设置基本上都和Slashdot.org类似，还以为是slashdot的中文
版。仔细研究了半天，好像与slashdot没什么关系。不过也是一种不错的新闻站点方式，因为它的国外榜样是大大的有名。<br>
<br>
看到它是因为在O'Reilley看到了一片关于Web 2.0的文章,从该文的讨论中进来的。其作者是O'Reilly Media的掌门<a href="http://en.wikipedia.org/wiki/Tim_O%27Reilly">Tim O'Reilly</a>
，旨在为 Web 2.0 正本清源： 以及讨论了软件的下一代设计模式及商业模式。非常值得一看，详细内容参见<i>：<a href="http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html?page=1">What Is Web 2.0</a></i>。<br>
<br>
<img src ="http://www.blogjava.net/SteelHand/aggbug/15875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-10-19 10:14 <a href="http://www.blogjava.net/SteelHand/archive/2005/10/19/15875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TOP 10 Web应用安全之一：输入校验</title><link>http://www.blogjava.net/SteelHand/archive/2005/09/12/12727.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Mon, 12 Sep 2005 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/09/12/12727.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/12727.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/09/12/12727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/12727.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/12727.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">TOP 10 Web</SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">应用脆弱性</SPAN></B><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">之一：未经验证的输入</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><BR>描述</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Web </SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">应用使用<SPAN lang=EN-US>HTTP </SPAN>请求<SPAN lang=EN-US>(</SPAN>也许还有文件，也是一种特殊请求<SPAN lang=EN-US>) </SPAN>来进行输入，并决定如何进行响应。攻击者可以篡改<SPAN lang=EN-US>HTTP </SPAN>请求的任何部分，包括<SPAN lang=EN-US>url</SPAN>，查询字符串（<SPAN lang=EN-US>querystring</SPAN>）<SPAN lang=EN-US>, headers, cookies, </SPAN>表单字段（包括隐藏字段），试图绕过服务器的安全机制。常见的通用输入篡改攻击包括：<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo2; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">o<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">强迫浏览（<SPAN lang=EN-US>forced browsing</SPAN>）；<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo2; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">o<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">命令注入（<SPAN lang=EN-US>command insertion</SPAN>）；<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo2; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">o<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">交叉站点脚本（<SPAN lang=EN-US>cross site scripting</SPAN>）；<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo2; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">o<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">缓冲区溢出（<SPAN lang=EN-US>buffer overflows</SPAN>）；<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo2; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">o<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">格式字符串攻击（<SPAN lang=EN-US>format string attacks</SPAN>）；<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo2; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">o<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SQL</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">注入（<SPAN lang=EN-US>SQL injection</SPAN>）；<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo2; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">o<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">有毒饼干（<SPAN lang=EN-US>cookie poisoning</SPAN>）；<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo2; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">o<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">隐藏字段操作（<SPAN lang=EN-US>hidden field manipulation</SPAN>），等等。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">某些站点试图通过过滤恶意输入来保护自己。但问题是编码信息的方式无穷无尽。这些编码方式看起来并不是加密的，所以似乎也用不着解码。但是，开发人员仍然经常忘记将所有的参数在使用之前解码为最简单的形式。参数应该在其被校验之前转换为最简单的形式，否则，恶意输入就可能掩饰自己从而流过过滤器。简化这些编码的过程称为是“规格化（<SPAN lang=EN-US>canonicalization</SPAN>）”。因为几乎所有的<SPAN lang=EN-US>HTTP </SPAN>输入都可以编码为多种格式，这种技术便可以打乱各种旨在利用和攻击上述弱点的攻击行为。这使得过滤非常困难。<SPAN lang=EN-US> <o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">有非常之多的<SPAN lang=EN-US>web </SPAN>应用仅使用客户端校验来验证输入。客户端校验机制是非常容易绕过的，这样就使得<SPAN lang=EN-US>Web</SPAN>应用几乎对恶意参数的攻击毫无保护。攻击者可以使用攻击甚至<SPAN lang=EN-US>telnet</SPAN>来产生他们自己的<SPAN lang=EN-US>HTTP </SPAN>请求。他们才不关心开发人员预定想要在客户端发生的时候事情呢。注意，客户端校验仅仅在提高性能和可用性方面有益，但是它毫无安全可言。因此，对于恶意参数攻击，服务器端校验是必须的。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">这种攻击的数量在不断上升，因为有大量的支持参数的“模糊化”（<SPAN lang=EN-US>“fuzzing”</SPAN>）、腐朽（<SPAN lang=EN-US>corruption</SPAN>）、以及野蛮强制增长的工具出现。不应该低估了这些使用非校验输入进行攻击的影响。实际上如果开发人员能够在使用参数之前对其进行验证，就可抵挡大部分的攻击。因此，最好使用一个中心化的、强大的验证机制来对所有<SPAN lang=EN-US>HTTP </SPAN>请求的输入都进行验证，这样利用此弱点进行攻击的数量就会大减。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><BR>环境影响<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">所有<SPAN lang=EN-US>web servers, application servers, </SPAN>以及应用环境都容易受到这种参数篡改的攻击。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><BR>如何决定你的应用是否脆弱<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">一个<SPAN lang=EN-US>Web</SPAN>应用所用的未经验证的<SPAN lang=EN-US>HTTP</SPAN>请求的任何和部分都称为是“脏” 参数。找出脏参数的最简单的方式是进行最详细的代码评审，找出所有从<SPAN lang=EN-US>HTTP</SPAN>请求提取信息的方法调用。比如，在<SPAN lang=EN-US>J2EE</SPAN>应用中，这些包括<SPAN lang=EN-US>HttpServletRequest </SPAN>类（以及其子类）中的方法。然后你就可以循着代码查看参数变量是在哪里使用的。如果变量在使用之前未作验证，这可能就是一个潜在的问题。在<SPAN lang=EN-US>Perl</SPAN>中，你因该考虑使用<SPAN lang=EN-US> “taint” (-T) </SPAN>选项。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">你也可以通过一些工具来找出脏参数，比如<SPAN lang=EN-US>OWASP</SPAN>的<SPAN lang=EN-US> WebScarab</SPAN>。它们可以查看和评审通过<SPAN lang=EN-US>HTTP/HTTPS</SPAN>的所有数据，并进行分析。<SPAN lang=EN-US><BR style="mso-special-character: line-break"><BR style="mso-special-character: line-break"><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">如何保护<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">保护很简单，那就是确保任何参数在被使用之前都进行了验证。最好的办法是使用一个中心化的组件库，比如<SPAN lang=EN-US>Java</SPAN>中的<SPAN lang=EN-US>Jarkarta Commons Validator.</SPAN>每个参数都演进行严格检查。涉及到过滤脏数据的“负面”方法或者依赖于签名的方法都不可能很有效率，并且难以维护。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">参数应该进行“正向”规格的检查，正向规格（<SPAN lang=EN-US> “positive” specification </SPAN>）的定义可包括：<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<UL type=disc>
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">数据类型<SPAN lang=EN-US>(string, integer, real, </SPAN>等<SPAN lang=EN-US>)<o:p></o:p></SPAN></SPAN> 
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">允许的字符集<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN> 
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">最大最小长度<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN> 
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">是否允许<SPAN lang=EN-US>null<o:p></o:p></SPAN></SPAN> 
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">是否必需<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN> 
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">是否允许重复<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN> 
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">数值范围<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN> 
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">特定的法定值<SPAN lang=EN-US> (</SPAN>枚举<SPAN lang=EN-US>)<o:p></o:p></SPAN></SPAN> 
<LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">特定模式<SPAN lang=EN-US>(</SPAN>正则表达式<SPAN lang=EN-US>)<o:p></o:p></SPAN></SPAN></LI></UL>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p>&nbsp;* 本系列整理自 OWASP（Opensource Web Applicaiton Security Project&nbsp;）</o:p></SPAN></P><img src ="http://www.blogjava.net/SteelHand/aggbug/12727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-09-12 11:52 <a href="http://www.blogjava.net/SteelHand/archive/2005/09/12/12727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB 3.0 vs Spring</title><link>http://www.blogjava.net/SteelHand/archive/2005/07/15/7762.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Fri, 15 Jul 2005 04:23:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/07/15/7762.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/7762.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/07/15/7762.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/7762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/7762.html</trackback:ping><description><![CDATA[<STRONG><EM><FONT color=#ff0000><IMG height=20 src="http://www.blogjava.net/Emoticons/QQ/05.gif" width=20 border=0>&nbsp; OnJava上看到一篇文章，贴在这里，做上笔记。</FONT></EM></STRONG> 
<P>Albert Einstein once said, <STRONG>"Everything should be made as simple as possible, but not simpler."</STRONG> <STRONG><EM><FONT style="BACKGROUND-COLOR: #ffffff" color=#ff1493>（哈哈，相对论再简单，也会令不知多少感到头痛，包括我。<IMG height=20 src="http://www.blogjava.net/Emoticons/QQ/09.gif" width=20 border=0>）</FONT></EM></STRONG>Indeed, the pursuit of scientific truth has been all about simplifying a theory's underlying assumptions so that we can deal with the issues that really matter. The same can be said for enterprise software development.</P>
<P>A key to simplifying enterprise software development is to provide an application framework that hides complexities (such as transaction, security, and persistence) away from the developers. A well-designed framework promotes code reuse, enhances developer productivity, and results in better software quality. However, the current EJB 2.1 framework in J2EE 1.4 is widely considered <STRONG><EM>poorly designed and over-complicated<FONT color=#ff1493>（复杂是对的，设计倒未必差。）</FONT></EM></STRONG><FONT color=#ff1493>.</FONT> Unsatisfied with the EJB 2.1 framework, Java developers have experimented with a variety of other approaches for middleware services delivery. Most noticeably, the following two frameworks have generated a lot of developer interest and positive feedback. They are posed to become the frameworks of choice for future enterprise Java applications.</P>
<UL>
<LI>The <A href="http://www.springframework.org/">Spring framework</A> is a popular but non-standard open source framework. It is primarily developed by and controlled by <A href="http://www.springframework.com/people">Interface21 Inc.</A> The architecture of the Spring framework is based upon the <A href="http://www.martinfowler.com/articles/injection.html">Dependency Injection</A> (DI) design pattern. Spring can work standalone or with existing application servers and makes heavy use of XML configuration files. <STRONG><EM><FONT color=#ff1493>（为什么就让Springg赶上春天了？其实DI在很多地方都用到了，其实，应该是说Spring 用DI来解决Factory的依赖性问题，这点占得先机。）</FONT></EM></STRONG> 
<LI>The <A href="http://www.jcp.org/en/jsr/detail?id=220">EJB 3.0</A> framework is a standard framework defined by the Java Community Process (JCP) and supported by all major J2EE vendors. Open source and commercial implementations of pre-release EJB 3.0 specifications are already available from <A href="http://www.jboss.com/products/ejb3">JBoss</A> and <A href="http://www.oracle.com/technology/tech/java/ejb30.html">Oracle</A>. EJB 3.0 makes heavy use of Java annotations.（<STRONG><EM><FONT color=#ff1493>要是抢标准，Jboss显然不是Oracle的对手，这不JavaOne之后，Oracle在这上面领先了。这下，Oracle连同它独步天下的DB，加上这么一个持久层东西，很是了得。这样，Oralce今后，会不会形成JSF(ADF Faces)+EJB3的格局，在J2EE上来那么一个令人吃惊呢？IBM帕不怕？不知道，它和BEA搞的SDO也提到了JCP，不过不知前景如何？哪天，抽时间仔细看看。）</FONT></EM></STRONG></LI></UL>
<P>These two frameworks share a common core design philosophy: they both aim to<STRONG><EM> deliver middleware services to loosely coupled plain old Java objects (POJOs)</EM></STRONG>. （<STRONG><EM><FONT color=#ff1493>POJO是个奇怪的名字，其中第一个O字母，就令人奇怪。呵呵，谁说老树不能开新花？这下要是搞的风水轮流转，就有好戏看啦</FONT></EM></STRONG>。<IMG height=20 src="http://www.blogjava.net/Emoticons/QQ/14.gif" width=20 border=0>）The framework "wires" application services to the POJOs by intercepting the execution context or injecting service objects to the POJO <STRONG><EM>at runtime</EM></STRONG>. The POJOs themselves are not concerned about the "wiring" and have little dependency upon the framework. As a result, developers can focus on the business logic, and unit test their POJOs without the framework. In addition, since POJOs do not need to inherit from framework classes or implement framework interfaces, the developers have a high degree of flexibility to build inheritance structures and construct applications.（<FONT color=#ff1493><STRONG><EM>有点包办婚姻的感觉，容易就是这些POJO的父母。总是要等到最后，才知道和自己有关系的东西是谁。是谁的悲哀？没有，但愿皆大欢喜。）<BR>其实，轻量架构和敏捷方法的火爆主要来源于几个主要的原因：1，程序员自身的武侠主义者，呵呵，也可说英雄主义。总想什么都会，认为武功天下第一，就是懂得更多的语言，从需求、分析、设计、测试到部署，无所不通，多多益善。当然这也是生存压力的后果。<BR>2 SUN曾经设想，J2EE是一个重量的团队协作的开发方式，可是大大出人意料，这种方式要求很高的软件工程水平，同时支撑它的同样要重量的过程模型，比如RUP什么的。但是大型的分布式应用毕竟是少数，中小企业的信息化应用才是主流。而且，MS的解决方案，从过程MSF到， .Net和开发环境VS，无一不在生产力方面占得先机。老大！要记住，用户数量最所的才是市场。<BR>3 出于开发成本考虑，老板总是希望工程师无所不会，这样才能减少成本嘛？！才会出现很多招聘广告上这样写道“精通A,B,C,D,E。。。。，工作经验2年”薪水却只开到2K。这样的事天天发生。是觉得可笑吗？还是觉得悲哀。是觉得人事部门的问题，还是该公司的技术管理着根本就不懂。或者就是老板的问题。不，这是市场的问题。同一个软件，规模和功能几乎一样，在国内卖个10万，很高了，在英国却卖到60万英镑。呵呵，这就是市场。市场就绝对正确吗？可是房价天天涨，现在毕业的程序员，看着房价怎的不愁？NND.<BR>hehe, 跑题了。。。。。。。。。。。。。。<BR><BR></EM></STRONG></FONT></P>
<P>However, while sharing an overall philosophy, the two frameworks use very different approaches to deliver POJO services. While numerous books and articles have been published to compare either Spring or EJB 3.0 to the old EJB 2.1, no serious study has been done to compare Spring to EJB 3.0. In this article, I will examine some key differences behind the Spring and EJB 3.0 frameworks, and discuss their pros and cons. The topics covered in this article also apply to other lesser-known enterprise middleware frameworks, as they all converge on the "loosely coupled POJO" design. I hope this article will help you choose the best framework for your needs.</P>
<H3>Vendor Independence</H3>
<P>One of the most compelling reasons for developers to choose the Java platform is its vendor independence. EJB 3.0 is an open standard designed for vendor independence. The EJB 3.0 specification is developed and supported by all major open source and commercial vendors in the enterprise Java community. The EJB 3.0 framework insulates developers from application server implementations. For instance, while <FONT color=#ff0000><STRONG><EM>JBoss's EJB 3.0 implementation is based on Hibernate, and Oracle's is based on TopLink</EM></STRONG>,</FONT> developers need to learn neither Hibernate- nor TopLink-specific APIs to get their applications running on JBoss and Oracle. Vendor independence differentiates the EJB 3.0 framework from any other POJO middleware frameworks available today.（<STRONG><EM><FONT color=#ff1493>其实这点也是见仁见智了，总之走着瞧。</FONT></EM></STRONG>）</P>
<P>However, as many EJB 3.0 critics are quick to point out, the EJB 3.0 specification has not yet reached the final release at the time of this writing. It will likely be another one to two years before EJB 3.0 is widely adopted by all major J2EE vendors. But even if your application server does not yet support EJB 3.0 natively, you can still run EJB 3.0 applications in the server by downloading and installing an "embeddable" EJB 3.0 product. For instance, the JBoss embeddable EJB 3.0 product is open source and runs in any J2SE-5.0-compatible environment (i.e., in any Java application server). It is currently under beta testing. Other vendors may also soon release their own embeddable EJB 3.0 products, especially for the "data persistence" part of the specification.（<FONT color=#ff1493><STRONG><EM>恐怕还是不好吧？一锅烩？前些天看Walmart迁移到Java5，真够大胆的。</EM></STRONG></FONT>）</P>
<P>On the other hand, Spring has always been a <STRONG><EM>non-standard technology </EM></STRONG>and will remain that way in the foreseeable future. Although you can use the Spring framework with any application server, Spring applications are locked into both Spring itself and the specific services you choose to integrate in Spring.（<STRONG><EM><FONT color=#ff1493>其实，标准不标准，不是JCP说了算的。是大家多了算的。</FONT></EM></STRONG>）</P>
<UL>
<LI>While the Spring framework is an open source project, Spring has a proprietary XML format for configuration files and a proprietary programming interface. Of course, this type of lock-in happens to any non-standard product; it is not specific to Spring. But still, the long-term viability of your Spring application depends on the health of the Spring project itself (or Interface21 Inc., which hires most of Spring's core developers). In addition, if you use any of the Spring-specific services, such as the Spring transaction manager or Spring MVC, you are locked into those APIs as well. 
<LI>Spring applications are not agnostic to back-end service providers, either. For instance, for data persistence services, the Spring framework comes with different DAO and template helper classes for JDBC, Hibernate, iBatis, and JDO. So if you need to switch the persistence service provider (e.g., change from JDBC to Hibernate) for a Spring application, you will need to refactor your application code to use the new helper classes.（<STRONG><EM><FONT color=#ff1493>这点就是我的最爱，Spring对谁都很友好，也许也包括这里的EJB3。）</FONT></EM></STRONG></LI></UL>
<H3>Service Integration</H3>
<P>From a very high level, the Spring framework <STRONG><EM>sits above application servers and service libraries</EM></STRONG>. The service integration code (e.g., data access templates and helper classes) resides in the framework and is exposed to the application developers. In contrast, the EJB 3.0 framework is tightly integrated into the application server and the service integration code is encapsulated behind a standard interface.</P>
<P>As a result, EJB 3.0 vendors can aggressively optimize the overall performance and developer experience. For instance, in JBoss's EJB 3.0 implementation, when you persist an Entity Bean POJO using the <CODE>EntityManager</CODE>, the underlying Hibernate session transaction is automatically tied to the calling method's JTA transaction, and it commits when the JTA transaction commits. Using a simple <CODE>@PersistenceContext</CODE> annotation (see later in this article for an example), you can even tie the <CODE>EntityManager</CODE> and its underlying Hibernate transaction to an application transaction in a stateful session bean. The application transaction spans across multiple threads in a session and it is very useful in transactional web applications, such as multi-page shopping carts. The above simple and integrated programming interface is made possible due to the tight integration between the EJB 3.0 framework, Hibernate, and Tomcat inside of JBoss. A similar level of integration is also archived between Oracle's EJB 3.0 framework and its underlying Toplink persistence service.</P>
<P>Another good example of integrated services in EJB 3.0 is clustering support. If you deploy an EJB 3.0 application in a <STRONG><EM>server cluster, all of the fail-over, load-balancing, distributed cache, and state replication services are automatically available to the application.（这恐怕不是EJB3的原因吧？）</EM></STRONG> The underlying clustering services are hidden behind the EJB 3.0 programming interface and they are completely transparent to EJB 3.0 developers.</P>
<P>In Spring, it is more difficult to optimize the interaction between the framework and the services. For instance, in order to use Spring's declarative transaction service to manage Hibernate transactions, you have to explicitly configure the Spring <CODE>TransactionManager</CODE> and Hibernate <CODE>SessionFactory</CODE> objects in the XML configuration file. Spring application developers must explicitly manage transactions that span across several HTTP requests. In addition, there is no simple way to leverage clustering services in a Spring application.<BR><BR><FONT color=#ff1493><STRONG><EM>(其实，通过annotation 扩展了语义，而Spring 确实用常规手段。这点出发点都不一样。)<BR></EM></STRONG></FONT></P>
<H3>Flexibility in Service Assembly</H3>
<P>Since the service integration code in Spring is exposed as part of the programming interface, application developers have the flexibility to assemble services as needed. This feature enables you to assemble your own "lightweight" application servers. <STRONG>A common usage of Spring is to glue Tomcat together with Hibernate to support simple database-driven web applications.</STRONG> In this case, Spring itself provides transaction services and Hibernate provides persistence services--this setup <STRONG><EM>creates a mini application server</EM></STRONG> （<STRONG><EM><FONT color=#ff1493>这个观点倒是新鲜）</FONT></EM></STRONG>in itself.</P>
<P>EJB 3.0 application servers typically do not give you that kind of flexibility in picking and choosing on the services you need. Most of the time, you get a set of prepackaged features, some of which you might not need. However, if the application server features a modular internal design, as JBoss does, you might be able to take it apart and strip out the unnecessary features. In any case, it is not a trivial exercise to customize a full-blown application server.</P>
<P><STRONG><EM>Of course, if the application scales beyond a single node, you would need to wire in services (such as resource pooling, message queuing, and clustering) from regular application servers. The Spring solution would be just as "heavyweight" as any EJB 3.0 solution, in terms of the overall resource consumption.<BR></EM></STRONG></P>
<P><STRONG><EM><FONT color=#ff1493>（当然，SPring 本身就不是针对分布式的应用需求，也不支持。所以，没必要这么比。关键是看针对那些应用。）</FONT></EM></STRONG><BR>In Spring, the flexible service assembly also makes it easy to wire <STRONG><EM>mock objects,</EM></STRONG> <STRONG><EM><FONT color=#ff1493>（For Testing</FONT></EM></STRONG>）instead of real service objects, into the application for out-of-the-container unit testing. In EJB 3.0 applications, most components are simple POJOs, and they can be easily tested outside of the container. But for tests that involve container service objects (e.g., the persistence <CODE>EntityManager</CODE>), in-container tests are recommended, as they are easier, more robust, and more accurate than the mock objects approach<STRONG><EM><FONT color=#ff1493>.(当然，脱不脱离容器的测试其实对大家并不重要，关键是要简单，快速！)</FONT></EM></STRONG></P>
<H3>XML Versus Annotation</H3>
<P>From the application developer's point view, Spring's programming interface is primarily based upon XML configuration files while EJB 3.0 makes extensive use Java annotations. <STRONG><EM>XML files can express complex relationships, but they are also very verbose and less robust. Annotations are simple and concise, but it is hard to express complex or hierarchical structures in annotations</EM></STRONG>.（<STRONG><EM><FONT color=#ff1493>所以需要简化Spring 的XML语法，尽管我已经觉得很简单了。比起Struts之类的已经简单不少了。）</FONT></EM></STRONG></P>
<P>Spring and EJB 3.0's choices of XML or annotation depend upon the architecture behind the two frameworks: since annotations can only hold a fairly small amount of configuration information, only a pre-integrated framework (i.e., most of plumbing has been done in the framework) can make extensive use of annotations as its configuration option. As we discussed, EJB 3.0 meets this requirement, while Spring, being a generic DI framework, does not<FONT color=#ff1493><STRONG><EM>.（谁知道，以后Spring 会不会也Anotation一下?我觉得很可能会。）</EM></STRONG></FONT></P>
<P>Of course, as both EJB 3.0 and Spring evolve to learn from each other's best features, they both support XML and annotations to some degree. For instance, XML configuration files are available in EJB 3.0 as an optional overriding mechanism to change the default behavior of annotations. Annotations are also available to configure some Spring services.</P>
<P>The best way to learn the differences between the XML and annotation approaches is through examples. In the next several sections, let's examine how Spring and EJB 3.0 provide key services to applications.<BR><!--StartFragment -->&nbsp;</P>
<H3>Declarative Services</H3>
<P>Spring and EJB 3.0 wire runtime services (such as transaction, security, logging, messaging, and profiling services) to applications. Since those services are not directly related to the application's business logic, they are not managed by the application itself. Instead, the services are transparently applied by the service container (i.e., Spring or EJB 3.0) to the application at runtime. The developer (or administrator) configures the container and tells it exactly how/when to apply services.（<STRONG><EM><FONT color=#800080>AOP的天下</FONT></EM></STRONG>）<BR></P>
<P><!--  me  -->EJB 3.0 configures declarative services using Java annotations, while Spring uses XML configuration files. In most cases, the EJB 3.0 annotation approach is the simpler and more elegant way for this type of services. Here is an example of applying transaction services to a POJO method in EJB 3.0.</P><PRE><CODE>
public class Foo {
    
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public bar () {
      // do something ...
    }    
}
</CODE>
</PRE>
<P>You can also declare multiple attributes for a code segment and apply multiple services. This is an example of applying both transaction and security services to a POJO in EJB 3.0.</P><PRE><CODE>
@SecurityDomain("other")
public class Foo {
    
    @RolesAllowed({"managers"})
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public bar () {
      // do something ...
    }   
}
</CODE>
</PRE>
<P>Using XML to specify code attributes and configure declarative services could lead to verbose and unstable configuration files. Below is an example of XML elements used to apply a very simple Hibernate transaction to the <CODE>Foo.bar()</CODE> method in a Spring application.</P><!--  sidebar begins  --><!--  don't move sidebars  --><!--  sidebar ends  --><PRE><CODE>
&lt;!-- Setup the transaction interceptor --&gt;
&lt;bean id="foo" 
  class="org.springframework.transaction
        .interceptor.TransactionProxyFactoryBean"&gt;
    
    &lt;property name="target"&gt;
        &lt;bean class="Foo"/&gt;
    &lt;/property&gt;
    
    &lt;property name="transactionManager"&gt;
        &lt;ref bean="transactionManager"/&gt;
    &lt;/property&gt;
    
    &lt;property name="transactionAttributeSource"&gt;
        &lt;ref bean="attributeSource"/&gt;
    &lt;/property&gt;
&lt;/bean&gt;

&lt;!-- Setup the transaction manager for Hibernate --&gt;
&lt;bean id="transactionManager" 
  class="org.springframework.orm
         .hibernate.HibernateTransactionManager"&gt;
    
    &lt;property name="sessionFactory"&gt;
        &lt;!-- you need to setup the sessionFactory bean in 
             yet another XML element -- omitted here --&gt;
        &lt;ref bean="sessionFactory"/&gt;
    &lt;/property&gt;
&lt;/bean&gt;

&lt;!-- Specify which methods to apply transaction --&gt;
&lt;bean id="transactionAttributeSource"
  class="org.springframework.transaction
         .interceptor.NameMatchTransactionAttributeSource"&gt;
  
    &lt;property name="properties"&gt;
        &lt;props&gt;
            &lt;prop key="bar"&gt;
        &lt;/props&gt;
    &lt;/property&gt;
&lt;/bean&gt;
</CODE>
</PRE>
<P><STRONG><EM><FONT color=#ff1493>（EJB的方式的确简单，可是如果复杂度上升，恐怕优势也不怎么明显了。）<BR></FONT></EM></STRONG><BR>The XML complexity would grow <STRONG>geometrically</STRONG> if you added more interceptors (e.g., security interceptors) to the same POJO. Realizing the limitations of XML-only configuration files, Spring supports using <STRONG>Apache Commons metadata</STRONG> to specify transaction attributes in the Java source code.<STRONG><EM> In the latest Spring 1.2, JDK-1.5-style annotations are also supported.</EM></STRONG> <FONT color=#800080><STRONG><EM>（对啦，也许今后是个方向，学习是很重要的！</EM></STRONG></FONT>）To use the transaction metadata, you need to change the above <CODE>transactionAttributeSource</CODE> bean to an <CODE>AttributesTransactionAttributeSource</CODE> instance and add additional wirings for the metadata interceptors.<BR><STRONG><EM><FONT color=#ff1493>（Spring的一个问题是各种名称都不肯缩写，弄的老长。当然，意思更加清楚明了。）</FONT></EM></STRONG></P><PRE><CODE>
&lt;bean id="autoproxy"
    class="org.springframework.aop.framework.autoproxy
           .DefaultAdvisorAutoProxyCreator"/&gt;
&lt;bean id="transactionAttributeSource"
    class="org.springframework.transaction.interceptor
           .AttributesTransactionAttributeSource"
    autowire="constructor"/&gt;
&lt;bean id="transactionInterceptor"
    class="org.springframework.transaction.interceptor
           .TransactionInterceptor"
    autowire="byType"/&gt;
&lt;bean id="transactionAdvisor"
    class="org.springframework.transaction.interceptor
           .TransactionAttributeSourceAdvisor"
    autowire="constructor"/&gt;
&lt;bean id="attributes"
    class="org.springframework.metadata.commons
           .CommonsAttributes"/&gt;
</CODE>
</PRE>
<P>The Spring metadata simplifies the <CODE>transactionAttributeSource</CODE> element when you have many transactional methods. But it does not solve the fundamental problems with XML configuration files--the verbose and fragile transaction interceptor, <CODE>transactionManager</CODE>, and <CODE>transactionAttributeSource</CODE> are all still needed.</P>
<H3>Dependency Injection</H3>
<P><BR><STRONG><EM><FONT color=#ff1493>（这年头松散耦合这么流行，就像男女关系之间，一夜情好生流行似的。我们先前说的婚姻，恐怕也片面了些。各种滋味和含义，大家自己体会吧。）</FONT></EM></STRONG></P>
<P>A key benefit of middleware containers is that they enable developers to build loosely coupled applications. The service client only needs to know the service interface. The container instantiates service objects from concrete implementations and make them available to clients. This allows the container to switch between alternative service implementations without changing the interface or the client-side code.</P>
<P>The Dependency Injection pattern is one of best ways to implement loosely coupled applications. It is much easier to use and more elegant than older approaches, such as dependency lookup via JNDI or container callbacks. <FONT color=#ff0000><STRONG><EM>Using DI, the framework acts as an object factory to build service objects and injects those service objects to application POJOs based on runtime configuration</EM></STRONG>.</FONT> From the application developer's point of view, the client POJO automatically obtains the correct service object when you need to use it.</P>
<P>Both Spring and EJB 3.0 provide extensive support for the DI pattern. But they also have some profound differences. Spring supports a general-purpose, but complex, DI API based upon XML configuration files; EJB 3.0 supports injecting most common service objects (e.g., EJBs and context objects) and any JNDI objects via simple annotations.</P>
<P>The EJB 3.0 DI annotations are extremely concise and easy to use. The <CODE>@Resource</CODE> tag injects most common service objects and JNDI objects. The following example shows how to inject the server's default <CODE>DataSource</CODE> object from the JNDI into a field variable in a POJO. <CODE>DefaultDS</CODE> is the JNDI name for the <CODE>DataSource</CODE>. The <CODE>myDb</CODE> variable is automatically assigned the correct value before its first use.<BR><FONT color=#ff1493><STRONG><EM>(JNDI仍然可以玩，只不过lookup也由容器代劳了。精彩！！这对移植更加方便了</EM></STRONG></FONT>)<BR><BR></P><PRE><CODE>
public class FooDao {

    @Resource (name="DefaultDS")
    DataSource myDb;
    
    // Use myDb to get JDBC connection to the database
}
</CODE>
</PRE>
<P>In addition to direct field variable injection, the <CODE>@Resource</CODE> annotation in EJB 3.0 can also be used to inject objects via a setter method. For instance, the following example injects a session context object. The application never explicitly calls the setter method--it is invoked by the container before any other methods are called.</P><PRE><CODE>
@Resource 
public void setSessionContext (SessionContext ctx) { 
    sessionCtx = ctx; 
} 
</CODE>
</PRE>
<P>For more complex service objects, special injection annotations are defined. For instance, the <CODE>@EJB</CODE> annotation is used to inject EJB stubs and the <CODE>@PersistenceContext</CODE> annotation is used to inject <CODE>EntityManager</CODE> objects, which handle database access for EJB 3.0 entity beans. The following example shows how to inject an <CODE>EntityManager</CODE> object into a stateful session bean. The <CODE>@PersistenceContext</CODE> annotation's <CODE>type</CODE> attribute specifies that the injected <CODE>EntityManager</CODE> has an extended transaction context--it does not automatically commit with the JTA transaction manager, and hence it can be used in an application transaction that spans across multiple threads in a session.<BR><STRONG><EM><FONT color=#ff1493>（这里才是EJB的关键。）</FONT><BR></EM></STRONG><BR></P><PRE><CODE><BR>
@Stateful
public class FooBean implements Foo, Serializable {

    @PersistenceContext(
      type=PersistenceContextType.EXTENDED
    )
    protected EntityManager em;
    
    public Foo getFoo (Integer id) {
        return (Foo) em.find(Foo.class, id);
    }
}
</CODE>
</PRE>
<P>The EJB 3.0 specification defines server resources that can be injected via annotations. But it does not support user-defined application POJOs to be injected into each other.</P>
<P>In Spring, you first need to define a setter method (or constructor with arguments) for the service object in your POJO. The following example shows that the POJO needs a reference to the Hibernate session factory.</P><PRE><CODE>
public class FooDao {
    
    HibernateTemplate hibernateTemplate;
    
    public void setHibernateTemplate (HibernateTemplate ht) {
        hibernateTemplate = ht;
    }
    
    // Use hibernateTemplate to access data via Hibernate
    public Foo getFoo (Integer id) {
        return (Foo) hibernateTemplate.load (Foo.class, id);
    }
}
</CODE>
</PRE>
<P>Then, you can specify how the container gets the service object and wire it to the POJO at runtime through a chain of XML elements. The following example shows the XML element that wires a data source to a Hibernate session factory, the session factory to a Hibernate template object, and finally, the template object to the application POJO. Part of the reason for the complexity of the Spring code is the fact that we need to inject the underlying Hibernate plumbing objects manually, where the EJB 3.0 <CODE>EntityManager</CODE> is automatically managed and configured by the server. But that just brings us back to the argument that Spring is not as tightly integrated with services as EJB 3.0 is.</P><PRE><CODE>
&lt;bean id="dataSource" 
  class="org.springframework
         .jndi.JndiObjectFactoryBean"&gt;
    &lt;property name="jndiname"&gt;
        &lt;value&gt;java:comp/env/jdbc/MyDataSource&lt;/value&gt;
    &lt;/property&gt;
&lt;/bean&gt;

&lt;bean id="sessionFactory" 
  class="org.springframework.orm
         .hibernate.LocalSessionFactoryBean"&gt;
    &lt;property name="dataSource"&gt;
        &lt;ref bean="dataSource"/&gt;
    &lt;/property&gt;
&lt;/bean&gt;

&lt;bean id="hibernateTemplate" 
  class="org.springframework.orm
         .hibernate.HibernateTemplate"&gt;
    &lt;property name="sessionFactory"&gt;
        &lt;ref bean="sessionFactory"/&gt;
    &lt;/property&gt;    
&lt;/bean&gt;

&lt;bean id="fooDao" class="FooDao"&gt;
    &lt;property name="hibernateTemplate"&gt;
        &lt;ref bean="hibernateTemplate"/&gt;
    &lt;/property&gt;
&lt;/bean&gt;

&lt;!-- The hibernateTemplate can be injected
        into more DAO objects --&gt;
</CODE>
</PRE>
<P>Although the XML-based Dependency Injection syntax in Spring is complex, <STRONG>it is very powerful.</STRONG> <EM><STRONG><FONT color=#ff1493>（正因如此，才和其它框架和遗恨好的集成，这样，架构就有更多选择。</FONT>）</STRONG></EM>You can inject any POJO, including the ones defined in your applications, to another POJO. If you really want to use Spring's DI capabilities in EJB 3.0 applications, you can <A href="http://chris-richardson.blog-city.com/the_ejb_cult_part_3__integrating_spring_and_ejb_30_dependency_injection.htm">inject a Spring bean factory into an EJB</A> via the JNDI. （<STRONG><EM><FONT color=#ff1493>这样INDI也是老树新花。当然JNDI的用处大了，JavaEE不可能丢了他。</FONT></EM></STRONG>）In some EJB 3.0 application servers, the vendor might define extra non-standard APIs to inject arbitrary POJOs. A good example is the <A href="http://wiki.jboss.org/wiki/Wiki.jsp?page=JBossKernel">JBoss MicroContainer</A>, which is even more generic than Spring, as it handles Aspect-Oriented Programming (AOP) dependencies.</P>
<H3>Conclusions</H3>
<P>Although Spring and EJB 3.0 both aim to provide enterprise services to loosely coupled POJOs, they use very different approaches to archive this goal. Dependency Injection is a heavily used pattern in both frameworks.</P>
<P>With EJB 3.0, the<STRONG> standards-based approach, wide use of annotations, and tight integration with the application server all result in greater vendor independence and developer productivity</STRONG>. With Spring, the consistent use of dependency injection and the centralized XML configuration file allow developers to construct more <STRONG>flexible </STRONG>applications and work with several application service providers at a time.<BR></P>
<H3><FONT color=#ff1493><EM>（各有所长。EJB还是针对高端，Spring针对低端，中间一部分重合，大家两全其美。</EM></FONT></H3>
<H3><FONT color=#ff1493><EM>这篇文章在OnJava一篇骂声，还是开源的同志们比较多阿。）</EM></FONT></H3>
<H3>Acknowledgments</H3>
<P>The author would like to thank Stephen Chambers, Bill Burke, and Andy Oliver for valuable comments.</P>
<H3><A id=resources name=resources>Resources</A></H3>
<UL>
<LI>The <A href="http://www.springframework.org/">Spring framework</A> (see also <A href="http://www.codezoo.com/">CodeZoo</A>: <A href="http://www.codezoo.com/pub/component/126">Spring</A>) 
<LI><A href="http://www.jcp.org/en/jsr/detail?id=220">EJB 3.0</A> 
<LI><A href="http://www.jboss.com/products/ejb3">JBoss EJB 3.0</A> 
<LI><A href="http://www.oracle.com/technology/tech/java/ejb30.html">Oracle Application Server EJB 3.0 Preview</A></LI></UL><img src ="http://www.blogjava.net/SteelHand/aggbug/7762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-07-15 12:23 <a href="http://www.blogjava.net/SteelHand/archive/2005/07/15/7762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts秘籍之第2段：第3.7式： 动态产生JavaScript</title><link>http://www.blogjava.net/SteelHand/archive/2005/06/07/5654.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Tue, 07 Jun 2005 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/06/07/5654.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/5654.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/06/07/5654.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/5654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/5654.html</trackback:ping><description><![CDATA[<H3>第3.7式. 动态产生JavaScript</H3>
<H4><A name=jakartastrutsckbk-CHP-3-SECT-7.1></A>问题</H4>
<P>你想要根据从应用模型获得的数据动态产生JavaScript。</P>
<H4><A name=jakartastrutsckbk-CHP-3-SECT-7.2></A>动作要领</H4>
<P>使用Struts 标签在你想要包含在HTML中的JavaScript 代码中渲染数据：<BR><BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_30_139_Open_Image onclick="this.style.display='none'; Codehighlighter1_30_139_Open_Text.style.display='none'; Codehighlighter1_30_139_Closed_Image.style.display='inline'; Codehighlighter1_30_139_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_30_139_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_139_Closed_Text.style.display='none'; Codehighlighter1_30_139_Open_Image.style.display='inline'; Codehighlighter1_30_139_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">script&nbsp;</SPAN><SPAN style="COLOR: #ff0000">language</SPAN><SPAN style="COLOR: #0000ff">="JavaScript"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN id=Codehighlighter1_30_139_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_30_139_Open_Text><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><BR><IMG id=Codehighlighter1_60_138_Open_Image onclick="this.style.display='none'; Codehighlighter1_60_138_Open_Text.style.display='none'; Codehighlighter1_60_138_Closed_Image.style.display='inline'; Codehighlighter1_60_138_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_60_138_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_60_138_Closed_Text.style.display='none'; Codehighlighter1_60_138_Open_Image.style.display='inline'; Codehighlighter1_60_138_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;showMessage(&nbsp;&nbsp;)&nbsp;</SPAN><SPAN id=Codehighlighter1_60_138_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_60_138_Open_Text><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&nbsp;</SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">Hello,&nbsp;&lt;bean:write&nbsp;name='myForm'&nbsp;property='name'/&gt;!</SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">script</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P><A name=jakartastrutsckbk-CHP-3-SECT-7.3></A>&nbsp;</P>
<H4>动作变化</H4>
<P>上述方案产生了一个JavaScript 函数，弹出一个消息框，消息文本为"Hello, name!" <EM>name</EM>的值是使用<A name=jakartastrutsckbk-CHP-3-ITERM-1545></A><A name=jakartastrutsckbk-CHP-3-ITERM-1546></A>bean:write标签产生的。此方案展示了使用Struts 标签创建JavaScript 和它们创建HTML一样的容易。</P>
<P>JSTL也可以按这种方式使用。</P>
<P>虽然这种方法很明显，但是很奇怪很多人都在问这个问题。通常问题还可能是："我如何才能从Struts中调用HTML中的<A name=jakartastrutsckbk-CHP-3-ITERM-1547></A>JavaScript 函数？" 技术上讲，你并不能从Struts调用一个HTML页面中的JavaScript 函数。Struts 和JSP 技术都运行在服务器端。相反，JavaScript确是在客户端的浏览器中处理的。但是，通过这里所述的动态产生JS的能力，基本上还是相当于所需的这个行为。</P>
<P>这个方法的一个重要基础是JSP的转换过程。JSP 页面由JSP 声明，标准JSP 标签 (比如jsp:useBean), 定制JSP 标签(比如Struts 和JSTP 标签), 运行是表达式，以及脚本小程序（scriptlets）组成。除此之外的其他东西都是模板文本（<A name=jakartastrutsckbk-CHP-3-ITERM-1548></A><A name=jakartastrutsckbk-CHP-3-ITERM-1549></A><EM>template text</EM><EM>）。</EM>模板文本可以是任何不会被JSP转换处理的内容。人们通常会认为模板文本就是HTML 标记，但是它其实是JavaScript 或者其他非JSP 处理的文本。JSP 翻译器并不关心模板文本采用何种形式。因此，你可以象在HTML元素中产生文本一样容易地在JavaScript 函数中产生文本。</P>
<P>如果你使用JSP 来产生良构的（well-formed）<A name=jakartastrutsckbk-CHP-3-ITERM-1550></A>XHTML, 那么动态JavaScript 模版文本必须使用jsp:text元素和CDATA section的方式结合来指定。具体信息参见Hans Bergsten的ONJava 文章：<A href="http://www.onjava.com/pub/a/onjava/2004/04/21/JSP2part3.html">http://www.onjava.com/pub/a/onjava/2004/04/21/JSP2part3.html</A>。</P>
<P>这里的例子仅仅列出了很简单的使用场景。如果要访问的模型数据需要使用复杂的JavaScript数据结构，比如，数组，你可以使用迭代标签，比如<A name=jakartastrutsckbk-CHP-3-ITERM-1552></A><A name=jakartastrutsckbk-CHP-3-ITERM-1553></A>logic:iterate和<A name=jakartastrutsckbk-CHP-3-ITERM-1554></A><A name=jakartastrutsckbk-CHP-3-ITERM-1555></A>c:forEach来组装这些结构。</P>
<H4><A name=jakartastrutsckbk-CHP-3-SECT-7.4></A>相关动作</H4>
<P>下一动3.8或会使用迭代标签来产生客户端的JavaScript 数组。</P><img src ="http://www.blogjava.net/SteelHand/aggbug/5654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-06-07 12:32 <a href="http://www.blogjava.net/SteelHand/archive/2005/06/07/5654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web和Services, 能混为一谈吗？</title><link>http://www.blogjava.net/SteelHand/archive/2005/05/30/5328.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Mon, 30 May 2005 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/05/30/5328.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/5328.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/05/30/5328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/5328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/5328.html</trackback:ping><description><![CDATA[以下是<span class="bannerdescription">Ted Neward的一个blog，旨在陈清多年来一直可能混淆的概念，即“Web Services”是一个东西吗？<br>
他认为,其实人们可能都混淆了，Web代表的是互操作性，而Services则是代表一种设计理念，即独立的、自治的、无耦合的组件模型。而“Web Service”仅是其中的一种结合方案而已。<br>
颇有见地。<br>
下面是摘录的原文，其中精彩之处予以标出：原文可访问 http://www.neward.net/ted/weblog/index.jsp?date=20050525#1117011754831<br>
<br>
</span>

<p class="MsoNormal" style="text-align: left;" align="left"><a name="1117011754831"><b><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">Web + Services</span></b></a><span style=""></span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"> <o:p></o:p></span></p>


<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">A lot has been written recently about Service-Orientation and Web services
and REST and the massive amounts of confusion that seem to be surrounding the
whole subject. After much navel-contemplation, I'm convinced that the root of
the problem is that there's two entirely orthogonal concepts that are being
tangled up together, and that we need to tease them apart if we're to make any
sense whatsoever out of the whole mess. (And it's necessary, I think, to make
sense out of it, or else we're going to find ourselves making a <st1:place w:st="on">LOT</st1:place> of bad decisions that will come to haunt us over the
next five to ten years.)<o:p></o:p></span></p>


<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">The gist of the idea is simple: that in the term "Web services",
there are two basic concepts we keep mixing up and confusing. "Web",
meaning interoperability across languages, tools and platforms, and
"services", meaning a design philosophy seeking to correct for the
flaws we've discovered with distributed objects and components. These two
ideas, while definitely complementary, stand alone, and a quick examination of
each reveals this.<o:p></o:p></span></p>


<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">Interoperability, as an idea, only requires that programs be written with
an eye towards doing things that don't exclude any one platform, tool or
technology from playing on the playground with the other kids. <b style=""><i style="">For
example, <span style="color: red;">interoperability is easy if we use text-based
protocols, since everybody knows how to read and write text</span></i></b>;
hence, HTTP and SMTP and POP3 are highly-interoperable protocols, but DCOM's
MEOW or Java's JRMP protocols aren't, since each relies on sending binary
little-endian or big-endian-encoded data. Interoperability isn't necessarily a
hard thing to achieve, but it requires an attention to low-level detail that
most developers want to avoid. (This desire to avoid low-level details isn't a
criticism--it's our ability to avoid that kind of detail that allows us to
write larger- and larger-scale systems in the first place.)<o:p></o:p></span></p>


<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">This "<b style=""><i style=""><span style="color: red;">seeking to avoid exclusion"</span></i></b>
requirement for interoperability is why we like using XML so much. Not only is
it rooted in plain-text encoding, which makes it relatively easy to pass around
multiple platforms, but its ubiquity makes it something that we can reasonably
expect to be easily consumed in any given language or platform. Coupled with
recent additions to build higher-order constructs on top of XML, we have a
pretty good way of representing data elements in a way that lots of platforms
can consume. Does interoperability <i>require</i> XML to work? Of course not.
We've managed for the better part of forty years to interoperate without XML,
and we probably could have kept on doing quite well without it; X<b style=""><i style=""><span style="color: red;">ML makes things easier, nothing more.<o:p></o:p></span></i></b></span></p>


<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">Services, on the other hand, is a <b style=""><i style=""><span style="color: red;">design philosophy</span></i></b>
that seeks to correct for the major failures in distributed object and
distributed component design. It's an attempt to <b style=""><i style=""><span style="color: red;">create
"things" that are more reliable to outages, more secure, and more
easily versioned and evolvable, things that objects/components never really
addressed or solved.<o:p></o:p></span></i></b></span></p>


<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">For example, building services to be autonomous (as per the "Second
Tenet of Service-Orientation", as coined by Mr. Box) means that the
service has to<b style=""><i style=""><span style="color: red;"> recognize that it stands alone</span></i></b>,
and <b style=""><i style=""><span style="color: red;">minimize its dependencies</span></i></b> on other
"things" where possible. Too much dependency in distributed object
systems meant that if any one cog in the machine were to go out for some
reason, the entire thing came grinding to a halt, a particularly wasteful
exercise when over three-quarters of the rest of the code really had nothing to
do with the cog that failed. But, because everything was synchronous RPC
client/server calls, one piece down somewhere on the back-end meant the whole
e-commerce front-end system comes to a shuddering, screeching pause while we
figure out why the logging system can't write any more log messages to disk.<o:p></o:p></span></p>


<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">Or, as another example, the First Tenet states that "Boundaries are
explicit"; this is a well-recognized flaw with any distributed system, as
documented back in 1993 by Wolrath and Waldo in their paper "A Note on
Distributed Computing". Thanks to the fact that traversing across the
network is an expensive and potentially error-prone action, past attempts to
abstract away the details of the network ("Just pretend it's a local
call") eventually result in nothing but abject failure. Performance
failure, scalability failure, data failure, you name it, they're all
consequences of treating distributed communication as local. It's enough to
draw the conclusion "well-designed distributed objects are just a
contradiction in terms".<o:p></o:p></span></p>


<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">There's obviously more that can be said of both the "Web" angle
as well as the "Services" angle, but hopefully enough is here to recognize
the distinction between the two. We have a long ways to go with both ideas, by
the way. Interoperability isn't finished just because we have XML, and clearly
questions still loom with respect to services, such as the appropriate
granularity of a service, and so on. Work remains. Moreover, the larger
question still looms: if there is distinction between them, why bring them
together into the same space? And the short answer is, "Because
individually, each are interesting; collectively, they represent a powerful
means for designing future systems." By combining interoperability with
services, we create "things" that can effectively stand alone for the
forseeable future.<o:p></o:p></span></p>


<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">And in the end, isn't that what we're supposed to be doing?</span></p>

<br>
<span class="bannerdescription"><br>
</span><img src ="http://www.blogjava.net/SteelHand/aggbug/5328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-05-30 13:16 <a href="http://www.blogjava.net/SteelHand/archive/2005/05/30/5328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 使用 WebSphere Application Server V6 构建企业服务总线</title><link>http://www.blogjava.net/SteelHand/archive/2005/05/27/5268.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Fri, 27 May 2005 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/05/27/5268.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/5268.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/05/27/5268.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/5268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/5268.html</trackback:ping><description><![CDATA[<p>IBM Websphere 中国开发站点有几篇新的Websphere V6中构建ESB的文章，目前已发表3篇：<br>分别是&nbsp;：<br><br><!--StartFragment --> <span class="atitle">使用 WebSphere Application Server V6 构建企业服务总线 —— <br>第1 部分</span>&nbsp;<!--StartFragment --> <span class="atitle2"><a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0501_reinitz/0501_reinitz.html">WebSphere V6 消息传递资源入门</a></span>&nbsp;<br><!--StartFragment -->第2 部分：<a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0502_reinitz/0502_reinitz.html">&nbsp;<span class="atitle2">业务需求以及总线</span> </a><br><!--StartFragment -->第3部分：&nbsp; <a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0504_reinitz/0504_reinitz.html"><span class="atitle2">简单的 JMS 消息传递实例</span> </a><br><br>跟踪中.....</p><img src ="http://www.blogjava.net/SteelHand/aggbug/5268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-05-27 15:29 <a href="http://www.blogjava.net/SteelHand/archive/2005/05/27/5268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 平台持久性机制的比较</title><link>http://www.blogjava.net/SteelHand/archive/2005/05/24/5098.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Tue, 24 May 2005 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/05/24/5098.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/5098.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/05/24/5098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/5098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/5098.html</trackback:ping><description><![CDATA[<H1>Java 平台持久性机制的比较</H1>
<P align=left>&nbsp;</P>
<P align=left>访问持久性数据是所有应用都需要考虑的一个重要方面。Java 语言严格的遵循了持久性数据和暂态性数据的分离，将持久性管理留给了应用或者分层机制。SUN使用一种严格的比较机制测试和比较了Java平台上的各种革新的持久性机制。</P>
<P align=left>通过选择，选出了一个有代表意义的几个系统来进行评价和比较。这些机制都通过OO7J的基准测试进行量化分析。</P>
<P align=left>所有的测试环境都具有足够的内存，使得测试数据库完全可以在内存中驻留，排除磁盘访问等硬件的影响，也是今天主要服务环境的通用内存容量配置。OO7J的虚拟机变体设置性能基线，每一种机制都和它进行比较。OPJ的PJama实现得到了总体最高分。它只需要最小的源代码修改，甚至对OO7J的主体基本不需要，虽然它仅是一个原型实现，却取得了最好的性能。但是它的确需要一个定制的虚拟机。</P>
<P align=left>EJB 框架看起来最糟，需要最多的源代码修改和最坏的性能和可伸缩性。</P>
<P align=left>JOS 和 JBP，虽然因为它们缺乏增量访问从而使得在读写数据的时候性能也很糟糕，但是，他也仅需要很少的代码修改并能在数据在内存中的情况下全速运行。</P>
<P align=left>JDBC 对源代码修改也有较大影响，但是性能却是在JVM和数据库的边缘交叉处的大量交互体现的很好。两个JDO 的变体则展现出JDO模型对不同外部数据存储的多能性。特别是JDO-TP 和其事务对象模型对关系数据库工作的很好，同时允许源代码对基线保持最小的变更。并且， JDO 的性能也排在前列，一旦数据在内存中，这是合情合理的，比JDBC 和 EJB而言也是如此。</P>
<P align=left>虽然EJB CMP 的性能要优于EJB BMP，其性能也差于JDO-TP很多。EJB性能差的原因还不清楚，也应该注意到，一些应用服务企业有很差的性能，可能是容器实现的原因。</P>
<P align=left>作为结论，很显然，持久性对应用代码的影响是很宽的，也对结果系统的性能影响很大。. 如果在虚拟机一级得到支持，OPJ可望提供最有竞争力的性能。在另一个极端，EJB似乎很难达到可接受的性能水平，除非应用对象模型发生戏剧性的变化，从而避免在映射到EJB时产生的细粒度对象。虽然这些方法已经反映在标准的EJB设计模式中了，但是其暗示着在应用程序的各个方面均要附加更多额外的努力。相反，JDO 试图在对应用设计的影响最小的情况下达到合理的性能，同时保持对外部数据源的中立。因此，当前，JDO 似乎能够提供面向对象应用所需的最佳的总体持久性机制。但是，目前，SUN建议了一个最新的实体Bean持久性规范 [Sun04]，提交给 EJB3.0，它可能更加接近于JDO 模型。</P>
<P>&nbsp;</P>
<P>报告的原文可以在以下地址下载：<A href="http://research.sun.com/techrep/2004/smli_tr-2004-136.pdf">http://research.sun.com/techrep/2004/smli_tr-2004-136.pdf</A></P>
<P>同时，这也是SUN首次公开披露EJB的性能问题。这也解释了为什么EJB一直得不到很好的广泛使用的原因，淡然还有它的复杂性和部署的高成本性（需要昂贵的EJB容器）。作为J2EE规范中的一个重要的核心组件，SUN的赌注押在了EJB3.0上面。EJB3.0相关的持久性机制（JSR220）吸收了JDO和oracle的TopLink的优点，并且可望提供向后兼容性和迁移API。</P>
<P>虽然，EJB从其规范和目标来说看上去很美。但是EJB3.0至少要今年晚些时候才能出场，目前我们能够使用什么呢?考察目前市面上的持久性框架，结合你的应用要求，也不难得出选择。毕竟，应用来说，性能并不是第一位的。</P>
<P>对于持久性框架的选择，从应用和功能上讲，主要考虑以下方面：</P>
<UL>
<LI>对O-R mapping框架的使用经验。&nbsp; 
<LI>数据源（Data Source），必须支持不同的数据源，包括关系数据库和JCA体系。 
<LI>最好提供图形化的映射工具来进行对象和数据库表之间的映射，自动生成XML配置文件。&nbsp; 
<LI>数据库支持，可以利用数据库的优势，如存储过程，触发器，支持高级数据类型和数据库安全。&nbsp; 
<LI>查询支持，应该支持通过Java代码或者OO查询机制，如EJB QL，按例查询，标准SQL 来编写自己的查询。 
<LI>锁定。必须支持不同应用访问同一数据库时候的锁定机制。&nbsp; 
<LI>缓存。提供有效的缓存基址，减少网络和查询的开销。&nbsp;并支持不同节点的集群。 
<LI>支持到EJB 3.0的迁移。</LI></UL>
<P>&nbsp;</P>
<P align=left>目前，JBOSS已经在AS 4.0中提供了EJB3.0的早期实现。可以参考。<A href="http://www.jboss.org/products/ejb3">http://www.jboss.org/products/ejb3</A></P>
<P>&nbsp;</P>
<P>如果你不怕在Oracle数据库平台上锁定，你打可使用Toplink，这也是目前性能最好的POJO的持久性框架。Oracle也是EJB3.0的专家组，将来肯定会提供迁移的手段。 你可以阅读这篇文章：Preparing for EJB3.0. 地址：<A href="http://www.oracle.com/technology/tech/java/newsletter/articles/toplink/preparing_for_ejb_3.html">http://www.oracle.com/technology/tech/java/newsletter/articles/toplink/preparing_for_ejb_3.html</A></P>
<P>&nbsp;</P>
<P>注：</P>
<P><STRONG>JOS</STRONG></P>
<P align=left>JOS，称为Java对象序列化，是JDK 1.1 引入的 [Sun99]，它是一种支持几乎所有对象到流的编码和从流解码的机制。他不是基于属性表的编码，而是基于文本的，对象序列使用标准的二进制编码格式。JOS 是Java平台默认的持久性机制，也被用来作为 JAVA远程方法调用RMI的参数编组协议。在最低层次上，JOS 构成了对基础类型的编码和解码的平台支持。但是，序列化遇到了类演化的严重问题，这也使得在Java1.4中引入了“JavaBean的长期持久化”的新系统。</P>
<P align=left><STRONG>JDBC</STRONG></P>
<P align=left>JDK 1.1 也引入了Java数据库连接(JDBC) API [FEB03]作为使用标准的SQL语言在Java和关系数据库之间的通信机制。JDBC为Java 向关系数据库提供了一个强有力的跳板，并且被平台上的很多API实现证明很成功。设计者很成功地将Java 编程语言和SQL进行了嫁接，而且JDBC 对直接的数据库访问非常容易使用。然而，如果应用需要底层数据的对象视图的时候，比如，将主键转换成相等的对象间的引用关系，程序将便得非常复杂和容易出错。为了解决这个问题，有许多系统开发出来试图自动化这个流程，这通常称为是对象关系映射（O-R Mapping）。大多数开发环境都提供对这一机制的不同程度的支持。 JDBC API 也在发展，近来支持直接将Java语言中的一个类映射到SQL的面向对象扩展中的相等类型。</P>
<P align=left><STRONG>JDO</STRONG></P>
<P align=left>在JDBC 开发的同时，对象数据库管理组 (ODMG)定义了一个它们的对象模型到Java语言的绑定[Ced96]，而许多对象数据库厂商则提供了这种绑定的实现。因为对象数据库并不像关系数据库那样部署普遍，因此反映在这个绑定上面也是不怎么成功。Java社区流程（JCP）出现后，这一努力被一个更广泛的建议所替代，即Java数据对象 (JDO) [JR03]。JDO 的目标是针对各种各样的底层数据存储，包括关系数据库，并向开发人员呈现一个类似于LJS所定义的对象模型，但附加限制更少。而许多对象数据库厂商也支持JDO。</P>
<P align=left><STRONG>OPJ</STRONG></P>
<P align=left>综合这些努力，SUN和 Glasgow 大学合作，提出了一个Java平台的正交持久化机制 (OPJ) [JA00]。这一方法以极高的透明性支持变成语言的各个方面。从本质上讲，OPJ 添加了对JVM稳定内存的支持，也意味着这一对JVM 实现的要求根本上限制了其可接受性。</P><img src ="http://www.blogjava.net/SteelHand/aggbug/5098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-05-24 10:26 <a href="http://www.blogjava.net/SteelHand/archive/2005/05/24/5098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>骡子力气比马大：一个ESB集成框架CodeHaus Mule</title><link>http://www.blogjava.net/SteelHand/archive/2005/05/18/4737.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Wed, 18 May 2005 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/05/18/4737.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/4737.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/05/18/4737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/4737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/4737.html</trackback:ping><description><![CDATA[<P align=left>&nbsp;</P>
<P>Mule 是一个基于ESB架构理念的消息平台。Mule 的核心是一个基于SEDA的服务容器，该容器管理被称为通用消息对象（Universal Message Objects /UMO）的服务对象，而这些对象都是POJO。所有UMO和其他应用之间的通信都是通过消息端点（message endpoint）来进行的。这些端点为众多的分立的技术，比如Jms, Smtp, Jdbc, Tcp, Http, Xmpp, file等等，提供了简单和一致的接口。</P>
<P align=left>Mule 应用通常是由网络中的许多Mule 实例组成。每一个实例都是一个驻留一个或者多个UMO组件的轻量级容器。每一个UMO 组件都有一个或者多个通过它（们）发送和接收事件的端点。<BR><BR><BR><IMG height=264 alt=clip_image001_0013.gif src="http://www.blogjava.net/images/blogjava_net/steelhand/clip_image001_0013.gif" width=568 border=0></P>
<P>容器通过UMO组件提供各种各样的服务，比如事务管理、事件转换，路由，事件关联、日志、审计和管理等等。Mule将对象构造从管理手段中分离出来，通常流行框架和IoC/DI 容器，如Spring, PicoContainer 或者 Plexus 可用这种管理手段来构建你的UMO 组件。</P>
<P>很多人认为， "Mule是一个Jms 实现"。实际上，Mule 不是一个Jms server，但是可以配置来使用任何你觉得非常漂亮的Jms server。Mule 的理念是，如果已经有了稳定和广泛接受的实现，就不会直接实现任何传输。例如，Mule 就重用了Axis 和 GLUE 的SOAP栈而不是重新实现一个。Mule 提供了一个一致的服务集来管理任何类型的连接的事件流、关联、事务、安全和审计。</P>
<P>&nbsp;</P>
<P>下面是Mule Server 组件的简单图示：<BR></P>
<P align=left><IMG height=349 alt=clip_image002_0002.gif src="http://www.blogjava.net/images/blogjava_net/steelhand/clip_image002_0002.gif" width=369 border=0><BR></P>
<P align=center><IMG height=1 src="/FreeTextBox/Utility/spacer.gif" width=1></P>
<H3><A name=Introduction-TheMuleManager>Mule Manager</A></H3>
<P>Mule Manager是Mule server 实例的中心(也称为一个节点户或者Mule Node)。其主要的角色是管理各种对象，比如Mule实例的连接器、端点和转换器。这些对象然后被用来控制进出你的服务组件的消息流，并且为Model和它所管理的组件提供服务。</P>
<P align=left><A name=Introduction-TheModel><STRONG>Model</STRONG></A><STRONG></STRONG></P>
<P>model 是管理和执行组件的容器。它控制进出组件的消息流，管理线程、生命周期和缓充池。默认的<EM>MuleModel</EM>是基于SEDA的，它使用一个有效的基于事件的队列模型来获取的最大的性能和直通性。</P>
<P align=left><A name=Introduction-UMOComponents><STRONG>UMO Components</STRONG></A><STRONG></STRONG></P>
<P>UMO代表Universal Message Object；它是一个可以接收来自于任何地方的消息的对象。UMO 组件就是你的业务对象。它们是执行引入的事件之上的具体业务逻辑的组件。这些组件是标准的JavaBean，组件中并没有任何Mule特定的代码。Mule 基于你的组件的配置处理所有进出组件的事件的路由和转换。</P>
<P align=left><A name=Introduction-Endpoints><STRONG>Endpoints</STRONG></A><STRONG></STRONG></P>
<P>Endpoint是Mule的通信能力的基础。一个Endpoint定义了两个或者多个组建应用或者存储库之间的通信渠道。并且提供了一个强大的机制来允许你的对象在一个统一的方式上再多种协议之上进行交谈。端点可以通过消息过滤器、安全拦截器和事务信息进行配置来控制什么消息，在何时，以及怎样通过端点进行发送和接收。</P>
<P align=left><A name=Introduction-ExternalApplications><STRONG>External Applications</STRONG></A><STRONG></STRONG></P>
<P>外部应用可以使任何应用，从应用服务器到遗留的传统应用，主机程序，或者C/S系统。基本上是任何可以产生和操纵数据的应用。因为Mule通过endpoints执行所有通信，UMO 组件并不打算在其中包含应用产生数据，以及应用主流，以及使用传输协议的部分。</P>
<P>&nbsp;</P>
<P align=left><A name=Overview-KeyFeatures><STRONG>关键特性</STRONG></A><STRONG></STRONG></P>
<UL>
<LI>基于J2EE 1.4的企业消息总线（ Enterprise Service Bus (ESB)）和消息代理（broker） 
<LI>可插入性连接，比如Jms (1.0.2b 和 1.1), vm (嵌入), jdbc, tcp, udp, multicast, http, servlet, smtp, pop3, file, xmpp等 
<LI>支持任何传输之上的异步，同步和请求响应事件处理机制 
<LI>支持<A href="http://mule.codehaus.org/Axis+Web+Services+and+Mule">Axis</A>或者<A href="http://mule.codehaus.org/Glue+Web+Services+and+Mule">Glue</A>的Web Service. 
<LI>灵活的部署结构[Topologies]包括Client/Server, P2P, ESB 和Enterprise Service Network. 
<LI>支持声明性和编程性事务，包括XA 支持 
<LI>对事件的路由、传输和转换的断到端支持 
<LI>Spring 框架集成。可用作ESB 容器，而Mule c也可以很容易的嵌入到Spring 应用中。 
<LI>使用基于<A href="http://mule.codehaus.org/SEDA">SEDA</A>处理模型的高度可伸缩的企业服务器 
<LI>支持REST API 来提供技术独立和语言中立的基于web的对Mule 事件的访问 
<LI>强大的基于<A href="http://www.eipatterns.org/">EIP</A>模式的事件路由机制 
<LI>动态、声明性的，基于内容和基于规则的路由选项 
<LI>非入侵式的方式。任何对象都可以通过ESB 容器管理 
<LI>强大的应用集成框架 
<LI>完整的可扩展的开发模式</LI></UL>
<P align=left><A name=Overview-WhentouseMule><STRONG>何时使用</STRONG></A><STRONG></STRONG></P>
<P>一般在这些情形下使用Mule - </P>
<UL>
<LI>集成两个或者多个需要互相通信的或者多个现有的系统. 
<LI>需要完全和周围环境去耦合的应用，或者需要在系统中伸缩不止一个组件的系统 
<LI>开发人员不知道未来是否会将其应用分发或者伸缩需求的单VM 应用。</LI></UL>
<P>项目地址：<A href="http://mule.codehaus.org/">http://mule.codehaus.org/</A></P><img src ="http://www.blogjava.net/SteelHand/aggbug/4737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-05-18 13:22 <a href="http://www.blogjava.net/SteelHand/archive/2005/05/18/4737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一种优雅的流行架构：Struts+Spring+Hibernate (1)</title><link>http://www.blogjava.net/SteelHand/archive/2005/04/29/3934.html</link><dc:creator>铁手</dc:creator><author>铁手</author><pubDate>Fri, 29 Apr 2005 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/SteelHand/archive/2005/04/29/3934.html</guid><wfw:comment>http://www.blogjava.net/SteelHand/comments/3934.html</wfw:comment><comments>http://www.blogjava.net/SteelHand/archive/2005/04/29/3934.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.blogjava.net/SteelHand/comments/commentRss/3934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SteelHand/services/trackbacks/3934.html</trackback:ping><description><![CDATA[<P>用java来建立一个很有价值的web 应用不是一个简单的任务。在架构这个应用时要考虑很多的因素和问题。从更高的层次来看，开发人员面临着关于如何构建用户接口，何处驻留业务逻辑，以及如何实现数据持久性这些问题。这3层都有各自的问题需要回答。而每一层又需要实现那些技术？应用如何设计来进行松散耦合并能进行灵活变更？应用架构是否允许某一层变更而不影响到其它的层次？应用应该如何处理容器一级的服务比如事务？</P>
<P>在为你的应用创建一个架构之前有许多问题需要澄清。幸运的是，有很多开发者都意识到这个问题，并建立了很多框架来解决这些问题。一个良好的框架可以让开发人员减轻重新建立解决复杂问题方案的负担和精力；它可以被扩展以进行内部的定制化；并且有强大的用户社区来支持它。框架通常能很好的解决一个问题。然而，你的应用是分层的，可能每一个层都需要各自的框架。仅仅解决UI问题并不意味着你能够很好的将业务逻辑和持久性逻辑和UI 组件很好的耦合。例如，你不应该使具有JDBC代码的业务逻辑放入控制器之中，这不是控制器应该提供的功能。一个UI 控制器应该是轻量化的组件，由它代表对UI范围之外的其它应用层的服务调用。良好的框架自然地形成代码分离的原则。更为重要的是，框架减轻了开发人员从头构建持久层代码的精力，从而集中精力来应用逻辑上，这对客户端来说更为重要。</P>
<P>本文讨论了如何结合几个著名的框架来达到松散耦合，如何设计你的架构，以及如何达到各个层次的一致性设计。面临的挑战是，将框架整合起来，以使每一层都向另外的层次以一种松散的方式来暴露接口，而不管底层功能使用的是什么技术。本文还讨论整合3种著名开源框架的一种策略。对表现层，我们使用<A href="http://jakarta.apache.org/struts">Struts</A>；业务层使用<A href="http://www.springframework.org/">Spring</A>；对于持久层我们使用的是<A href="http://www.hibernate.org/">Hibernate</A>。你尽可以取代这里的某个框架而使用你喜欢的框架已达到同样的效果。图1显示了框架被整合起来时，从最高层次看到的视图。<BR><BR><IMG height=193 alt=clip_image001_0007.gif src="http://www.blogjava.net/images/blogjava_net/steelhand/clip_image001_0007.gif" width=450 border=0><BR></P>
<P align=left><BR>&nbsp;</P>
<P align=left><STRONG>应用层</STRONG><STRONG></STRONG></P>
<P>许多设计良好的web 应用，可以被按职责分为四层。这些层次是表现层、持久层、业务层、和领域模型层。每一个层次都有其独特的职责，不能把各自的功能与其它层次相混合。每一个应用层都应该和其它层隔离开来，但允许使用接口在层间进行通信。我们开始来看看每个层，并讨论一下它们各自都应该提供什么和不应该提供什么。</P>
<P align=left><STRONG>表现层</STRONG><STRONG></STRONG></P>
<P>一个典型的web 应用的末端是表现层。许多Java 开发者都知道Struts 提供了什么东西。然而，太多时候，耦合代码比如业务逻辑被放进org.apache.struts.Action中。所以，我们先总结一下Struts 之类的框架应该提供什么。下面就是Struts 的职责所在：</P>
<UL>
<LI>管理用户的请求和响应</LI>
<LI>提供一个控制起来将调用委托到业务逻辑和其他上游处理</LI>
<LI>将来自于抛出例外的其他层的例外处理到Struts Action 中</LI>
<LI>组装可以在视图中表现的模型对象</LI>
<LI>执行UI 校验</LI></UL>
<P>下面是一些经常可以使用Struts进行编码但是不应该和表现层关联的事情：</P>
<UL>
<LI>直接和数据库交互，比如JDBC 调用</LI>
<LI>与应用相关的业务逻辑和校验</LI>
<LI>事务管理</LI></UL>
<P>在表现层中引入这些类型的代码将导致类型耦合和维护负担。</P>
<P align=left><STRONG>持久层</STRONG><STRONG></STRONG></P>
<P>一个典型Web应用的另一端是持久层。这也是应用中最容易很快失控的地方。开发者通常低估了自己构建自己的持久层框架的挑战。一个定制的，内部开发的持久层不仅需要大量的开发时间，并且通常缺乏功能和难以管理。目前有许多解决这些问题的开源对象关系映射 (ORM) 框架。特别地， Hibernate 框架就允许Java中的对象-关系的持久性和查询服务。Hibernate 对已经熟悉了SQL 和JDBC API 的Java开发者来或具有中度的学习曲线。Hibernate 的持久对象基于POJO和Java 群集（collections）。此外，使用Hibernate 不和你的IDE接口。下面列出了你需要在持久性框架中编写的代码类型：</P>
<UL>
<LI>查询关系信息到对象中。Hibernate 是通过称为HQL的OO查询语言，或者使用更有表现能力的规则API，来完成这个工作的。除了使用对象而不是表，使用字段而不是列的方式，HQL非常类似于 SQL。也有一些新的特定的HQL 语言特征需要学习；但是，它们是很容易理解和良好编写的。HQL 是一种用于查询对象的自然语言，而对象，只需要很少的学习曲线吧。.</LI>
<LI>存储、更新和删除存储在数据库中的信息</LI>
<LI>高级的对象关系映射框架比如Hibernate支持大部分主流SQL数据库，它们支持父/子关系，事务，继承和多态。</LI></UL>
<P>下面是应该在持久层避免的一些事情：</P>
<UL>
<LI>业务逻辑应该置于应用的更高层中。这里只允许数据访问方法。</LI>
<LI>不应该使持久逻辑和表现逻辑耦合。避免表现组件如JSP或者基于servlet的类中的逻辑直接和数据访问进行通信。通过将持久性逻辑隔离在其自己的层中，应用将具有更加灵活的修改性而不影响到其他层的代码。例如， Hibernate 可以使用其他持久框架和API代替，而不需要修改其它层中的代码。</LI></UL>
<P align=left><STRONG>业务层</STRONG><STRONG></STRONG></P>
<P>典型的Web应用的中间组件一般是业务层和服务层。从编程的角度来说，service layer经常被忽略。这种类型的代码散布于UI表现层和持久层并不是不多见。这些都不是正确的地方因为它导致了紧密耦合的应用和难以维护的代码。幸运的是，大多数框架都解决了这个问题。这个空间内最流行的两个框架是Spring 和PicoContainer。它们都被视为是具有非常小的足迹（footprint）并且决定如何将你的对象整合在一起的微容器（microcontainer）。这些框架都建立在一种叫做依赖性注入（dependency injection） (也称控制反转（inversion of control：IOC）)的简单概念之上。我们将关注Spring中通过针对命名配置参数的bean属性的setter 注入的使用。Spring 也允许一种更加高级的构造器注入（constructor injection）形式作为setter injection 的可选替代。对象通过简单的XML 文件进行连接，该配置文件包含对各种对象的引用，比如事务管理处理器（transaction management handler）,对象工厂，包含业务逻辑的服务对象，以及数据访问对象(DAO)。</P>
<P>我们随后会用一些例子来澄清Spring中使用这些改变的方式。</P>
<P>业务层应该负责下面的问题：</P>
<UL>
<LI>处理应用的业务逻辑和业务校验</LI>
<LI>管理事务</LI>
<LI>允许与其他层进行交互的接口</LI>
<LI>管理业务级对象之间的依赖性</LI>
<LI>加入了表现和持久层之间的灵活性，以便它们不需要彼此进行直接通信</LI>
<LI>从表现层暴露上下文给业务层以获得业务服务</LI>
<LI>管理从业务层到表现层的实现</LI></UL>
<P align=left><STRONG>领域模型层</STRONG><STRONG></STRONG></P>
<P align=left>最后，因为我们要解决实际的问题的web应用，我们需要一套在不同的层间移动的对象。领域模型层包含的是表达实际业务对象的对象，比如Order, OrderLineItem, Product 等等。这一层允许能让开发者不再构建和维护不必要的数据传输对象DTO来匹配其领域对象。例如， Hibernate允许你读取数据库信息到一个领域对象的对象图中，以便你可以在离线的情况下将其表现在UI层中。这些对象可以被更新并跨过表现层发送回去，然后进行数据库更新。另外，你不再需要将对象转变成DTO，因为它们在不同的层间移动时可能会丢失事务。这种模型允许Java 开发者能够以OO风格的方式很自然的处理对象，而不用编写额外的代码。</P>
<P align=left><STRONG>整合一个简单的例子</STRONG><STRONG></STRONG></P>
<P>到此，应该对各种层次和组件有一个高层的理解了罢。可以开始一些实践了。再次说明。我们的例子整合了Struts, Spring, 和Hibernate 框架。每个框架都包含大量的内容细节，我们不会多述。我们的目的使用一个例子向你说明如何将它们整合在一起构建一个优雅的Web应用架构。实例将演示一个请求是如何得到各层的服务的。此应用的用户可以将一个订单保存在数据库中并且察看数据中的已有订单。进一步的增强允许将用户更新和删除现有订单。</P>
<P>首先，我们将常见我们的领域对象，因为它们是要和各层沟通的。这些对象将允许我们能够定义那些对象需要持久化，那些业务逻辑需要提供，以及应该设计那些表现接口。接下来，我们将使用Hibernate 来为领域对象配置持久层和定义对象关系映射。然后，我们将定义和配置我们的业务层。在完成这些组件后，我们将讨论如何使用Spring将这些层关联起来。最后，我们将提供一个表现层，它知道如何与业务服务层通信以及如何处理来自于其他层的例外。</P><img src ="http://www.blogjava.net/SteelHand/aggbug/3934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SteelHand/" target="_blank">铁手</a> 2005-04-29 11:42 <a href="http://www.blogjava.net/SteelHand/archive/2005/04/29/3934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>