接觸webservice也有一段時間了,為了查缺補(bǔ)漏,把知識點(diǎn)系統(tǒng)化,準(zhǔn)備寫幾篇博文梳理下webservice的知識點(diǎn),這是第一篇,對webservice進(jìn)行大致的介紹。

1.什么是webservice

1.1什么是服務(wù)(service)

計(jì)算機(jī)的服務(wù)一般指的就是計(jì)算機(jī)能提供的某一功能,比如qq能提供聊天服務(wù),殺毒軟件能提供殺毒服務(wù)。而通常情況我們把服務(wù)分為兩大類,分別是本地服務(wù)(本地提供,不需要通過網(wǎng)絡(luò)獲取)和網(wǎng)絡(luò)服務(wù)(即webservice,需要通過網(wǎng)絡(luò)獲?。?/p>

接下來我們簡單比較下這兩種服務(wù)。


本地服務(wù)網(wǎng)絡(luò)服務(wù)
實(shí)現(xiàn)方式利用本地資源實(shí)現(xiàn),需要掌握實(shí)現(xiàn)方式通過網(wǎng)絡(luò)獲取,不需要知道怎么實(shí)現(xiàn)
實(shí)現(xiàn)成本需要自己承當(dāng)人力物力,成本較高只需要遠(yuǎn)程調(diào)用,成本較低
穩(wěn)定性自己實(shí)現(xiàn),自己維護(hù),穩(wěn)定性相對較高,且不依賴互聯(lián)網(wǎng),斷網(wǎng)風(fēng)險小依賴互聯(lián)網(wǎng),服務(wù)出現(xiàn)問題維護(hù)相對較麻煩,但成本不一定高
移植性較差,換個系統(tǒng)要實(shí)現(xiàn)改服務(wù)要重新開發(fā)較好,可以快速移植

圖表的內(nèi)容可能比較抽象,我們不妨舉個例子來體會下。

  • 假設(shè)我們要實(shí)現(xiàn)一個天氣預(yù)報(bào)的服務(wù),如果我們采用本地服務(wù),首先我們得發(fā)送一個氣象衛(wèi)星,然后我們還要能接收并處理衛(wèi)星數(shù)據(jù)的設(shè)備,有了數(shù)據(jù)之后我們有專門的科學(xué)家分析這些數(shù)據(jù),然后通過工程師用圖表的形式展示出來。

  • 如果我們采用網(wǎng)絡(luò)服務(wù),我們只需要調(diào)取氣象中心的接口,就可以得到氣象服務(wù)。

  • 假設(shè)有一天我們發(fā)現(xiàn)調(diào)用的接口傳回的數(shù)據(jù)不對,如果我們是本地服務(wù),我們馬上可以組織人手排查問題,但如果是網(wǎng)絡(luò)服務(wù),我們就得依靠氣象中心來解決問題,而且如果有一天網(wǎng)絡(luò)出現(xiàn)故障,我們也會面臨無法獲取氣象數(shù)據(jù)的問題。

  • 如果某天公司業(yè)務(wù)要拓展,我們需要在一個新環(huán)境下實(shí)現(xiàn)氣象服務(wù),如果是本地服務(wù),我們又得重新去實(shí)現(xiàn)一遍。而如果是網(wǎng)絡(luò)服務(wù),我們只需要把接口重新在新環(huán)境下調(diào)用即可。

因此,我們可以發(fā)現(xiàn),本地服務(wù)的實(shí)現(xiàn)成本會遠(yuǎn)高于網(wǎng)絡(luò)服務(wù)。特別是對于那些非核心的服務(wù),如果我們都要親力親為去自己實(shí)現(xiàn),無疑會增加自己的負(fù)擔(dān)。同時本地服務(wù)的移植性也不如網(wǎng)絡(luò)服務(wù),因此網(wǎng)絡(luò)服務(wù)就成為一個異常重要的發(fā)展方向。

1.2什么是網(wǎng)絡(luò)服務(wù)(webservice)

如上文所說,網(wǎng)絡(luò)服務(wù)(webservice)就是將某一服務(wù)通過互聯(lián)網(wǎng)發(fā)布并被用戶所獲取的某一計(jì)算機(jī)功能。如前面說的氣象服務(wù),比較常見的還有微信公眾號開發(fā)時我們可以調(diào)用的各種接口(如自動回復(fù)、支付、識別發(fā)送的信息類型等接口),騰訊地圖提供的地圖接口,支付寶提供的支付接口等等。這些網(wǎng)絡(luò)服務(wù)加上我們本地的核心功能共同構(gòu)成了一個完整的系統(tǒng)。

如果一個軟件的主要部分采用了"網(wǎng)絡(luò)服務(wù)(webservice)",即它把存儲或計(jì)算環(huán)節(jié)"外包"給其他網(wǎng)站了,那么我們就說這個軟件屬于Web Service架構(gòu)。

Web Service架構(gòu)的基本思想,就是盡量把非核心功能交給其他人去做,自己全力開發(fā)核心功能。

webservice優(yōu)勢

  • 平臺無關(guān)。不管你使用什么平臺,都可以使用Web service。

  • 編程語言無關(guān)。只要遵守相關(guān)協(xié)議,就可以使用任意編程語言,向其他網(wǎng)站要求Web service。這大大增加了web service的適用性,降低了對程序員的要求。`

  • 對于Web service提供者來說,部署、升級和維護(hù)Web service都非常單純,不需要考慮客戶端兼容問題,而且一次性就能完成。

  • 對于Web service使用者來說,可以輕易實(shí)現(xiàn)多種數(shù)據(jù)、多種服務(wù)的聚合(mashup),因此能夠做出一些以前根本無法想像的事情。

2.webservice相關(guān)技術(shù)

2.1webservice的實(shí)現(xiàn)原理

2.1.1概述

廣義上的Web服務(wù)是一個URL資源,客戶端可以通過編程方式請求得到它的服務(wù),而不需要知道所請求的服務(wù)是怎樣實(shí)現(xiàn)的,這一點(diǎn)與傳統(tǒng)的分布式組件對象模型不同。

但是現(xiàn) 在我們說webservice一般是指XML Web Service WebService。它是通過soap在web上提供的軟件服務(wù),用wsdl進(jìn)行描述,并通過uddi進(jìn)行注冊。

  • XML(Extensible Markup Language):擴(kuò)展型可標(biāo)記語言,用于數(shù)據(jù)的傳遞,是soap的基礎(chǔ)。

  • SOAP(Simple Object Access Protocol):全稱簡單對象訪問協(xié)議,是一種基于xml的輕量協(xié)議。當(dāng)用戶通過UDDI找到wsdl描述文件后,可以通過soap調(diào)用服務(wù)的一個或多個操作。SOAP是XML文檔形式的調(diào)用方法的規(guī)范,它可以支持不同的底層接口,像HTTP(S)或者SMTP。

  • WSDL(Web Services Description Language):webservice描述語言,本質(zhì)是一個xml文檔,用于說明soap消息以及如何交換這些消息,一般由軟件自動生成和使用。

  • UDDI(Universal Description, Discovery, and Integration):是一種目錄服務(wù),企業(yè)通過它對webservice進(jìn)行注冊和搜索

2.1.2調(diào)用原理

webservice之所以能夠?qū)崿F(xiàn)跨平臺跨語言之間的調(diào)用,是因?yàn)樗x了一個統(tǒng)一的信息交互和調(diào)用的標(biāo)準(zhǔn)。正如上文所說,webservice的實(shí)現(xiàn)需要依賴幾個重要的技術(shù):XML,soap,wsdl和uddi。

webservice最關(guān)鍵的一環(huán)就是soap,即把數(shù)據(jù)以xml的形式組合起來,然后通過http協(xié)議與遠(yuǎn)程服務(wù)進(jìn)行通信,我們把用xml組合的數(shù)據(jù)格式統(tǒng)一,稱為soap消息,這就成了我們跨平臺跨語言通訊的關(guān)鍵。

當(dāng)然不得不承認(rèn),soap格式的報(bào)文存在嚴(yán)重的冗余,并且依賴定義好的xml schemas,我們?nèi)绻謩觿?chuàng)建soap消息會特別麻煩,需要借助一些工具來簡化一些工作,因此現(xiàn)在很多webservice的開法越來越趨向于restful風(fēng)格的webservice。

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

如圖所示,一個完整的webservice過程可以概括為以下步驟:

  1. web服務(wù)提供者開發(fā)完成服務(wù)后通過web服務(wù)中介者發(fā)布服務(wù),并通過服務(wù)注冊中心(一般為UDDI)注冊(發(fā)布)

  2. web服務(wù)請求根據(jù)自己的需求向web服務(wù)中介者提出請求,web服務(wù)中介者會根據(jù)請求在UDDI注冊中心找到滿足要求的服務(wù)(發(fā)現(xiàn))

  3. web服務(wù)中介者會向web服務(wù)請求者發(fā)布web服務(wù)的描述信息,這些信息一般是通過wsdl寫成的,wsdl可以通過大部分瀏覽器來直接閱讀(發(fā)現(xiàn))

  4. web服務(wù)請求者根據(jù)wsdl信息編寫相應(yīng)的soap消息,然后發(fā)給web服務(wù)提供者,來調(diào)用相應(yīng)的web服務(wù)(綁定)

  5. web服務(wù)提供者會根據(jù)soap消息執(zhí)行相應(yīng)的服務(wù),并把調(diào)用結(jié)果發(fā)送給web服務(wù)請求者(綁定)

2.1.3調(diào)用方法

webservice除了httpsoap調(diào)用,也可以用get和post方法來調(diào)用,但是soap可以傳遞結(jié)構(gòu)化的數(shù)據(jù),而post和get方法不行。

在java web中,我們要調(diào)用webservice,通常是要先利用相應(yīng)框架(如axis2等)生成webservice的對應(yīng)client,然后通過調(diào)用client里面的相關(guān)方法來實(shí)現(xiàn)對webservice的調(diào)用。

2.2webservice相關(guān)框架

webservice一個最大的特點(diǎn)就是與語言無關(guān),所以webservice用什么語言開發(fā)其實(shí)都可以?,F(xiàn)在用的比較多的是c#和java,這里我們主要介紹java關(guān)于webservice的開發(fā)。

java開發(fā)web service的框架常見的有Axis,axis2,Xfire,CXF以及JWS,其中axis2和cxf是目前最為常用的框架。axis2可以看作是一個小型的應(yīng)用服務(wù)器,相對來說會比較重,但是它功能強(qiáng)大,支持多語言,在大型項(xiàng)目被較多地使用。

2.3webservice未來發(fā)展趨勢

  1. 通信協(xié)議會傾向于使用更輕量級的rest,而逐漸減少對RPC和soap的使用

  2. 通過上文的介紹,我們會發(fā)現(xiàn)現(xiàn)在webservice用于描述接口信息的wsdl以及傳遞信息的soap報(bào)文都是基于xml,而這些xml一般都會有比較復(fù)雜的格式定義,未來可能會使用更加輕量級的json來進(jìn)行數(shù)據(jù)交互。

  3. 第三點(diǎn)其實(shí)也是對一條的補(bǔ)充,未來網(wǎng)絡(luò)接口會更傾向于restful風(fēng)格的設(shè)計(jì),更輕量,對服務(wù)的請求不必再在第三方應(yīng)用中中轉(zhuǎn),而是直接在瀏覽器中請求。