轉(zhuǎn)載
摘要:本文介紹了
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
意識到此計(jì)劃的美好前景,便推出了
.Net
戰(zhàn)略;
IBM
很快就發(fā)布了
Web Services Toolkit(WSTK)
,和
Web Services Development Environment(WSDE)
,申明對
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)程對象方法調(diào)用的格式。規(guī)定了怎樣表示被調(diào)用對象以及調(diào)用的方法名稱和參數(shù)類型等。
3.
參數(shù)類型和
XML
格式之間的映射。這是因?yàn)椋徽{(diào)用的方法有時(shí)候需要傳遞一個(gè)復(fù)雜的參數(shù),例如,一個(gè)
Person
對象。怎樣用
XML
來表示一個(gè)對象參數(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)聽端口號,傳遞參數(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)存對象。特別是在處理
DOM
對象的時(shí)候。這些大量的臨時(shí)對象對于象
JAVA
這類自動(dòng)回收內(nèi)存的語言和系統(tǒng)其實(shí)是一種負(fù)擔(dān),大量的臨時(shí)對象將會(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ì)信息請參考:(
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ì)對我這點(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)程對象的句柄,讓客戶端可以操縱遞遠(yuǎn)程對象(詳細(xì)信息請參考:
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ù)據(jù)綁定也存在一些不足。
因?yàn)樗械臄?shù)據(jù)傳遞都用
XML
格式,因此,需要在二進(jìn)制數(shù)據(jù)和
XML
數(shù)據(jù)之間有個(gè)轉(zhuǎn)換。但是,并不是所有的二進(jìn)制數(shù)據(jù)都能方便地用
XML
來表示,并不是所有的
JAVA
對象都能被
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
!
千萬不要醉心于這種簡便,這對于簡單的
Demo
也許是對的,可是對于真正意義上嚴(yán)肅的應(yīng)用,一定要了解
Web Services
的各個(gè)方面,設(shè)計(jì)整體結(jié)構(gòu)和解決方案,還要根據(jù)具體的應(yīng)用調(diào)整性能。所有這些都需要對
Web Services
知識的全面掌握。
什么應(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)用的性能,需要對整個(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è)請求都要建立一個(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)部對象,
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)的一部分,(請參考
http://www.google.com/apis/
)。站在別人的肩膀上,畢竟要看得遠(yuǎn)些!
面對
Web Services
,
你現(xiàn)在可以不行動(dòng),但你一定要準(zhǔn)備好!