一,、序言 大家或多或少都聽過WebService(Web服務(wù)),有一段時(shí)間很多計(jì)算機(jī)期刊,、書籍和網(wǎng)站都大肆的提及和宣傳WebService技術(shù),,其中不乏很多吹噓和做廣告的成分。但是不得不承認(rèn)的是WebService真的是一門新興和有前途的技術(shù),,那么WebService到底是什么,?何時(shí)應(yīng)該用? 當(dāng)前的應(yīng)用程序開發(fā)逐步的呈現(xiàn)了兩種迥然不同的傾向:一種是基于瀏覽器的瘦客戶端應(yīng)用程序,一種是基于瀏覽器的富客戶端應(yīng)用程序(RIA),,當(dāng)然后一種技術(shù)相對(duì)來說更加的時(shí)髦一些(如現(xiàn)在很流行的Html5技術(shù)),,這里主要講前者。 基于瀏覽器的瘦客戶端應(yīng)用程序并不是因?yàn)槭菘蛻裟軌蛱峁└玫挠脩艚缑?,而是因?yàn)樗軌虮苊饣ㄔ谧烂鎽?yīng)用程序發(fā)布上的高成本,。發(fā)布桌面應(yīng)用程序成本很高,一半是因?yàn)閼?yīng)用程序安裝和配置的問題,,另一半是因?yàn)榭蛻艉头?wù)器之間通信的問題,。傳統(tǒng)的Windows富客戶應(yīng)用程序使用DCOM來與服務(wù)器進(jìn)行通信和調(diào)用遠(yuǎn)程對(duì)象。配置好DCOM使其在一個(gè)大型的網(wǎng)絡(luò)中正常工作將是一個(gè)極富挑戰(zhàn)性的工作,,同時(shí)也是許多IT工程師的噩夢(mèng),。事實(shí)上,許多IT工程師寧愿忍受瀏覽器所帶來的功能限制,,也不愿在局域網(wǎng)上去運(yùn)行一個(gè)DCOM,。關(guān)于客戶端與服務(wù)器的通信問題,一個(gè)完美的解決方法是使用HTTP協(xié)議來通信,。這是因?yàn)槿魏芜\(yùn)行Web瀏覽器的機(jī)器都在使用HTTP協(xié)議,。同時(shí),當(dāng)前許多防火墻也配置為只允許HTTP連接,。許多商用程序還面臨另一個(gè)問題,,那就是與其他程序的互操作性。如果所有的應(yīng)用程序都是使用COM或.NET語言寫的,,并且都運(yùn)行在Windows平臺(tái)上,,那就天下太平了。然而,,事實(shí)上大多數(shù)商業(yè)數(shù)據(jù)仍然在大型主機(jī)上以非關(guān)系文件(VSAM)的形式存放,,并由COBOL語言編寫的大型機(jī)程序訪問。而且,,目前還有很多商用程序繼續(xù)在使用C++,、Java、Visual Basic和其他各種各樣的語言編寫?,F(xiàn)在,,除了最簡(jiǎn)單的程序之外,所有的應(yīng)用程序都需要與運(yùn)行在其他異構(gòu)平臺(tái)上的應(yīng)用程序集成并進(jìn)行數(shù)據(jù)交換,。這樣的任務(wù)通常都是由特殊的方法,,如文件傳輸和分析,消息隊(duì)列,,還有僅適用于某些情況的的API,,如IBM的高級(jí)程序到程序交流(APPC)等來完成的。在以前,沒有一個(gè)應(yīng)用程序通信標(biāo)準(zhǔn),,是獨(dú)立于平臺(tái),、組建模型和編程語言的。只有通過Web Service,,客戶端和服務(wù)器才能夠自由的用HTTP進(jìn)行通信,,不論兩個(gè)程序的平臺(tái)和編程語言是什么。
二,、WebService到底是什么,? 一言以蔽之:WebService是一種跨編程語言和跨操作系統(tǒng)平臺(tái)的遠(yuǎn)程調(diào)用技術(shù)。 所謂跨編程語言和跨操作平臺(tái),,就是說服務(wù)端程序采用java編寫,,客戶端程序則可以采用其他編程語言編寫,反之亦然,!跨操作系統(tǒng)平臺(tái)則是指服務(wù)端程序和客戶端程序可以在不同的操作系統(tǒng)上運(yùn)行,。 所謂遠(yuǎn)程調(diào)用,就是一臺(tái)計(jì)算機(jī)a上的一個(gè)程序可以調(diào)用到另外一臺(tái)計(jì)算機(jī)b上的一個(gè)對(duì)象的方法,,譬如,銀聯(lián)提供給商場(chǎng)的pos刷卡系統(tǒng),,商場(chǎng)的POS機(jī)轉(zhuǎn)賬調(diào)用的轉(zhuǎn)賬方法的代碼其實(shí)是跑在銀行服務(wù)器上,。再比如,amazon,,天氣預(yù)報(bào)系統(tǒng),,淘寶網(wǎng),校內(nèi)網(wǎng),,百度等把自己的系統(tǒng)服務(wù)以webservice服務(wù)的形式暴露出來,,讓第三方網(wǎng)站和程序可以調(diào)用這些服務(wù)功能,這樣擴(kuò)展了自己系統(tǒng)的市場(chǎng)占有率,,往大的概念上吹,,就是所謂的SOA應(yīng)用。 其實(shí)可以從多個(gè)角度來理解WebService,,從表面上看,,WebService就是一個(gè)應(yīng)用程序向外界暴露出一個(gè)能通過Web進(jìn)行調(diào)用的API,也就是說能用編程的方法通過Web來調(diào)用這個(gè)應(yīng)用程序,。我們把調(diào)用這個(gè)WebService的應(yīng)用程序叫做客戶端,,而把提供這個(gè)WebService的應(yīng)用程序叫做服務(wù)端。從深層次看,,WebService是建立可互操作的分布式應(yīng)用程序的新平臺(tái),,是一個(gè)平臺(tái),是一套標(biāo)準(zhǔn)。它定義了應(yīng)用程序如何在Web上實(shí)現(xiàn)互操作性,,你可以用任何你喜歡的語言,,在任何你喜歡的平臺(tái)上寫Web service ,只要我們可以通過Web service標(biāo)準(zhǔn)對(duì)這些服務(wù)進(jìn)行查詢和訪問,。 WebService平臺(tái)需要一套協(xié)議來實(shí)現(xiàn)分布式應(yīng)用程序的創(chuàng)建,。任何平臺(tái)都有它的數(shù)據(jù)表示方法和類型系統(tǒng)。要實(shí)現(xiàn)互操作性,,WebService平臺(tái)必須提供一套標(biāo)準(zhǔn)的類型系統(tǒng),,用于溝通不同平臺(tái)、編程語言和組件模型中的不同類型系統(tǒng),。Web service平臺(tái)必須提供一種標(biāo)準(zhǔn)來描述Web service,,讓客戶可以得到足夠的信息來調(diào)用這個(gè)Web service。最后,,我們還必須有一種方法來對(duì)這個(gè)Web service進(jìn)行遠(yuǎn)程調(diào)用,這種方法實(shí)際是一種遠(yuǎn)程過程調(diào)用協(xié)議(RPC),。為了達(dá)到互操作性,這種RPC協(xié)議還必須與平臺(tái)和編程語言無關(guān),。
三,、WebService平臺(tái)技術(shù) XML+XSD,SOAP和WSDL就是構(gòu)成WebService平臺(tái)的三大技術(shù)。 XML+XSD: WebService采用HTTP協(xié)議傳輸數(shù)據(jù),,采用XML格式封裝數(shù)據(jù)(即XML中說明調(diào)用遠(yuǎn)程服務(wù)對(duì)象的哪個(gè)方法,,傳遞的參數(shù)是什么,以及服務(wù)對(duì)象的返回結(jié)果是什么),。XML是WebService平臺(tái)中表示數(shù)據(jù)的格式,。除了易于建立和易于分析外,XML主要的優(yōu)點(diǎn)在于它既是平臺(tái)無關(guān)的,,又是廠商無關(guān)的,。無關(guān)性是比技術(shù)優(yōu)越性更重要的:軟件廠商是不會(huì)選擇一個(gè)由競(jìng)爭(zhēng)對(duì)手所發(fā)明的技術(shù)的。 XML解決了數(shù)據(jù)表示的問題,,但它沒有定義一套標(biāo)準(zhǔn)的數(shù)據(jù)類型,,更沒有說怎么去擴(kuò)展這套數(shù)據(jù)類型。例如,,整形數(shù)到底代表什么,?16位,32位,,64位,?這些細(xì)節(jié)對(duì)實(shí)現(xiàn)互操作性很重要。XML Schema(XSD)就是專門解決這個(gè)問題的一套標(biāo)準(zhǔn),。它定義了一套標(biāo)準(zhǔn)的數(shù)據(jù)類型,,并給出了一種語言來擴(kuò)展這套數(shù)據(jù)類型,。WebService平臺(tái)就是用XSD來作為其數(shù)據(jù)類型系統(tǒng)的。當(dāng)你用某種語言(如VB.NET或C#)來構(gòu)造一個(gè)Web service時(shí),,為了符合WebService標(biāo)準(zhǔn),,所有你使用的數(shù)據(jù)類型都必須被轉(zhuǎn)換為XSD類型。你用的工具可能已經(jīng)自動(dòng)幫你完成了這個(gè)轉(zhuǎn)換,,但你很可能會(huì)根據(jù)你的需要修改一下轉(zhuǎn)換過程,。 SOAP: WebService通過HTTP協(xié)議發(fā)送請(qǐng)求和接收結(jié)果時(shí),發(fā)送的請(qǐng)求內(nèi)容和結(jié)果內(nèi)容都采用XML格式封裝,,并增加了一些特定的HTTP消息頭,,以說明HTTP消息的內(nèi)容格式,這些特定的HTTP消息頭和XML內(nèi)容格式就是SOAP協(xié)議,。SOAP提供了標(biāo)準(zhǔn)的RPC方法來調(diào)用Web Service,。 SOAP協(xié)議 = HTTP協(xié)議 + XML數(shù)據(jù)格式 SOAP協(xié)議定義了SOAP消息的格式,SOAP協(xié)議是基于HTTP協(xié)議的,,SOAP也是基于XML和XSD的,,XML是SOAP的數(shù)據(jù)編碼方式。打個(gè)比喻:HTTP就是普通公路,,XML就是中間的綠色隔離帶和兩邊的防護(hù)欄,,SOAP就是普通公路經(jīng)過加隔離帶和防護(hù)欄改造過的高速公路。 WSDL: 好比我們?nèi)ド痰曩I東西,,首先要知道商店里有什么東西可買,,然后再來購買,商家的做法就是張貼廣告海報(bào),。 WebService也一樣,WebService客戶端要調(diào)用一個(gè)WebService服務(wù),,首先要有知道這個(gè)服務(wù)的地址在哪,,以及這個(gè)服務(wù)里有什么方法可以調(diào)用,所以,,WebService務(wù)器端首先要通過一個(gè)WSDL文件來說明自己家里有啥服務(wù)可以對(duì)外調(diào)用,,服務(wù)是什么(服務(wù)中有哪些方法,方法接受的參數(shù)是什么,,返回值是什么),,服務(wù)的網(wǎng)絡(luò)地址用哪個(gè)url地址表示,服務(wù)通過什么方式來調(diào)用,。 WSDL(Web Services Description Language)就是這樣一個(gè)基于XML的語言,,用于描述Web Service及其函數(shù)、參數(shù)和返回值,。它是WebService客戶端和服務(wù)器端都能理解的標(biāo)準(zhǔn)格式,。因?yàn)槭腔赬ML的,,所以WSDL既是機(jī)器可閱讀的,又是人可閱讀的,,這將是一個(gè)很大的好處,。一些最新的開發(fā)工具既能根據(jù)你的Web service生成WSDL文檔,又能導(dǎo)入WSDL文檔,,生成調(diào)用相應(yīng)WebService的代理類代碼,。 WSDL文件保存在Web服務(wù)器上,通過一個(gè)url地址就可以訪問到它,??蛻舳艘{(diào)用一個(gè)WebService服務(wù)之前,要知道該服務(wù)的WSDL文件的地址,。WebService服務(wù)提供商可以通過兩種方式來暴露它的WSDL文件地址:1.注冊(cè)到UDDI服務(wù)器,,以便被人查找;2.直接告訴給客戶端調(diào)用者,。
四,、WebService開發(fā) WebService開發(fā)可以分為服務(wù)器端開發(fā)和客戶端開發(fā)兩個(gè)方面: 服務(wù)端開發(fā):把公司內(nèi)部系統(tǒng)的業(yè)務(wù)方法發(fā)布成WebService服務(wù),供遠(yuǎn)程合作單位和個(gè)人調(diào)用,。(借助一些WebService框 架可以很輕松地把自己的業(yè)務(wù)對(duì)象發(fā)布成WebService服務(wù),,Java方面的典型WebService框架包括:axis,xfire,,cxf等,,java ee服務(wù)器通常也支持發(fā)布WebService服務(wù),例如JBoss,。) WebService的工作調(diào)用原理:對(duì)客戶端而言,,我們給這各類WebService客戶端API傳遞wsdl文件的url地址,,這些API就會(huì)創(chuàng)建出底層的代理類,我調(diào)用這些代理,,就可以訪問到webservice服務(wù),。代理類把客戶端的方法調(diào)用變成soap格式的請(qǐng)求數(shù)據(jù)再通過HTTP協(xié)議發(fā)出去,并把接收到的soap數(shù)據(jù)變成返回值返回,。對(duì)服務(wù)端而言,,各類WebService框架的本質(zhì)就是一個(gè)大大的Servlet,,當(dāng)遠(yuǎn)程調(diào)用客戶端給它通過http協(xié)議發(fā)送過來soap格式的請(qǐng)求數(shù)據(jù)時(shí),它分析這個(gè)數(shù)據(jù),,就知道要調(diào)用哪個(gè)java類的哪個(gè)方法,,于是去查找或創(chuàng)建這個(gè)對(duì)象,并調(diào)用其方法,,再把方法返回的結(jié)果包裝成soap格式的數(shù)據(jù),,通過http響應(yīng)消息回給客戶端。
五,、適用場(chǎng)合 1,、跨防火墻通信: 如果應(yīng)用程序有成千上萬的用戶,而且分布在世界各地,,那么客戶端和服務(wù)器之間的通信將是一個(gè)棘手的問題,。因?yàn)榭蛻舳撕头?wù)器之間通常會(huì)有防火墻或者代理服務(wù)器。在這種情況下,,使用DCOM就不是那么簡(jiǎn)單,,通常也不便于把客戶端程序發(fā)布到數(shù)量如此龐大的每一個(gè)用戶手中。傳統(tǒng)的做法是,,選擇用瀏覽器作為客戶端,,寫下一大堆ASP頁面,把應(yīng)用程序的中間層暴露給最終用戶,。這樣做的結(jié)果是開發(fā)難度大,,程序很難維護(hù)。如果中間層組件換成WebService的話,,就可以從用戶界面直接調(diào)用中間層組件,。從大多數(shù)人的經(jīng)驗(yàn)來看,在一個(gè)用戶界面和中間層有較多交互的應(yīng)用程序中,,使用WebService這種結(jié)構(gòu),,可以節(jié)省花在用戶界面編程上20%的開發(fā)時(shí)間。 2,、應(yīng)用程序集成: 企業(yè)級(jí)的應(yīng)用程序開發(fā)者都知道,企業(yè)里經(jīng)常都要把用不同語言寫成的,、在不同平臺(tái)上運(yùn)行的各種程序集成起來,,而這種集成將花費(fèi)很大的開發(fā)力量。應(yīng)用程序經(jīng)常需要從運(yùn)行在IBM主機(jī)上的程序中獲取數(shù)據(jù),;或者把數(shù)據(jù)發(fā)送到主機(jī)或UNIX應(yīng)用程序中去,。即使在同一個(gè)平臺(tái)上,不同軟件廠商生產(chǎn)的各種軟件也常常需要集成起來,。通過WebService,,可以很容易的集成不同結(jié)構(gòu)的應(yīng)用程序,。 3、B2B集成: 用WebService集成應(yīng)用程序,,可以使公司內(nèi)部的商務(wù)處理更加自動(dòng)化,。但當(dāng)交易跨越供應(yīng)商和客戶、突破公司的界限時(shí)會(huì)怎么樣呢,?跨公司的商務(wù)交易集成通常叫做B2B集成,。WebService是B2B集成成功的關(guān)鍵。通過WebService,,公司可以把關(guān)鍵的商務(wù)應(yīng)用“暴露”給指定的供應(yīng)商和客戶,。例如,把電子下單系統(tǒng)和電子發(fā)票系統(tǒng)“暴露”出來,,客戶就可以以電子的方式發(fā)送訂單,,供應(yīng)商則可以以電子的方式發(fā)送原料采購發(fā)票。當(dāng)然,,這并不是一個(gè)新的概念,,EDI(電子文檔交換)早就是這樣了。但是,,WebService的實(shí)現(xiàn)要比EDI簡(jiǎn)單得多,,而且WebService運(yùn)行在Internet上,在世界任何地方都可輕易實(shí)現(xiàn),,其運(yùn)行成本就相對(duì)較低,。不過,WebService并不像EDI那樣,,是文檔交換或B2B集成的完整解決方案,。WebService只是B2B集成的一個(gè)關(guān)鍵部分,還需要許多其它的部分才能實(shí)現(xiàn)集成,。 用WebService來實(shí)現(xiàn)B2B集成的最大好處在于可以輕易實(shí)現(xiàn)互操作性,。只要把商務(wù)邏輯“暴露”出來,成為WebService,,就可以讓任何指定的合作伙伴調(diào)用這些商務(wù)邏輯,,而不管他們的系統(tǒng)在什么平臺(tái)上運(yùn)行,使用什么開發(fā)語言,。這樣就大大減少了花在B2B集成上的時(shí)間和成本,,讓許多原本無法承受EDI的中小企業(yè)也能實(shí)現(xiàn)B2B集成。 4,、軟件和數(shù)據(jù)重用: 軟件重用是一個(gè)很大的主題,,重用的形式很多,重用的程度有大有小,。最基本的形式是源代碼模塊或者類一級(jí)的重用,一種形式是二進(jìn)制形式的組件重用。采用WebService應(yīng)用程序可以用標(biāo)準(zhǔn)的方法把功能和數(shù)據(jù)“暴露”出來,,供其它應(yīng)用程序使用,達(dá)到業(yè)務(wù)級(jí)重用,。
六、不適用場(chǎng)合 1,、單機(jī)應(yīng)用程序: 目前,,企業(yè)和個(gè)人還使用著很多桌面應(yīng)用程序。其中一些只需要與本機(jī)上的其它程序通信,。在這種情況下,,最好就不要用WebService,只要用本地的 API就可以了,。COM非常適合于在這種情況下工作,,因?yàn)樗刃∮挚臁_\(yùn)行在同一臺(tái)服務(wù)器上的服務(wù)器軟件也是這樣,。最好直接用COM或其它本地的API來進(jìn)行應(yīng)用程序間的調(diào)用,。當(dāng)然WebService也能用在這些場(chǎng)合,但那樣不僅消耗太大,,而且不會(huì)帶來任何好處,。 2、局域網(wǎng)的同構(gòu)應(yīng)用程序: 在許多應(yīng)用中,,所有的程序都是用VB或VC開發(fā)的,,都在Windows平臺(tái)下使用COM,都運(yùn)行在同一個(gè)局域網(wǎng)上,。例如,,有兩個(gè)服務(wù)器應(yīng)用程序需要相互通信,或者有一個(gè)Win32或WinForm的客戶程序要連接局域網(wǎng)上另一個(gè)服務(wù)器的程序,。在這些程序里,,使用DCOM會(huì)比SOAP/HTTP有效得多。與此相類似,,如果一個(gè).NET程序要連接到局域網(wǎng)上的另一個(gè).NET程序,,應(yīng)該使用.NETremoting。有趣的是,,在.NETremoting 中,,也可以指定使用SOAP/HTTP來進(jìn)行WebService調(diào)用。不過最好還是直接通過TCP進(jìn)行RPC調(diào)用,,那樣會(huì)有效得多。
|
|