代理服务
如图2所示,代理服务消除了第一种架构的所有缺陷,但是它也有自己的不足之处。它导致出现了一个系统单点故障。当然,Web服务器可以作为带有硬件负载平衡器的集群的一部分。这无疑可以解决这个问题。
图 2. 代理服务架构
尽管这种架构比起以浏览器为中心的架构已经有了巨大的改进,还可以做得更好。我们已经为Web开发人员提供了一个非常好的环境,但是这很可能为后端系统开发人员带来不便。对远程系统进行身份验证以及数据整理仍然是必要的,但是至少后端程序员应该有更多可使用的工具来迎接挑战。
企业服务总线
图3与前面的两幅图又有所不同,因为企业服务总线(ESB)架构是一种逻辑架构。服务可以位于网络上的任意位置,数据源可以被抽象到(可插入到ESB中的)服务中。ESB为后端系统开发人员处理了他们通常必须做的工作,比如服务身份验证、数据转换、协议转换和可靠性特征。ESB可以扩展到带有硬件负载平衡器的计算机集群上,这提供了代理服务架构所具有的优点。
图 3.企业服务总线
为了说明在门户中对Ajax应用程序使用ESB的优点,考虑对于每次Ajax调用都要引用一个Web服务的情况。对于小型门户来说,Web服务的数量可能相对较少,譬如说几十个。但是随着门户的增长,将会引入更多的Web服务。大量Web服务的添加与Ajax没有关系,但是与SOA的实现有着密切的联系。这是一个ESB的经典用例。尽管从严格意义上来说,它对于Ajax实现的操作不是必要的,但是它还是带来了几个好处:
ESB消除了对ProxyServlet类(稍后将会介绍)的需求,因为代理服务更好地完成了同样的工作。
ESB支持监控和管理单个Web服务,同时无需在每个Web服务中增加额外的代码。这包括监控服务水平协议(SLA)和报告违反情况。
ESB可以保护Ajax代码不会被外部提供者修改。如果外部提供者以一种无需修改门户用户界面但需要修改Ajax调用代码的方式修改了 WSDL,那么就有可能在ESB的代理服务中修改配置,而不用修改Ajax代码。为什么这样做比修改Ajax代码更好呢?我认为,在ESB中代理服务的配置中进行小的改动比起在JavaScript中对每个到相关服务的引用进行修改更不容易出错。此外,对于同样的信息(比如股票报价查询)还可以使用多个外部提供者,但是每个提供者具有不同的调用接口并返回XML。如果某个提供者出现故障或者只是为了进行负载平衡,使用多个提供者就很有利了。在ESB中可以轻松实现这一点,但是在JavaScript中这几乎是不可能的。
在这里的例子中,我之所以使用了以浏览器为中心的架构和代理服务架构,是因为作为例子来说,它们比较简单,但是我希望能够使您相信,Ajax是体现ESB优点的非常不错的方式。
对门户使用的影响
当在门户内采用Ajax编程方法时,出现了几个问题。这些问题中的大多数与门户的生命周期以及如何/何时挑选用户信息有关。具体来说,门户要使用诸如用户在哪里单击之类的信息来决定向其显示何种类型的相关信息。WebLogic Portal具有一种叫做campaign的特性,它允许门户设计人员基于用户个人信息指定对用户的有目的广告宣传。用户个人信息中包括用户的页面历史,即,用户过去点击过的页面。门户在页面刷新时收集这类信息,所以如果用户从未刷新页面,门户就无法(容易地)自动收集用户信息。
考虑Ajax编程可能对门户产生的以下副作用:
不可跟踪性使campaign得不到有效使用(参见上面的内容)。
页面刷新重置了DOM树,所以当用户最终刷新页面时,所有对使用Ajax修改过的portlet的更新都会丢失。对portlet内容的修改将会丢失,还原为初始的页面状态。
JSP中的所有JavaScript都是整个页面共用的。考虑一个包含在每个portlet中的JavaScript片断。当呈现最终的HTML页面时,JavaScript片断将在包含它的每个portlet中重复使用。类似地,如果已经将两个portlet嵌入了 JavaScript,而且每个portlet的脚本都有一个名为getData()的方法,那么最终的HTML页面将会有两个不同的getData() 函数定义。调用该函数时很可能导致调用不正确的方法。如果有两个名为isOK()的变量,也会出现同样的情况。
使用适当的编码风格可以防止这些问题的发生,比如给所有变量和函数取独有的名称,或者使用cookies来保存portlet中使用的当前数据。
一种非常好的实践是在所有脚本中使用独有的变量和函数名称,具体做法是在每个变量和函数的名称前加上包含它们的portlet的名称。
浏览器战争尚未结束,专有浏览器和基于标准的浏览器之间的战争仍在延续。Ajax相当有趣的一点是,其中有一半是标准(XHTML、XSLT、 JavaScript/ECMAScript、DOM和Web services)驱动的。但是其核心技术——XmlHttpRequest对象——来自微软。
下面列出了在进行跨浏览器的Ajax编程时要注意的一些重要的常见错误,以及如何避免这些陷阱。