JAX-RPC vs JAX-WS(二):用JAX-WS 2.0實現高性能的Web服務

    面向服務的架構(SOA)能夠使多個遺留系統或者是新的軟件產品作爲一個服務,對外通過Internet連接整合起來,實現服務與服務的相互通訊。Web服務技術是SOA實現的一個基礎,它包含了不同的業務實體之間的複雜事務處理。XML 處理,作爲Web服務技術的核心組件,包括有SOAP處理(processing),XML綁定(binding),還有XML解析。對於想要獲得更好的性能的Web服務來說,理解WSDL(Web Services Description Language)的各種特點是很重要的。
   這篇文章展示了怎樣使用 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可以被部署在GlassFishTomcat. 這個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中的圖表暗示了當不強調綁定層時所有的基本類型都表現出了同樣的性能。
 
(未完待續)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章