一、
關於SOA(面向服務架構)思想
1、關於協議

2、
SOA 的誕生
SOA(Service-Oriented Architecture)面向服務架構是一種思想,它將應用程序的不同功能單元通過中立的契約(獨立於硬件平台、操作系統和編程語言)聯系起來,使得各種形式的功能單元更好的集成。目前來說,WebService 是SOA 的一種較好的實現方WebService 采用HTTP 作為傳輸協議,SOAP(Simple Object Access Protocol)作為傳輸消息的格式。但WebService 並不是完全符合SOA 的概念,因為SOAP 協議是WebService 的特有協議,並未符合SOA 的傳輸協議透明化的要求。SOAP 是一種應用協議,早期應用於RPC 的實現,傳輸協議可以依賴於HTTP、SMTP 等。SOA 的產生共經歷了如下過程:

通常采用SOA 的系統叫做服務總線(BUS),結構如下圖所示:


二、JAVA 三種WebService 規范,分別是JAXM&SAAJ、JAX-WS(JAX-RPC)、JAX-RS。
(1.)JAX-WS:
JAX-WS(Java API For XML-WebService),JDK1.6 自帶的版本為JAX-WS2.1,其底層支持為JAXB。早期的基於SOAP 的JAVA 的Web 服務規范JAX-RPC(Java API For
XML-Remote Procedure Call)目前已經被JAX-WS 規范取代,JAX-WS 是JAX-RPC 的演進版本,但JAX-WS 並不完全向后兼容JAX-RPC,二者最大的區別就是RPC/encoded 樣式的WSDL,JAX-WS 已經不提供這種支持。JAX-RPC 的API 從JAVA EE5 開始已經移除,如果你使用J2EE1.4,其API 位於javax.xml.rpc.*包。JAX-WS(JSR 224)規范的API 位於javax.xml.ws.*包,其中大部分都是注解,提供API 操作Web 服務(通常在客戶端使用的較多,由於客戶端可以借助SDK 生成,因此這個包中的API 我們較少會直接使用)。WS-MetaData(JSR 181)是JAX-WS 的依賴規范,其API 位於javax.jws.*包,使用注解配置公開的Web 服務的相關信息和配置SOAP 消息的相關信息。
(2.)JAXM&SAAJ:
JAXM(JAVA API For XML Message)主要定義了包含了發送和接收消息所需的API,相當於Web 服務的服務器端,其API 位於javax.messaging.*包,它是JAVA EE 的可選包,因此你需要單獨下載。SAAJ(SOAP With Attachment API For Java,JSR 67)是與JAXM 搭配使用的API,為構建SOAP 包和解析SOAP 包提供了重要的支持,支持附件傳輸,它在服務器端、客戶端都需要使用。這里還要提到的是SAAJ 規范,其API 位於javax.xml.soap.*包。JAXM&SAAJ 與JAX-WS 都是基於SOAP 的Web 服務,相比之下JAXM&SAAJ 暴漏了SOAP更多的底層細節,編碼比較麻煩,而JAX-WS 更加抽象,隱藏了更多的細節,更加面向對象,實現起來你基本上不需要關心SOAP 的任何細節。那么如果你想控制SOAP 消息的更多細節,可以使用JAXM&SAAJ,2012年版本為1.3。
(3.)JAX-RS:
JAX-RS 是JAVA 針對REST(Representation State Transfer)風格制定的一套Web 服務規范,由於推出的較晚,該規范(JSR 311,目前JAX-RS 的版本為1.0)並未隨JDK1.6 一起發行,你需要到JCP 上單獨下載JAX-RS 規范的接口,其API 位於javax.ws.rs.*包。
這里的JAX-WS 和JAX-RS 規范我們采用Apache CXF 作為實現,CXF 是Objectweb Celtix和Codehaus XFire 合並而成。CXF 的核心是org.apache.cxf.Bus(總線),類似於Spring 的ApplicationContext,Bus 由BusFactory 創建,默認是SpringBusFactory 類,可見默認CXF是依賴於Spring 的,Bus 都有一個ID,默認的BUS 的ID 是cxf。你要注意的是Apache CXF2.2 的發行包中的jar 你如果直接全部放到lib 目錄,那么你必須使用JDK1.6,否則會報JAX-WS 版本不一致的問題。對於JAXM&SAAJ 規范我們采用JDK 中自帶的默認實現。
三、幾種Web Service框架的基本概念介紹
1、JWS
JWS是Java語言對WebService服務的一種實現,用來開發和發布服務。而從服務本身的角度來看JWS服務是沒有語言界限的。但是Java語言為Java開發者提供便捷發布和調用WebService服務的一種途徑。
2、Axis2
Axis2是Apache下的一個重量級WebService框架,准確說它是一個Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和發布WebService,而且可以生成Java和其他語言版WebService客戶端和服務端代碼。這是它的優勢所在。但是,這也不可避免的導致了Axis2的復雜性,使用過的開發者都知道,它所依賴的包數量和大小都是很驚人的,打包部署發布都比較麻煩,不能很好的與現有應用整合為一體。但是如果你要開發Java之外別的語言客戶端,Axis2提供的豐富工具將是你不二的選擇。
Axis2的開發方式類似一個小型的應用服務器,Axis2的開發包要以WAR的形式部署到Servlet容器中,比如Tomcat,通過這些容器可以對工作中的Web Service進行很好的監控和管理。Axis2的Web administrion模塊可以讓我們動態的配置Axis2.一個新的服務可以上載,激活,使之失效,修改web服務的參數。管理UI也可以管理一個或者多個處於運行狀態的服務。這種界面化管理方式的一個弊端是所有在運行時修改的參數沒有辦法保存,因為在重啟動之后,你所做的修改就會全部失效。Axis2允許自己作為獨立的應用來發布Web Service,並提供了大量的功能和一個很好的模型,這個模型可以通過它本身的架構(modular architecture)不斷添加新的功能。有些開發人員認為這種方式對於他們的需求太過於繁瑣,從而會更喜歡CXF。
3、XFire
XFire是一個高性能的WebService框架,在Java6之前,它的知名度甚至超過了Apache的Axis2,XFire的優點是開發方便,與現有的Web整合很好,可以融為一體,並且開發也很方便。但是對Java之外的語言,沒有提供相關的代碼工具。XFire后來被Apache收購了,原因是它太優秀了,收購后,隨着Java6 JWS的興起,開源的WebService引擎已經不再被看好,漸漸的都敗落了。
4、CXF
Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire。CXF 繼承了 Celtix 和 XFire 兩大開源項目的精華,提供了對 JAX-WS 全面的支持,並且提供了多種 Binding 、DataBinding、Transport 以及各種 Format 的支持,並且可以根據實際項目的需要,采用代碼優先(Code First)或者 WSDL 優先(WSDL First)來輕松地實現 Web Services 的發布和使用。Apache CXF已經是一個正式的Apache頂級項目。CXF支持多種協議,如:SOAP、XML/HTTP、RESTful HTTP 、 CORBA ,並且可以在多種傳輸協議上運行,比如:HTTP、JMS 、 JBI。CXF可以與Spring進行無縫集成。
CXF 框架是一種基於 Servlet 技術的 SOA 應用開發框架,要正常運行基於 CXF 應用框架開發的企業應用,除了 CXF 框架本身之外,還需要 JDK 和 Servlet 容器的支持。CXF不但是一個優秀的Web Services / SOAP / WSDL 引擎,也是一個不錯的ESB總線,為SOA的實施提供了一種選擇方案,當然他不是最好的,它僅僅實現了SOA架構的一部分。CXF更注重開發人員的工效(ergonomics)和嵌入能力(embeddability)。大多數都可以通過配置API來完成,替代了比較繁瑣的XML配置文件, Spring的集成性經常的被提及,CXF支持Spring2.0和CXF's API和Spring的配置文件可以非常好的對應。
注:對於Axis2與CXF之間的關系,一個是Axis2出現的時間較早,而CXF的追趕速度快。
以上幾種框架的總結:
a:目前開發Web Service的幾個框架,分別為Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,這是Java6發布所提供的對Web Service服務的一種實現。)
b:Axis與XFire已隨着技術不斷的更替慢慢落幕,都已不再更新。
c:以axis2與cxf所最為常用,目前也只有axis2和cxf官方有更新。
d:從
使用場景來說,
如果你需要多語言的支持,你應該選擇AXIS2。如果你需要把你的實現側重JAVA並希望和Spring集成,CXF就是更好的選擇。