虽然可以使用使用不同技术建立基于 XML 的 Web 服务,但我发现多数开发人员更愿意从服务的 Web Services Description Language (WSDL) 定义开始。Java 应用程序服务器提供了输入 WSDL定义和生成代理类的工具。代理器接收 SOAP 请求并把请求转发给 Java 对象或 EnterPRise Java Bean (EJB) 进行处理。SOAP 绑定(代理器)是一种 Java 类,可通过 servlet 接口调用它。图 2. Java 方法调用
图 2 说明了 Web 服务消费者如何向服务发出 SOAP 请求。SOAP 绑定对 SOAP 消息体中的 XML 内容进行反序列化。这个过程需要进行大量的处理,非常复杂,因为消息体经常包含复杂的数据类型。比如,消费者可能向服务发送包含多个值的散列表。SOAP 绑定需要解码散列表的内容,对每个值创建 Java 对象的实例。散列表还可能包含其他散列表,因此解码 SOAP 消息内容不是一件轻易的事。假如不相信的话,请看一看 Apache Axis 反序列化器的源代码。SOAP 绑定实例化包含 SOAP 消息体内容的 Java Request 对象。SOAP 绑定调用目标类中的目标方法,并将 Request 对象作为参数传递。目标 EJB 或 Java 对象提供所有必要的处理来建立对请求的响应。SOAP 绑定将 EJB 或 Java 对象返回的值序列化到 SOAP 响应消息中。SOAP 绑定将响应对象中的值解码成能够序列化到 SOAP 响应消息中的值需要经过同样复杂的过程。通过研究用流行的 Java 应用程序服务器工具创建的 SOAP 绑定,我发现了以下问题:
不仅仅是一个服务的性能问题,每个服务在序列化、反序列化请求和响应的时候都会增加同样的开销。随着服务调用层次的增加,性能问题也成倍增加。加快 SOA 失去的机会除了 SOAP 绑定代理速度慢的问题,SOA 设计还经常忽略或者忽视另外两个问题。首先,SOA 设计经常忽视了用中间层服务缓冲来提高 SOA 性能的可能性。比如多数 SOA 设计中的 XML 模式都定义了了响应的 time-to-live 值。在这种情况下,缓冲服务响应并在服务再次收到同样的请求时重新使用缓冲的响应是一种提高 SOA 服务性能的合理而适当的方法。其次,在 SOA 性能测试中,我尝试了各种不同的 XML 消息解析方法,其中包括 Streaming API for XML (StAX)、XML 绑定编译器、Java Architecture for XML Binding (JAXB) 和 Document Object Model (DOM) 技术。一些技术的性能要优于另一些。比如,很多 StAX 解析器能够提供比 DOM 解析器快 2 到 10 倍的性能。我怀疑假如使用其他东西而不是 Java 对象来提供 SOAP 绑定是否能够改进性能。比如,假如收到的 SOAP 请求在本机 XML 环境中处理,那么基于 Java 的 SOAP 绑定就不再是必需的了,同时还可以避免因为序列化成 Java 对象而导致的性能降低。此外,一些本机 XML 环境使用 Java Virtual Machine 环境,但会避免构造 Java 对象。比如,Raining Data 的 TigerLogic XDMS 和 Kawa/Qexo 通过将 XQuery 查询直接转换成 Java 字节码来实现 XML 处理代码。这样做是因为与使用 Java 对象相比,使用 XQuery 字节码实现的 XML 处理代码的吞吐量更大,代码更短。FastSOA 解决方案FastSOA 是解决这些问题的一种体系结构和软件编码实践:
FastSOA 体系结构与现有的基于 Web 的基础结构结合在一起,作为中间层缓冲部署来接收服务消费者的请求。比如,一个消费者向服务发出 SOAP 请求。中间层缓冲提供 SOAP 绑定(代理)。绑定调用 XQuery 在 XQuery 引擎处理 XML 请求文档。XQuery 检查缓冲,查看以前是否收到该请求;在这种情况下,FastSOA 服务可以从缓冲中返回响应,不需要逆流而上再请求服务。该过程通过缓冲加快 SOA 执行从而实现了 SOA 提速。FastSOA 方法的优点包括:新闻热点
疑难解答