Web Service概念梳理
計算機技術(shù)難理解的很多,Web Service 對我來說就是一個很難理解的概念;為了弄清它到底是什么,我花費了兩周的時間,總算有了一些收獲,參考了不少網(wǎng)上的資料,但有些概念說法不一。我以w3c和 一些早期介紹Web Service的書為準(zhǔn)。如有錯誤,歡迎指正!
--------------------------------------------------------------
提前預(yù)警!概念太多,你需要仔細(xì)閱讀,或要閱讀兩遍。
?
SOA ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Service Oriented Ambiguity?中文一般理解為,面向服務(wù)架構(gòu),簡稱SOA。
SOA的提出是在企業(yè)計算領(lǐng)域,就是要將緊耦合的系統(tǒng),劃分為面向業(yè)務(wù)的,粗粒度,松耦合,無狀態(tài)的服務(wù)。服務(wù)發(fā)布出來供其他服務(wù)調(diào)用,一組互相依賴的服務(wù)就構(gòu)成了SOA架構(gòu)下的系統(tǒng)。
既然說是一種架構(gòu)的話,所以一般認(rèn)為SOA是包含了運行環(huán)境,編程模型,架構(gòu)風(fēng)格和相關(guān)方法論等在內(nèi)的一整套新的分布式軟件系統(tǒng)構(gòu)造方法和環(huán)境,涵蓋服務(wù)的整個生命周期。
Service-architecture.com將?SOA定義為:
本質(zhì)上是服務(wù)的集合。服務(wù)間彼此通信,這種通信可能是簡單的數(shù)據(jù)傳送,也可能是兩個或更多的服務(wù)協(xié)調(diào)進(jìn)行某些活動。服務(wù)間需要某些方法進(jìn)行連接。
所謂服務(wù)就是精確定義、封裝完善、獨立于其他服務(wù)所處環(huán)境和狀態(tài)的函數(shù)。
雖然不同廠商或個人對?SOA有著不同的理解,但是我們?nèi)匀豢梢詮纳鲜龅亩x中看到?SOA的幾個關(guān)鍵特性:一種粗粒度、松耦合服務(wù)架構(gòu),服務(wù)之間通過簡單、精確定義接口進(jìn)行通訊,不涉及底層編程接口和通訊模型。
?
(這不由的讓我想到了另一個概念---“敏捷測試”,它強調(diào)擁抱變化,溝通、減少文檔、快速迭代等。至于不同的公司或團隊如何具體的實施并沒有詳細(xì)的規(guī)范,只要符合以上幾點要求的公司或團隊都可以認(rèn)為實施了敏捷測試。)
對于SOA來說,讀者并不需要太過較真SOA到是一個怎樣的架構(gòu)。只要符合它的定義和規(guī)范的軟件系統(tǒng)都可以認(rèn)為是SOA架構(gòu)。
?
SOA 與 Web Service ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
早在1996年Gartner就前瞻性地提出了面向服務(wù)架構(gòu)的思想(SOA),Web Service不知為何物,SOA還只是束之高閣的理論概念。直到2000年以后,W3C才成立了相關(guān)的委員會,開始討論Web Service的相關(guān)標(biāo)準(zhǔn),各大廠商一邊積極參與標(biāo)準(zhǔn)制定,一邊推出了一系列實實在在的產(chǎn)品。新的技術(shù)和新的產(chǎn)品出現(xiàn),SOA找到了可以依托的憑借。隨著 Web Service技術(shù)的推出和應(yīng)用,SOA的思想被一個個效益顯著的信息系統(tǒng)建設(shè)項目不斷的示范,才逐漸成為現(xiàn)今的熱門話題。
因為現(xiàn)在幾乎所有的SOA應(yīng)用場合都是和Web Service綁定的,所以不免有時候這兩個概念混用。不可否認(rèn)Web Service是現(xiàn)在最適合實現(xiàn)SOA的技術(shù),SOA的走紅在很大程度上歸功于Web Service標(biāo)準(zhǔn)的成熟和應(yīng)用普及。因為現(xiàn)在大家基本上認(rèn)同Web Service技術(shù)在幾方面體現(xiàn)了SOA的需要:
首先,是基于標(biāo)準(zhǔn)訪問的獨立功能實體滿足了松耦合要求:在Web Service中所有的訪問都通過SOAP訪問進(jìn)行,用WSDL定義的接口封裝,通過UDDI進(jìn)行目錄查找,可以動態(tài)改變一個服務(wù)的提供方而無需影響客戶端的配置,外界客戶端是根本不關(guān)心訪問服務(wù)器端的實現(xiàn)。
其次,適合大數(shù)據(jù)量低頻率訪問符合服務(wù)大顆粒度功能:基于性能和效率平衡的要求,SOA的服務(wù)提供的是大顆粒度的應(yīng)用功能,而且跨系統(tǒng)邊界的訪問頻率也不會象程序間函數(shù)調(diào)用那么頻繁。通過使用WSDL和基于文本(Literal)的SOAP請求,可以實現(xiàn)能一次性接收處理大量數(shù)據(jù)。
最后,基于標(biāo)準(zhǔn)的文本消息傳遞為異構(gòu)系統(tǒng)提供通訊機制:Web Service所有的通訊是通過SOAP進(jìn)行的,而SOAP是基于XML的,XML是結(jié)構(gòu)化的文本消息。從最早的EDI開始,文本消息也許是異構(gòu)系統(tǒng)間通訊最好的消息格式,適用于SOA強調(diào)的服務(wù)對異構(gòu)后天宿主系統(tǒng)的透明性。
綜合上述觀點,Web Service不愧為當(dāng)前SOA的最好選擇。然而,就SOA思想本身而言,并不一定要局限于Web Service方式的實現(xiàn)。更應(yīng)該看到的是SOA本身強調(diào)的是實現(xiàn)業(yè)務(wù)邏輯的敏捷性要求,是從業(yè)務(wù)應(yīng)用角度對信息系統(tǒng)實現(xiàn)和應(yīng)用的抽象。隨著人們認(rèn)識的提高,還會有新技術(shù)不斷的發(fā)明出來,更好的來滿足這個要求。
上面涉及的名詞太多,我們等一下還會單一的來介紹,用一句話總結(jié)它們之間的關(guān)系。 “SOA不是Web Service,Web Service是目前最適合實現(xiàn)SOA的技術(shù)。”
?
Web Service ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
在解釋 Web Service 之前,先拋出一個問題。有沒有一種辦法可以實現(xiàn)跨應(yīng)用程序進(jìn)行通信和跨平臺進(jìn)行通信呢?
跨應(yīng)用程序,主要是指我家開發(fā)的系統(tǒng)和別人家開發(fā)的系統(tǒng)之間是否可以通信。
跨平臺,主要是指我家用Java開發(fā)的系統(tǒng)和別人家用.NET開發(fā)的系統(tǒng)是否可以通信。
像這樣的需求有很多,例如騰訊QQ上面自帶的天氣功能。
騰訊要想獲得實時的天氣信息怎么辦呢?有一種辦法,那就是騰訊公司放個衛(wèi)星上天,并且在公司中成立一個氣象部門,天天關(guān)注于天氣,然后每時每刻更新騰訊QQ上的這個天氣預(yù)報信息;這顯然不是一種明智的做法,只是想獲取一下天氣信息,居然要如此高的成本。
更簡單的做法是讓中國氣象臺提供實時的天氣信息,然后,通過提供接口的方式給騰訊調(diào)用。那么這就遇到我上面所說的問題,如何跨應(yīng)用與跨平臺調(diào)用接口。
這個時候有聰明的讀者會跳出來說,你傻啊!用HTTP協(xié)議啊,主流的編程語言都可以實現(xiàn)基于HTTP協(xié)議的應(yīng)用開發(fā)。讓中國氣象臺寫個基于HTTP協(xié)議的天氣接口給騰訊調(diào)用就可以了。當(dāng)然,這是完全可以的。不過,Web Service之所以在HTTP之后被提出自然有它的特點。
當(dāng)然,這里拿Web Service 與HTTP進(jìn)行比較是不合適。因為HTTP是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。而Web Service是一種部署在Web上的對象或者是應(yīng)用程序組件,Web Service數(shù)據(jù)的傳輸同樣需要借助HTTP協(xié)議。
更詳細(xì)的定義:
Web service是一個平臺獨立的,低耦合的,自包含的、基于可編程的web的應(yīng)用程序,可使用開放的XML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個子集)標(biāo)準(zhǔn)來描述、發(fā)布、發(fā)現(xiàn)、協(xié)調(diào)和配置這些應(yīng)用程序,用于開發(fā)分布式的互操作的應(yīng)用程序。
?
?
SOAP ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Simple?Object?Access?Protocol,中文為簡單對象訪問協(xié)議,簡稱SOAP。
SOAP是基于XML在分散或分布式的環(huán)境中交換信息的簡單的協(xié)議。允許服務(wù)提供者和服務(wù)客戶經(jīng)過防火墻在INTERNET進(jìn)行通訊交互。
SOAP的設(shè)計是為了在一個松散的、分布的環(huán)境中使用XML對等地交換結(jié)構(gòu)化的和類型化的信息提供了一個簡單且輕量級的機制。
XML是可以擴展標(biāo)記語言。
<bookstore><book category="COOKING"><title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> </bookstore>?
SOAP 消息的基本結(jié)構(gòu)
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"><soap:Header>......</soap:Header><soap:Body>......<soap:Fault>......</soap:Fault></soap:Body></soap:Envelope>當(dāng)SOAP消息真正需要在網(wǎng)絡(luò)上實際傳輸?shù)臅r候,SOAP消息能夠與不同的底層傳輸協(xié)議進(jìn)行綁定,同時,SOAP消息可以在很多種消息傳輸模式中使用。包括超文本傳輸協(xié)議(HTTP),簡單郵件傳輸協(xié)議(SMTP),多用途網(wǎng)際郵件擴充協(xié)議(MIME)。它還支持從消息系統(tǒng)到遠(yuǎn)程過程調(diào)用協(xié)議(RPC)等大量的應(yīng)用程序。
當(dāng)然,最多的情況還是綁定在HTTP協(xié)議上面?zhèn)鬏敗_@就導(dǎo)致大多數(shù)人認(rèn)為SOAP就是HTTP + XML,或者認(rèn)為SOAP是HTTP post請求的一個專用版本,遵循一種特殊的XML消息格式。
雖然,我們看到的大多情況確實如此,但這并不是SOAP本質(zhì)與全部。
這個請求你用fiddler可抓不到,我是用wireshark抓的,它可以截獲網(wǎng)卡的所有請求。
?
?
WSDL ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Web Services Description Language,網(wǎng)絡(luò)服務(wù)描述語言,簡稱WSDL。它是一門基于 XML 的語言,用于描述 Web Services 以及如何對它們進(jìn)行訪問。
WSDL 文檔主要使用以下幾個元素來描述某個 web service :
<portType>??web service 執(zhí)行的操作。
<message>??web service 使用的消息。
<types>?????web service 使用的數(shù)據(jù)類型。
<binding>???web service 使用的通信協(xié)議。
<wsdl:definitions ?xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing" ?xmlns:tns="tns" ? xmlns:plink="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" ?xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:senc="http://schemas.xmlsoap.org/soap/encoding/" ?xmlns:s12env="http://www.w3.org/2003/05/soap-envelope/" ?xmlns:s12enc="http://www.w3.org/2003/05/soap-encoding/" ?xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/" ?xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="tns" ?name="Application"><wsdl:types><xs:schema ? targetNamespace="tns" ? elementFormDefault="qualified"><xs:import ? namespace="http://www.w3.org/2001/XMLSchema" /><xs:complexType ? name="say_hello"><xs:sequence><xs:element ? name="name" ? type="xs:string" ?minOccurs="0" ? nillable="true" /></xs:sequence></xs:complexType><xs:complexType ? name="say_helloResponse"><xs:sequence><xs:element ? name="say_helloResult" ? type="xs:string" ?minOccurs="0" ? nillable="true" /></xs:sequence></xs:complexType><xs:element ? name="say_hello" ? type="tns:say_hello" /><xs:element ? name="say_helloResponse" ?type="tns:say_helloResponse" /></xs:schema></wsdl:types><wsdl:message ? name="say_hello"><wsdl:part ? name="say_hello" ? element="tns:say_hello" /></wsdl:message><wsdl:message ? name="say_helloResponse"><wsdl:part ? name="say_helloResponse" ?element="tns:say_helloResponse" /></wsdl:message><wsdl:portType ? name="Application"><wsdl:operation ? name="say_hello" ? parameterOrder="say_hello"><wsdl:input ? name="say_hello" ? message="tns:say_hello" /><wsdl:output ? name="say_helloResponse" ?message="tns:say_helloResponse" /></wsdl:operation></wsdl:portType><wsdl:binding ? name="Application" ? type="tns:Application"><soap:binding ? style="document" ?transport="http://schemas.xmlsoap.org/soap/http" /><wsdl:operation ? name="say_hello"><soap:operation ? soapAction="say_hello" ? style="document" /><wsdl:input ? name="say_hello"><soap:body ? use="literal" /></wsdl:input><wsdl:output ? name="say_helloResponse"><soap:body ? use="literal" /></wsdl:output></wsdl:operation></wsdl:binding><wsdl:service ? name="Application"><wsdl:port ? name="Application" ? binding="tns:Application"><soap:address ? location="http://10.2.70.10:7789/SOAP/?wsdl" /></wsdl:port></wsdl:service> </wsdl:definitions>WSDL 端口
<portType>?元素是最重要的 WSDL 元素。
它可描述一個 web service、可被執(zhí)行的操作,以及相關(guān)的消息。可以把 <portType> 元素比作傳統(tǒng)編程語言中的一個函數(shù)庫(或一個模塊、或一個類)。
WSDL 消息
<message>?元素定義一個操作的數(shù)據(jù)元素。
每個消息均由一個或多個部件組成。可以把這些部件比作傳統(tǒng)編程語言中一個函數(shù)調(diào)用的參數(shù)。
WSDL types
<types>?元素定義 web service 使用的數(shù)據(jù)類型。
為了最大程度的平臺中立性,WSDL 使用 XML Schema 語法來定義數(shù)據(jù)類型。
WSDL Bindings
<binding>?元素為每個端口定義消息格式和協(xié)議細(xì)節(jié)。
?
對于接口來說,接口文檔非常重要,它描述如何訪問接口。那么WSDL就可以看作Web Service接口的一種標(biāo)準(zhǔn)格式的“文檔”。我們通過閱讀WSDL就知道如何調(diào)用Web Service接口了。
?
UDDI ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Universal Description, Discovery and Integration",可譯為“通用描述、發(fā)現(xiàn)與集成服務(wù)”,簡稱UDDI。
WSDL用來描述了訪問特定的 Web Service的一些相關(guān)的信息,那么在互聯(lián)網(wǎng)上,或者是在企業(yè)的不同部門之間,如何來發(fā)現(xiàn)我們所需要的 Web Service呢?而 Web Service提供商又如何將自己開發(fā)的 Web Serivce公布到因特網(wǎng)上呢?這就需要使用到 UDDI 了。
UDDI 是一個獨立于平臺的框架,用于通過使用 Internet 來描述服務(wù),發(fā)現(xiàn)企業(yè),并對企業(yè)服務(wù)進(jìn)行集成。
UDDI 指的是通用描述、發(fā)現(xiàn)與集成服務(wù)
UDDI 是一種用于存儲有關(guān) web services 的信息的目錄。
UDDI 是一種由 WSDL 描述的 web services 界面的目錄。
UDDI 經(jīng)由 SOAP 進(jìn)行通信
UDDI 被構(gòu)建入了微軟的 .NET 平臺
下面,提供兩張圖,體會一下UDDI的安裝與發(fā)布。
?
UDDI可以幫助 Web 服務(wù)提供商在互聯(lián)網(wǎng)上發(fā)布 Web services的信息。UDDI 是一種目錄服務(wù),企業(yè)可以通過 UDDI 來注冊和搜索 Web services。
?
通過前面的介紹,SOAP、WSDL和UDDI就構(gòu)成了web Service的三要素。
?
?
Web Services體系結(jié)構(gòu) ? ? ? ? ? ? ? ? ?
在Web Serivce的體系結(jié)構(gòu)中涉及到三個角色,一個是 Web Service提供者,一個是 Web Service中介,還有一個就是 Web Service請求者;同時還涉及到三類動作,即發(fā)布,查找,綁定,
Web Service提供者:
可以發(fā)布 Web Service,并且對使用自身服務(wù)的請求進(jìn)行響應(yīng),Web Service的擁有者,它會等待其他的服務(wù)或者是應(yīng)用程序訪問自己。
Web Service請求者:
也就是 Web Service功能的使用者,它通過服務(wù)注冊中心也就是 Web Service中介者查找到所需要的服務(wù),再利用 SOAP?消息向 Web Service提供者發(fā)送請求以獲得服務(wù)。
Web Service中介:
也稱為服務(wù)代理,用來注冊已經(jīng)發(fā)布的 Web Service提供者,并對其進(jìn)行分類,同時提供搜索服務(wù),簡單來說的話,Web Service中介者的作用就是把一個 Web Service請求者和合適的 Web Service提供者聯(lián)系在一起,充當(dāng)一個管理者的角色,一般是通過 UDDI來實現(xiàn)。
發(fā)布:
通過發(fā)布操作,可以使 Web?Serivce提供者向 Web Service中介注冊自己的功能以及訪問的接口。
發(fā)現(xiàn)(查找):
使得 Web Service請求者可以通過 Web Service中介者來查找到特定種類的 Web Service 接口。
綁定:
這里就是實現(xiàn)讓Web?Serivce請求者能夠使用Web Serivce提供者提供的Web Serivce接口。
?
============================================
好了,最后終于回答前面的問題了,Web Service相對于HTTP有什么優(yōu)點?。
1.接口中實現(xiàn)的方法和要求參數(shù)一目了然。
2.不用擔(dān)心大小寫問題。
3.不用擔(dān)心中文urlencode問題。
4.代碼中不用多次聲明認(rèn)證(賬號,密碼)參數(shù)。
5.傳遞參數(shù)可以為數(shù)組,對象等。
?
那么,第二個問題,Web Service能被HTTP替代么? 答案是肯定的。
===============================================
最后,花了這么多時間了解一個過時的技術(shù),真是日了狗了!最近再研究接口測試, Web Service是個繞不開的技術(shù)。當(dāng)然,我的了解還包含了Web Service的開發(fā) 和測試。
?
轉(zhuǎn)載于:https://www.cnblogs.com/fnng/p/5524801.html
總結(jié)
以上是生活随笔為你收集整理的Web Service概念梳理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: brew install php55 报
- 下一篇: android studio下NDK开发