面向服务的架构(SOA)能够使多个遗留系统或者是新的软件产品作为一个服务,对外通过Internet连接整合起来,实现服务与服务的相互通讯。Web服务技术是SOA实现的一个基础,它包含了不同的业务实体之间的复杂事务处理。XML 处理,作为Web服务技术的核心组件,包括有SOAP处理(processing),XML绑定(binding),还有XML解析。对于想要获得更好的性能的Web服务来说,理解WSDL(
Web Services Description Language)的各种特点是很重要的。
图 4中的图表表示了XSD基本类型的性能对比。X轴指示的是XSD基本类型,比如说boolean,short,等等。Y轴指示了吞吐量,每秒钟的处理事务。
(未完待续)
这篇文章展示了怎样使用
Java API for XML Web Services (JAX-WS) 2.0 来实现高性能的Web服务,并且提供了和
Java API for XML-Based RPC (JAX-RPC) 1.1
在一些特性及性能上的比较。这篇文章的中的性能数据将会帮助你设计一个高性能的Web服务。
Web Services Stack Overview
Sun的Web服务的最初实现叫做JAX-RPC 1.1(JSR 101)。这是一个基于标准的实现,但是绑定及解析层在底层上的实现也是私有的。另外,JAX-RPC 1.1没有完全包含schema规范。
Sun的Web服务堆栈的最新版本,JAX-WS 2.0(JSR 224),完全是基于标准的。甚至是绑定层,JAXB(JSR 222,
Java Architecture for XML Binding),还有解析层(
parsing layer),StAX(JSR 173,
Streaming API for XML)都是基于标准的并且也100%支持schema规范。
图
1
: web
服务堆栈
图1代表了JAX-RPC和JAX-WS实现。JAX-WS的优点是减轻了开发的任务并且拥有了高的性能。因为JAXB跟StAX性能上的改善,JAX-WS堆栈的性能也随着提升了。由于这种原因,JAX-WS堆栈被称为是集成堆栈(
integrated stack)。
Web Services Performance
理解Web服务的性能是很重要的,因为它允许了开发人员为了性能及可测量性(
performance and scalability.)设计并实现有效率的企业级Web服务。你可以用两种方式来测量Web服务的性能,这取决于你的开发模型:
端对端性能(
end-to-end performance
)和端点性能(
endpoint performance
)。
end-to-end performance
如果一个Web服务开发包括了客户端和服务器端的堆栈,那么性能测试上的测量将包括两个组件。这需要一个胖客户端,它测试了客户端的Web服务堆栈。图 2说明了端对端的性能,在这里客户端驱动使用了一个胖客户端Web服务堆栈来发送和接受SOAP请求。
图
2
:
在端对端性能上,
一个客户端驱动程序使用了一个胖客户端
Web
服务堆栈来发送和接受
SOAP
请求
Endpoint performance
在这种情况下,唯一的关注点是端点(endpoint),也就是服务器端的性能。对于这样测量来说,你可以使用一个由HTTP驱动的瘦客户端。图 3说明了端点性能,在这里客户端使用了薄的HTTP驱动来发送和接收SOAP请求。
图
3
:
在端点性能上,
客户端使用了薄的
HTTP
驱动来发送和接收
SOAP
请求
。
这篇文章关注的性能数据是针对端对端性能的,只是附带说明了一下端点性能。
The WSTest Benchmark
这篇文章使用WSTest benchmark来测量JAX-RPC和JAX-WS性能。WSTest是一个SUN公司开发的小型的benchmark (https://wstest.dev.java.net/),用来测量基于Java技术的Web服务堆栈。WSTest被设计来模仿现实世界的Web服务处理。典型地,任何一个Web服务应用程序需要一个容器来运行。WSTest可以被部署在
GlassFish或
Tomcat. 这个benchmark 具有很高的可配置性来满足现实世界的模仿的需要,比如说很多的客户端,还有测试用例,混合web服务处理的百分比(比如说你想要一个特殊的用例被运行的时间的百分比),等等。
Performance Measurements
这个部分讨论简单类型性能,简单数组性能,有效载荷性能和在web服务中的绑定性能。
简单类型比如说int,short,long,float和其它的为实现一个有效的web服务奠定了最基础的构建块。任何复杂的业务结构最终都要涉及到单独的基本类型的组成。这部分比较了各种简单类型的性能上的比较,为选择一个合适的服务栈给你提供一些信息。
考虑下面
WSDL Sample 1.所示的WSDL例子
WSDL Sample 1
<xsd:element type="xsd:int" name="echoInt" />
<xsd:element type="xsd:int" name="echoIntResponse" />
...
<message name="echoIntSoapIn">
<part name="params" element="types:echoInt" />
</message>
<message name="echoIntSoapOut">
<part name="result" element="types:echoIntResponse" />
</message>
|
WSDL Sample 1展示了整数类型在客户和服务器端的来回回显。Code Sample 1显示了对应的web服务实现代码。
Code Sample 1
public int echoInt(int params)
{
return params;
}
|
同样地,在WSDL中改变不同的基本类型会产生相应的web服务实现代码。表1比较了基于JAX-RPC1.1和JAX-WS 2.0,使用用Java技术的基本类型以及在WSDL中定义的对应的XSD基本类型:
表1
XSD Type
|
JAX-RPC 1.1
|
JAX-WS 2.0
|
| ||
xsd:boolean
|
boolean
|
boolean
|
xsd:short
|
short
|
short
|
xsd:int
|
int
|
int
|
xsd:long
|
long
|
long
|
xsd:integer
|
BigInteger
|
BigInteger
|
xsd:float
|
float
|
float
|
xsd:double
|
double
|
double
|
xsd:decimal
|
BigDecimal
|
BigDecimal
|
xsd:date
|
Java.util.calendar
|
Javax.xml.datatype.XMLGregorianCalendar
|
xsd:time
|
Java.util.calendar
|
Javax.xml.datatype.XMLGregorianCalendar
|
xsd:datetime
|
Java.util.calendar
|
Javax.xml.datatype.XMLGregorianCalendar
|
|
图 4中的图表表示了XSD基本类型的性能对比。X轴指示的是XSD基本类型,比如说boolean,short,等等。Y轴指示了吞吐量,每秒钟的处理事务。
图
4
: XSD
基本类型性能
注意当选择boolean,short,int,long,integer;float,double,decimal或者date,time,datetime类型时在性能上都差不多。但是scale/precision set――比如说对于float,double,还有decimal的小数点后位数的个数能够影响序列化,反序列化,还有有效载荷的代价,所有的这些会对性能有直接的影响。同样地,最好是使用xsd:decimal/BigDecimal类型来避免为完成所有的金钱计算的数值。(Also, it is best to use the xsd:decimal/BigDecimal type to avoid rounding off decimal values for all monetary calculations.)
图 4中的图表暗示了当不强调绑定层时所有的基本类型都表现出了同样的性能。