Web Service見名之意就是網絡上的一些服務,解決的問題就是如何使用這些服務,由於軟件的開發有各類各樣的語言,利用Java,C#,VB.NET,PHP等等,如何使這些語言編寫的程序可以進行互通,彼此相互利用。Web Service就能夠解決異構系統的通訊的整合。前端
首先看一下,和WebService同樣可以解決異構系統的通訊和整合的方案吧:java
1,經過XML,JSON,字符串進行多語言的通信,由於這些都是規定好的,各個語言中使用都是同樣的。例如JavaScript和Java經過Json進行數據交換,JavaScript利用eval()函數,而Java有jackson,json-lib等類庫來進行幫忙解析。web
2,共享數據庫,這種方式也能實現不一樣系統的通訊,可是對數據庫的保護方面可能不夠好。數據庫
3,共享文件,能夠將文件(通常是xml文件)上傳到均可以訪問到地方(例如:FTP server上)進行共享。apache
4,使用當心中間件,如圖:編程
固然還有CORBA,Web Service比較成熟的技術等等,這些都是解決異構系統的通訊的宏觀方式。因爲不一樣的系統處於不一樣的JVM中,這就須要考慮分佈式架構的解決方案了,看一下核心圖吧,體現了代理模式,這裏還利用了JavaEE的JNDI規範進行對象的查找等:json
因爲Web Service的容易上手和傳輸的格式是xml文本格式(由於此能夠利用dtd,Schema進行規範約束),因此使用比較普遍,下邊看一下Web Service的簡單應用吧。api
Web Service技術獲得了Java的支持,在JDK6之後都給出了相關規範的實現,有兩種方式:瀏覽器
1,JAX-WS(XML web services的Java API)是SOAP方式即:簡單對象訪問協議(SimpleObject Access Protocol),它是用於交換XML(標準通用標記語言下的一個子集)編碼信息的輕量級協議服務器
。 2,JAX-RS(Java API for RESTful Web Services )即restful方式風格。
再看一個概念: WSDL:WebService描述語言WSDL 就是用機器能閱讀的方式提供的一個正式描述文檔而基於XML(標準通用標記語言下的一個子集)的語言,用於描述WebService及其函數、參數和返回值。由於是基於XML的,因此WSDL既是機器可閱讀的,又是人可閱讀的。 下邊是SOAP和WSDL在異步傳輸中的所用:
這裏只看一下第一種SOAP方式,提供的框架技術有CXF,XFire和AXIS。而經常使用的是Axis和CXF,先看一下二者的比較吧:
Axis互通訊比較好,對其餘語言訪問的兼容性比較多;
CXF很是容易的整合到Spring架構中;
看一下CXF如何集成到Spring進行開發服務端吧:
1,加入jar包(夠用的原則):
-cxf-2.5.10.jar
-wsdl4j-1.6.3.jar
-xmlschema-core-2.0.3.jar
-neethi-3.0.2.jar
-geronimo-servlet_2.5_spec-1.1.2.jar
-woodstox-core-asl-4.2.0.jar
-stax2-api-3.1.1.jar
2, 在web.xml中,配置前端控制器CXFServlet攔截Web Service請求:
<servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
3,將CXF提供的缺省配置文件cxf.xml引入到Spring配置文件中:
<import resource="classpath:META-INF/cxf/cxf.xml" />
4,基於CXF規範,採用JAX-WS方式開發北向接口,注意@WebService和@WebParam註解的使用,還有就是實現類的編寫加的註解要指定名稱@Resource(name="userDaoImpl"),其它正常編寫便可:
@WebService public interface WebServiceFacade { public String selectUser(@WebParam(name="userId")String userId); }
5,在配置文件中使用endpoint發佈WebService,這裏須要引入對應的命名空間和約束xsd:
-引入命名空間jaxws xmlns:jaxws="http://cxf.apache.org/jaxws
-加入jaxws命名使用的xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd <jaxws:endpoint id="webServiceFacade" implementor="#webServiceFacadeImpl" //引用IoC中的id address="/WebServiceFacade" />
6,而後啓用服務器,採用瀏覽器就能夠進行訪問了:應用程序根services/WebServiceFacade?wsdl。固然這裏推薦一個測試服務接口的工具,很是好用的SoapUI。若是可以成功返回指定String,那麼服務端就成功了。咱們就能夠經過任何語言的系統,經過此URL爲接口訪問此服務接口了,固然也能夠使用生成的WSDL。
這樣服務段就建好了,可是咱們如何編寫客戶端Client進行調用呢?我用的Java語言,因此WSDL2Java方法這個就很是重要。使用eclipse自動的AXIS插件進行新建:就自動爲咱們生成客戶端的存根,咱們調用這些存根的方法便可完成對目標對象的調用。
或者採用CXF中的wsdl2java.bat進行相關存根的生成,總而言之是利用工具給咱們生成存根,咱們調用便可。這樣,咱們就實現了不一樣語言不一樣程序之間的訪問通訊了。
這也是繼面向對象編程思想又一種較新的編程思想面向服務編程,這樣咱們就不用顧慮語言的差異,提供規範的服務接口,咱們不管使用什麼語言,就均可以訪問使用了,大大提升了程序的複用率。
例如,在咱們的程序中添加天氣預報,火車時刻表,利用銀行進行付帳,利用騰訊QQ,其餘郵箱帳號登錄系統等等,只要提供對應的服務接口咱們就能夠很容易的實現了,固然了,這裏有些接口就須要收費了,可是這種方式無疑大大擴展了程序的邊界,使複用性大大的提升了。算是一種改革吧!
異步系統通訊,Web Service初步總結,還在深刻研究中……