作者:王昱
摘要:本文介紹了Web Services的起源和基本原理,分析了在企業(yè)應(yīng)用中Web Services帶來的沖擊和變革,指出了Web Services的一些優(yōu)缺點(diǎn)以及如何正確地應(yīng)用Web Services.
無論是在計(jì)算機(jī)雜志還是在Internet上,目前最熱門的話題莫過于“Web Services”。各個(gè)平臺(tái)之間的鋒爭,各個(gè)新產(chǎn)品的發(fā)布,眾多新標(biāo)準(zhǔn)的制訂,大都和Web Services有關(guān)。
我的一些朋友是這樣的一些人,他們總是用著最新的平臺(tái),嘗試著最新的技術(shù),他們喜歡變化,喜歡流行,用他們自己的話說,新技術(shù)創(chuàng)造新生活!可是,當(dāng)我的一個(gè)朋友,帶領(lǐng)他們一個(gè)部門的開發(fā)人員,花了兩個(gè)月的,將他們內(nèi)部的管理系統(tǒng)用Web Services重新設(shè)計(jì)和實(shí)現(xiàn)了一遍,卻發(fā)現(xiàn)在實(shí)際使用的情況下,系統(tǒng)性能非常糟糕。他提出了這樣一個(gè)問題:是不是Web Services現(xiàn)在還處于實(shí)驗(yàn)和市場炒作時(shí)期,根本沒有進(jìn)入實(shí)用的階段?簡單的回答是:Web Services不是萬能的,它有它的應(yīng)用范圍和優(yōu)勢劣勢。
Web Services的起源
Web應(yīng)用的巨大成功和不斷發(fā)展,使其滲透到商業(yè)領(lǐng)域和個(gè)人生活的各個(gè)方面。人們只要使用瀏覽器,就可以享受到各種各樣的Web服務(wù),例如網(wǎng)上購物,網(wǎng)上交易,網(wǎng)絡(luò)游戲,預(yù)定車票,網(wǎng)上聊天和交友等等。與此同時(shí),由于Web技術(shù)所帶來的優(yōu)勢(統(tǒng)一的客戶端和較好的維護(hù)性),使一些傳統(tǒng)的應(yīng)用紛紛轉(zhuǎn)型到BS結(jié)構(gòu)上。
然而,在發(fā)展中,逐步暴露了一些問題。所有這些Web頁面都是為人準(zhǔn)備的,是讓人去閱讀,去輸入,去判斷。因此各種反映視覺效果的內(nèi)容占用了大量的網(wǎng)絡(luò)帶寬,例如各種圖片,字體信息,文字排版樣式等。而真正含有高價(jià)值的一些信息,被深深埋在這些顯示信息中,很難被其他應(yīng)用和程序所使用。更重要的是,各種web服務(wù)之間缺少交互和通訊的機(jī)制。
程序之間的互相通訊很重要嗎?簡單舉一個(gè)例子。
假設(shè)你經(jīng)常去國外出差,在你回國以后,第一件事就是費(fèi)用報(bào)銷了。而你們公司有這樣的財(cái)務(wù)規(guī)定,所有的報(bào)銷款,都按報(bào)銷當(dāng)天的外匯比價(jià)進(jìn)行結(jié)算。因此在你填寫報(bào)銷單的時(shí)候必須先填寫每一筆在各個(gè)國家的花消,然后上網(wǎng)查出當(dāng)天的外匯比價(jià),填寫到報(bào)銷單上。剩下的事情也許不用你做了,你的報(bào)銷單填寫工具會(huì)自動(dòng)進(jìn)行換算和統(tǒng)計(jì)。
覺得有什么不妥嗎?作為IT公司的員工,也許都有一個(gè)特點(diǎn),計(jì)算機(jī)能做的事情,盡量要計(jì)算機(jī)去做。外匯比價(jià)的查詢可以讓計(jì)算機(jī)自動(dòng)去做嘛!然而,讓你的程序自動(dòng)去網(wǎng)頁上查找指定的外匯比價(jià)可不是一件容易的事。因?yàn)檫@些網(wǎng)頁是給人閱讀的,人眼和大腦的反應(yīng)速度有多快,它們可以從一整頁信息中快速定位到你所要的內(nèi)容,而且無論網(wǎng)頁怎樣變化和改版都不會(huì)帶來太大的影響。而應(yīng)用程序想要做同樣的事就差得太遠(yuǎn)了。因此,現(xiàn)在需要的是專門為應(yīng)用程序制定的Web服務(wù)。
隨著應(yīng)用程序之間通訊的需求越來越大,這就需要制定統(tǒng)一的標(biāo)準(zhǔn)和協(xié)議。HP公司是最先提出這個(gè)觀點(diǎn)的公司,他們制定了有關(guān)“e-Speak”的標(biāo)準(zhǔn)來保證應(yīng)用程序之間的交互,并聲稱將成為下一代Internet信息交互的標(biāo)準(zhǔn)。而隨后,MicroSoft意識(shí)到此計(jì)劃的美好前景,便推出了.Net戰(zhàn)略;IBM很快就發(fā)布了Web Services Toolkit(WSTK),和Web Services Development Environment(WSDE),申明對(duì)Web Services的全力支持。與此同時(shí),Oracle也開發(fā)出自己的Dynamic Services,并和Oracle 8i Release 2集成在一起。在這以后,W3C統(tǒng)一制定了Web Services的各種標(biāo)準(zhǔn)。而SUN公司在宣布了自己的Web Services的框架以后,將Web Services的標(biāo)準(zhǔn)溶入J2EE的環(huán)境,使Web Services有了廣泛支持的基礎(chǔ)和平臺(tái)。
Web Services的基本原理
Web Services 是通過一系列標(biāo)準(zhǔn)和協(xié)議來保證程序之間的動(dòng)態(tài)連接。其中最基本的協(xié)議包括:SOAP, WSDL, UDDI
-
SOAP: 是“Simple Object Access Protocol”的縮寫,SOAP是消息傳遞的協(xié)議,它規(guī)定了Web Services之間是怎樣傳遞信息的。簡單的說,SOAP規(guī)定了:
1. 傳遞信息的格式為XML。這就使Web Services能夠在任何平臺(tái)上,用任何語言進(jìn)行實(shí)現(xiàn)。
2. 遠(yuǎn)程對(duì)象方法調(diào)用的格式。規(guī)定了怎樣表示被調(diào)用對(duì)象以及調(diào)用的方法名稱和參數(shù)類型等。
3. 參數(shù)類型和XML格式之間的映射。這是因?yàn)椋徽{(diào)用的方法有時(shí)候需要傳遞一個(gè)復(fù)雜的參數(shù),例如,一個(gè)Person對(duì)象。怎樣用XML來表示一個(gè)對(duì)象參數(shù),也是SOAP所定義的范圍。
4. 異常處理以及其他的相關(guān)信息.
-
WSDL:是“Web Services Description Language”的縮寫.意如其名,WSDL是Web Services的定義語言。當(dāng)你實(shí)現(xiàn)了某種服務(wù)的時(shí)候(如,股票查詢服務(wù)),為了讓別的程序調(diào)用,你必須告訴大家你的服務(wù)的接口.例如,服務(wù)名稱,服務(wù)所在的機(jī)器名稱,監(jiān)聽端口號(hào),傳遞參數(shù)的類型,個(gè)數(shù)和順序,返回結(jié)果的類型等等.這樣別的應(yīng)用程序才能調(diào)用你的服務(wù)。WSDL協(xié)議就是規(guī)定了有關(guān)Web Services描述的標(biāo)準(zhǔn)。
-
UDDI: 是Universal Description, Discovery, and Integration的縮寫。簡單說,UDDI用于集中存放和查找WSDL描述文件,起著目錄服務(wù)器的作用。

如上圖,一個(gè)Web Services的生命周期是:
-
實(shí)現(xiàn)一個(gè)Web Services,使其能夠接受和響應(yīng)SOAP消息(現(xiàn)在有很多工具都可以幫助實(shí)現(xiàn))。
-
撰寫一個(gè)WSDL文件用于描述此Web Services。(現(xiàn)在有很多工具可以自動(dòng)生成WSDL文件)。
-
將此WSDL發(fā)布到UDDI上。
-
其他的應(yīng)用程序(客戶端)從UDDI上搜索到你的WSDL。
-
根據(jù)你的WSDL,客戶端可以編寫程序(現(xiàn)在有很多工具可以自動(dòng)生成調(diào)用程序)調(diào)用你的Web Services。
Web Services的缺點(diǎn)
由于是基于XML的應(yīng)用,Web Services與生俱來地在擁有XML帶來的一切優(yōu)勢的同時(shí),不可避免地繼承了XML所帶來的一些限制。
-
Web Services通常需要大量的CPU資源。因?yàn)?/font>XML數(shù)據(jù)要經(jīng)過多步處理才能被系統(tǒng)使用。首先是效驗(yàn)(validate),檢查它的格式是否符合XML的規(guī)范,以及根據(jù)應(yīng)用程序定義(DTD或Schema)檢查是否符合語義上的規(guī)范;然后還要進(jìn)行解析(parse),從XML文檔分解出單個(gè)的元素;最后還要轉(zhuǎn)換成應(yīng)用程序所需要的二進(jìn)制表達(dá)(例如,把“12” 轉(zhuǎn)換成整型12的二進(jìn)制表示)。
-
Web Services還意味著占用較多的內(nèi)存資源。在進(jìn)行XML解析的時(shí)候,會(huì)產(chǎn)生大量的臨時(shí)內(nèi)存對(duì)象。特別是在處理DOM對(duì)象的時(shí)候。這些大量的臨時(shí)對(duì)象對(duì)于象JAVA這類自動(dòng)回收內(nèi)存的語言和系統(tǒng)其實(shí)是一種負(fù)擔(dān),大量的臨時(shí)對(duì)象將會(huì)使系統(tǒng)每隔一段時(shí)間就會(huì)進(jìn)行內(nèi)存回收,從而降低系統(tǒng)的性能。當(dāng)然,現(xiàn)在有的Web Services的產(chǎn)品(如axis)采用了SAX技術(shù),大大減少了內(nèi)存的占用量。詳細(xì)信息請(qǐng)參考:(http://xml.apache.org/axis/index.html)。
-
網(wǎng)絡(luò)資源的消耗也是Web Services應(yīng)用的一些限制。因?yàn)榛?/font>XML數(shù)據(jù)的傳遞通常數(shù)據(jù)量要比二進(jìn)制的協(xié)議(如RMI/IIOP)要大的多。這種額外的消耗在網(wǎng)絡(luò)資源比較緊張或網(wǎng)絡(luò)傳輸比較頻繁的應(yīng)用中會(huì)產(chǎn)生一定的影響。
除了XML帶來的限制,Web Services本身也具有一些缺點(diǎn):
-
到目前為止,Web Services還可以說是一種無狀態(tài)(stateless)的服務(wù)。
所謂stateless就意味著不保存客戶端服務(wù)調(diào)用者的任何信息。這是由Web Services的本質(zhì)所決定的。Web Services在本質(zhì)上是要為應(yīng)用程序之間提供數(shù)據(jù)通訊的標(biāo)準(zhǔn),為企業(yè)應(yīng)用之間動(dòng)態(tài)地提供大顆粒度的服務(wù),所以Web Services并不適合于非常精細(xì)的基于會(huì)話的方法調(diào)用以及復(fù)雜的事務(wù)(transaction)處理之中。
也許有人會(huì)對(duì)我這點(diǎn)提出異議!因?yàn)椋F(xiàn)在有很多Web Services的產(chǎn)品(如WASD),不但可以保存session的信息,使服務(wù)成為有狀態(tài)(stateful)的服務(wù),而且還實(shí)現(xiàn)了remote interface,可以在Web Services的會(huì)話中傳遞遠(yuǎn)程對(duì)象的句柄,讓客戶端可以操縱遞遠(yuǎn)程對(duì)象(詳細(xì)信息請(qǐng)參考:http://www.systinet.com )。原理上說,這并不難實(shí)現(xiàn),因?yàn)樵?/font>XML數(shù)據(jù)中,可以互相傳送任何數(shù)據(jù),包括sessionID和transactionID,有了這些ID,從技術(shù)角度上說,實(shí)現(xiàn)有狀態(tài)(stateful)的服務(wù)和事務(wù)處理并不復(fù)雜。但是,這樣功能缺少標(biāo)準(zhǔn)的支持,當(dāng)前版本的WSDL還無法表示這些復(fù)雜的服務(wù)。在企業(yè)內(nèi)部,你可以任意使用這些特殊的功能,可以自己定義會(huì)話狀態(tài)的交互協(xié)議,因?yàn)榉?wù)者和服務(wù)調(diào)用者之間的通訊都在你的控制之中;然而要將這些服務(wù)發(fā)布到Internet上,其他的應(yīng)用程序是無法根據(jù)標(biāo)準(zhǔn)去識(shí)別這些特殊功能。
-
數(shù)據(jù)綁定也存在一些不足。
因?yàn)樗械臄?shù)據(jù)傳遞都用XML格式,因此,需要在二進(jìn)制數(shù)據(jù)和XML數(shù)據(jù)之間有個(gè)轉(zhuǎn)換。但是,并不是所有的二進(jìn)制數(shù)據(jù)都能方便地用XML來表示,并不是所有的JAVA對(duì)象都能被XML所表示。因此,經(jīng)常在轉(zhuǎn)換過程中會(huì)出現(xiàn)語義丟失的情況。
-
技術(shù)要求高,學(xué)習(xí)曲線較長。
每一個(gè)Web Services的產(chǎn)品,都有豐富的工具,能夠根據(jù)Web Services的定義(如WSDL文件)方便地生成客戶端的程序;能夠?qū)⒁话愕姆?wù)程序,很容易就包裝成Web Services服務(wù)。因此,各個(gè)Web Services的產(chǎn)品都聲稱自己的平臺(tái)容易使用,根本不需要了解XML,也不需要了解什么WSDL,UDDI,SOAP就能使用發(fā)布Web Services。特別是一個(gè)朋友告訴我,他在什么都不了解的情況下,用.NET花了15分鐘就發(fā)布了一個(gè)Web Services!
千萬不要醉心于這種簡便,這對(duì)于簡單的Demo也許是對(duì)的,可是對(duì)于真正意義上嚴(yán)肅的應(yīng)用,一定要了解Web Services的各個(gè)方面,設(shè)計(jì)整體結(jié)構(gòu)和解決方案,還要根據(jù)具體的應(yīng)用調(diào)整性能。所有這些都需要對(duì)Web Services知識(shí)的全面掌握。
什么應(yīng)用適合Web Services
Web Services這么多的缺點(diǎn)是不是讓你很泄氣?其實(shí),已經(jīng)有很多成功的Web Services的應(yīng)用和越來越多的開發(fā)商的加盟,證明Web Services一定會(huì)成為新一代WEB信息通訊的主流。經(jīng)過不斷的發(fā)展,Web Services一定能克服自身的弱點(diǎn),得到更廣泛的應(yīng)用。但就目前來說,Web Services比較適合用于下列形式的應(yīng)用:
要在Internet上創(chuàng)建基于二進(jìn)制協(xié)議的RMI/IIOP的應(yīng)用,一般都會(huì)遇上一個(gè)大麻煩--防火墻。客戶端瀏覽器極大可能在ISP防火墻后,大多數(shù)防火墻都只能允許和外部的HTTP連接,因此想要ISP防火墻后的客戶端能和防火墻外的RMI/IIOP的應(yīng)用端口進(jìn)行連接的話,就要改變ISP的安全策略,讓客戶端能夠連接除了80以外的其他端口。可是當(dāng)運(yùn)行RMI/IIOP的應(yīng)用的服務(wù)器為了安全也在防火墻之后的DMZ中的話,那這個(gè)連接就更加復(fù)雜了,要跨越兩個(gè)防火墻。
而Web Services由于使用的是HTTP協(xié)議,傳遞的是純文本的XML數(shù)據(jù),因此擁有穿透防火墻的良好性能。
XML語言本身就是跨平臺(tái)、跨語言的數(shù)據(jù)表示方法,在加上通用的HTTP等協(xié)議,使得Web Services天生就適用于基于異構(gòu)平臺(tái)的應(yīng)用。如果你的客戶端包含了各種不同的平臺(tái),例如,你希望你的服務(wù)即可以被JAVA程序所調(diào)用,又可以由VB和COM程序所調(diào)用。你有兩種選擇:一種是為不同的平臺(tái)提供相應(yīng)的API,還要為不同的語言提供API;如果提供Web Services,所有平臺(tái)和語言都可以調(diào)用了!
很多人都認(rèn)為,安全性是Web Services的弱項(xiàng)。其實(shí)不然,經(jīng)過不斷的完善和各種新的協(xié)議的出臺(tái),Web Services完全可以用于安全性很強(qiáng)的應(yīng)用環(huán)境下。并且,由于Web Services使用HTTP協(xié)議進(jìn)行傳輸,所以可以和容易就使用已經(jīng)很成熟的基于HTTP的各種安全技術(shù)。
-
EAI(企業(yè)應(yīng)用集成)
這是目前Web Services應(yīng)用最看好的方向之一。大多數(shù)企業(yè)內(nèi)部都有著各種各樣的應(yīng)用系統(tǒng),它們是在不同的領(lǐng)導(dǎo)在任期間,由不同的軟件開發(fā)商開發(fā),因此運(yùn)行在不同的平臺(tái)和系統(tǒng)上,系統(tǒng)的開發(fā)語言也各不相同。由于現(xiàn)代企業(yè)信息自動(dòng)化要求的提高,各個(gè)系統(tǒng)之間的互動(dòng)和相互通訊便提到日程上。因此,保護(hù)原有投資,重用遺留系統(tǒng)是當(dāng)前很多中大型企業(yè)的重要任務(wù)。
由于遺留系統(tǒng)的運(yùn)行平臺(tái)是異構(gòu)環(huán)境,因此企業(yè)應(yīng)用集成的代價(jià)一般來說是很高的。但如果使用Web Services作為應(yīng)用集成的手段,將會(huì)大大降低集成的消耗。Web Services與平臺(tái)和語言無關(guān)的特性,以及各種平臺(tái)和環(huán)境下的開發(fā)工具都是企業(yè)應(yīng)用集成的利器。
另外,在開發(fā)新的應(yīng)用系統(tǒng)的時(shí)候,仍然需要考慮和其他系統(tǒng)的集成,需要考慮調(diào)用其他系統(tǒng)的功能,和被其他系統(tǒng)所調(diào)用。使用Web Services作為系統(tǒng)與外部交流的接口,能夠使新的系統(tǒng)和別的系統(tǒng)之間保持松耦合的關(guān)系,保持較高的可擴(kuò)展性。
-
行業(yè)內(nèi)部B2B應(yīng)用
行業(yè)內(nèi)部的應(yīng)用是Web Services的另外一個(gè)方向。因?yàn)樵谝粋€(gè)行業(yè)中,商業(yè)業(yè)務(wù)是很相似的,因此在行業(yè)內(nèi)部很容易形成服務(wù)的標(biāo)準(zhǔn),使所有的業(yè)內(nèi)企業(yè)共同遵守;但怎樣實(shí)現(xiàn)服務(wù)和使用什么樣的系統(tǒng),決定權(quán)在于各個(gè)企業(yè)自己。例如,電信運(yùn)營商之間的結(jié)算服務(wù),銀行之間的轉(zhuǎn)帳服務(wù)等都可以形成行業(yè)標(biāo)準(zhǔn),以WSDL的形式公布出來。各個(gè)企業(yè)之間可以選擇不同的平臺(tái)進(jìn)行服務(wù)的實(shí)現(xiàn)。
提高Web Services的性能
要想提高Web Services應(yīng)用的性能,需要對(duì)整個(gè)系統(tǒng)做全盤的考慮。一般來說,有以下幾點(diǎn)需要注意:
-
Web Services的顆粒度
選擇Web Services的顆粒度是提高Web Services應(yīng)用的性能的主要手段。因?yàn)?/span>Web Services使用的傳輸協(xié)議為HTTP或SMTP等,這些協(xié)議都是面向無狀態(tài)的連接協(xié)議,每一個(gè)請(qǐng)求都要建立一個(gè)新的連接。因此Web Services的調(diào)用不能象數(shù)據(jù)庫JDBC(ODBC)接口一樣可以進(jìn)行精細(xì)而復(fù)雜的方法調(diào)用(例如,先獲得Connection,再獲得結(jié)果集,然后一行一行獲取結(jié)果)。Web Services比較適用于大顆粒度的應(yīng)用,在一個(gè)調(diào)用中便獲得所有的信息(比如說銀行之間的轉(zhuǎn)帳,在一次調(diào)用中就將包括金額和認(rèn)證等所有的信息都傳輸過去)。
-
謹(jǐn)慎使用XML接口
系統(tǒng)之間的接口可以使用XML,這樣可以增加系統(tǒng)的靈活性;但不要使用XML作為系統(tǒng)內(nèi)部的接口,因?yàn)檫@不會(huì)帶來任何好處,盡量使用二進(jìn)制作為系統(tǒng)內(nèi)部的接口,避免不必要的XML文檔的解析和效驗(yàn);在處理XML的時(shí)候,盡快將XML轉(zhuǎn)換成內(nèi)部對(duì)象,XML的傳遞只會(huì)增加系統(tǒng)的開銷。
-
最大可能性使用CACHE
當(dāng)有些信息是只讀的,或者在一段時(shí)間內(nèi)保持不變,就可以使用CACHE。無論是客戶端的CACHE還是服務(wù)器端的CACHE,都能大大提高系統(tǒng)的性能
總結(jié)
一旦Web Services得到更加廣泛的應(yīng)用,使得各種服務(wù)可以動(dòng)態(tài)查找和定位,這樣就提供了不同設(shè)備之間各種各樣的信息交互方式,將會(huì)大大改變商業(yè)運(yùn)做的模式和信息交流的風(fēng)格。
你可以使用別人已經(jīng)成熟的功能來使自己提供更好的服務(wù),例如google,它的搜索引擎可以通過Web Services來訪問。這就意味著在你的系統(tǒng)中可以方便的嵌入使用google的強(qiáng)大搜索功能,而不論你的系統(tǒng)是運(yùn)行在什么平臺(tái)上,使google的搜索引擎成為你系統(tǒng)的一部分,(請(qǐng)參考http://www.google.com/apis/)。站在別人的肩膀上,畢竟要看得遠(yuǎn)些!
面對(duì)Web Services,你現(xiàn)在可以不行動(dòng),但你一定要準(zhǔn)備好!