Web Service概念梳理

  計算機技術難理解的不少,Web Service 對我來講就是一個很難理解的概念;爲了弄清它究竟是什麼,我花費了兩週的時間,總算有了一些收穫,參考了很多網上的資料,但有些概念說法不一。我以w3c和 一些早期介紹Web Service的書爲準。若有錯誤,歡迎指正!web

--------------------------------------------------------------編程

提早預警!概念太多,你須要仔細閱讀,或要閱讀兩遍。數組

 

SOA                                                                       服務器

  Service Oriented Ambiguity 中文通常理解爲,面向服務架構,簡稱SOA網絡

  SOA的提出是在企業計算領域,就是要將緊耦合的系統,劃分爲面向業務的,粗粒度,鬆耦合,無狀態的服務。服務發佈出來供其餘服務調用,一組互相依賴的服務就構成了SOA架構下的系統。架構

  既然說是一種架構的話,因此通常認爲SOA是包含了運行環境,編程模型,架構風格和相關方法論等在內的一整套新的分佈式軟件系統構造方法和環境,涵蓋服務的整個生命週期。框架

  Service-architecture.com SOA定義爲:編程語言

  本質上是服務的集合。服務間彼此通訊,這種通訊多是簡單的數據傳送,也多是兩個或更多的服務協調進行某些活動。服務間須要某些方法進行鏈接。分佈式

  所謂服務就是精肯定義、封裝完善、獨立於其餘服務所處環境和狀態的函數。函數

  雖然不一樣廠商或我的對 SOA有着不一樣的理解,可是咱們仍然能夠從上述的定義中看到 SOA的幾個關鍵特性:一種粗粒度、鬆耦合服務架構,服務之間經過簡單、精肯定義接口進行通信,不涉及底層編程接口和通信模型。

 

(這不禁的讓我想到了另外一個概念---「敏捷測試」,它強調擁抱變化,溝通、減小文檔、快速迭代等。至於不一樣的公司或團隊如何具體的實施並無詳細的規範,只要符合以上幾點要求的公司或團隊均可以認爲實施了敏捷測試。)

對於SOA來講,讀者並不須要太過較真SOA到是一個怎樣的架構。只要符合它的定義和規範的軟件系統均可以認爲是SOA架構。

 

SOA Web Service                                         

  早在1996Gartner就前瞻性地提出了面向服務架構的思想(SOA)Web Service不知爲什麼物,SOA還只是束之高閣的理論概念。直到2000年之後,W3C才成立了相關的委員會,開始討論Web Service的相關標準,各大廠商一邊積極參與標準制定,一邊推出了一系列實實在在的產品。新的技術和新的產品出現,SOA找到了能夠依託的憑藉。隨着 Web Service技術的推出和應用,SOA的思想被一個個效益顯著的信息系統建設項目不斷的示範,才逐漸成爲現今的熱門話題。

  由於如今幾乎全部的SOA應用場合都是和Web Service綁定的,因此難免有時候這兩個概念混用。不能否認Web Service是如今最適合實現SOA的技術,SOA的走紅在很大程度上歸功於Web Service標準的成熟和應用普及。由於如今你們基本上認同Web Service技術在幾方面體現了SOA的須要:

  首先,是基於標準訪問的獨立功能實體知足了鬆耦合要求:在Web Service中全部的訪問都經過SOAP訪問進行,用WSDL定義的接口封裝,經過UDDI進行目錄查找,能夠動態改變一個服務的提供方而無需影響客戶端的配置,外界客戶端是根本不關心訪問服務器端的實現。

  其次,適合大數據量低頻率訪問符合服務大顆粒度功能:基於性能和效率平衡的要求,SOA的服務提供的是大顆粒度的應用功能,並且跨系統邊界的訪問頻率也不會象程序間函數調用那麼頻繁。經過使用WSDL和基於文本(Literal)SOAP請求,能夠實現能一次性接收處理大量數據。

  最後,基於標準的文本消息傳遞爲異構系統提供通信機制:Web Service全部的通信是經過SOAP進行的,而SOAP是基於XML的,XML是結構化的文本消息。從最先的EDI開始,文本消息也許是異構系統間通信最好的消息格式,適用於SOA強調的服務對異構後天宿主系統的透明性。

  綜合上述觀點,Web Service不愧爲當前SOA的最好選擇。然而,就SOA思想自己而言,並不必定要侷限於Web Service方式的實現。更應該看到的是SOA自己強調的是實現業務邏輯的敏捷性要求,是從業務應用角度對信息系統實現和應用的抽象。隨着人們認識的提升,還會有新技術不斷的發明出來,更好的來知足這個要求。

  上面涉及的名詞太多,咱們等一下還會單一的來介紹,用一句話總結它們之間的關係。 SOA不是Web ServiceWeb Service是目前最適合實現SOA的技術。

 

Web Service                                                       

在解釋 Web Service 以前,先拋出一個問題。有沒有一種辦法能夠實現跨應用程序進行通訊和跨平臺進行通訊呢?

跨應用程序,主要是指我家開發的系統和別人家開發的系統之間是否能夠通訊。

跨平臺,主要是指我家用Java開發的系統和別人家用.NET開發的系統是否能夠通訊。

  像這樣的需求有不少,例如騰訊QQ上面自帶的天氣功能。

  騰訊要想得到實時的天氣信息怎麼辦呢?有一種辦法,那就是騰訊公司放個衛星上天,而且在公司中成立一個氣象部門,每天關注於天氣,而後每時每刻更新騰訊QQ上的這個天氣預報信息;這顯然不是一種明智的作法,只是想獲取一下天氣信息,竟然要如此高的成本。

  更簡單的作法是讓中國氣象臺提供實時的天氣信息,而後,經過提供接口的方式給騰訊調用。那麼這就遇到我上面所說的問題,如何跨應用與跨平臺調用接口。

  這個時候有聰明的讀者會跳出來講,你傻啊!用HTTP協議啊,主流的編程語言均可以實現基於HTTP協議的應用開發。讓中國氣象臺寫個基於HTTP協議的天氣接口給騰訊調用就能夠了。固然,這是徹底能夠的。不過,Web Service之因此在HTTP以後被提出天然有它的特色。

  固然,這裏拿Web Service HTTP進行比較是不合適。由於HTTP是互聯網上應用最爲普遍的一種網絡協議。而Web Service是一種部署在Web上的對象或者是應用程序組件,Web Service數據的傳輸一樣須要藉助HTTP協議。

  更詳細的定義:

  Web service是一個平臺獨立的,低耦合的,自包含的、基於可編程的web的應用程序,可以使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發佈、發現、協調和配置這些應用程序,用於開發分佈式的互操做的應用程序。

 

 

SOAP                                                                  

  Simple Object Access Protocol,中文爲簡單對象訪問協議,簡稱SOAP

  SOAP是基於XML在分散或分佈式的環境中交換信息的簡單的協議。容許服務提供者和服務客戶通過防火牆在INTERNET進行通信交互。

  SOAP的設計是爲了在一個鬆散的、分佈的環境中使用XML對等地交換結構化的和類型化的信息提供了一個簡單且輕量級的機制。

  XML是能夠擴展標記語言。

<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 消息的基本結構

<?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>

  當SOAP消息真正須要在網絡上實際傳輸的時候,SOAP消息可以與不一樣的底層傳輸協議進行綁定,同時,SOAP消息能夠在不少種消息傳輸模式中使用。包括超文本傳輸協議(HTTP),簡單郵件傳輸協議(SMTP),多用途網際郵件擴充協議(MIME)。它還支持從消息系統到遠程過程調用協議(RPC)等大量的應用程序。

  固然,最多的狀況仍是綁定在HTTP協議上面傳輸。這就致使大多數人認爲SOAP就是HTTP + XML,或者認爲SOAP是HTTP post請求的一個專用版本,遵循一種特殊的XML消息格式。

雖然,咱們看到的大多狀況確實如此,但這並非SOAP本質與所有。

  這個請求你用fiddler可抓不到,我是用wireshark抓的,它能夠截獲網卡的全部請求。

 

 

WSDL                                                                    

Web Services Description Language,網絡服務描述語言,簡稱WSDL。它是一門基於 XML 的語言,用於描述 Web Services 以及如何對它們進行訪問。

WSDL 文檔主要使用如下幾個元素來描述某個 web service

<portType>  web service 執行的操做

<message>  web service 使用的消息

<types>     web service 使用的數據類型

<binding>   web service 使用的通訊協議

<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、可被執行的操做,以及相關的消息。能夠把 <portType> 元素比做傳統編程語言中的一個函數庫(或一個模塊、或一個類)。

WSDL 消息

<message> 元素定義一個操做的數據元素。

每一個消息均由一個或多個部件組成。能夠把這些部件比做傳統編程語言中一個函數調用的參數。

WSDL types

<types> 元素定義 web service 使用的數據類型。

爲了最大程度的平臺中立性,WSDL 使用 XML Schema 語法來定義數據類型。

WSDL Bindings

<binding> 元素爲每一個端口定義消息格式和協議細節。

 

對於接口來講,接口文檔很是重要,它描述如何訪問接口。那麼WSDL就能夠看做Web Service接口的一種標準格式的「文檔」。咱們經過閱讀WSDL就知道如何調用Web Service接口了。

 

UDDI                                                                   

Universal Description, Discovery and Integration",可譯爲通用描述、發現與集成服務,簡稱UDDI

WSDL用來描述了訪問特定的 Web Service的一些相關的信息,那麼在互聯網上,或者是在企業的不一樣部門之間,如何來發現咱們所須要的 Web Service呢?而 Web Service提供商又如何將本身開發的 Web Serivce公佈到因特網上呢?這就須要使用到 UDDI 了。

UDDI 是一個獨立於平臺的框架,用於經過使用 Internet 來描述服務,發現企業,並對企業服務進行集成。

UDDI 指的是通用描述、發現與集成服務

UDDI 是一種用於存儲有關 web services 的信息的目錄。

UDDI 是一種由 WSDL 描述的 web services 界面的目錄。

UDDI 經由 SOAP 進行通訊

UDDI 被構建入了微軟的 .NET 平臺

下面,提供兩張圖,體會一下UDDI的安裝與發佈。

 

UDDI能夠幫助 Web 服務提供商在互聯網上發佈 Web services的信息。UDDI 是一種目錄服務,企業能夠經過 UDDI 來註冊和搜索 Web services。

 

經過前面的介紹,SOAPWSDLUDDI就構成了web Service的三要素。

 

 

Web Services體系結構                  

Web Serivce的體系結構中涉及到三個角色,一個是 Web Service提供者,一個是 Web Service中介,還有一個就是 Web Service請求者;同時還涉及到三類動做,即發佈,查找,綁定,

  Web Service提供者:

能夠發佈 Web Service,而且對使用自身服務的請求進行響應,Web Service的擁有者,它會等待其餘的服務或者是應用程序訪問本身。

  Web Service請求者:

也就是 Web Service功能的使用者,它經過服務註冊中心也就是 Web Service中介者查找到所須要的服務,再利用 SOAP 消息向 Web Service提供者發送請求以得到服務。

  Web Service中介:

也稱爲服務代理,用來註冊已經發布的 Web Service提供者,並對其進行分類,同時提供搜索服務,簡單來講的話,Web Service中介者的做用就是把一個 Web Service請求者和合適的 Web Service提供者聯繫在一塊兒,充當一個管理者的角色,通常是經過 UDDI來實現。

發佈:

經過發佈操做,可使 Web Serivce提供者向 Web Service中介註冊本身的功能以及訪問的接口。

發現(查找):

使得 Web Service請求者能夠經過 Web Service中介者來查找到特定種類的 Web Service 接口。

綁定:

這裏就是實現讓Web Serivce請求者可以使用Web Serivce提供者提供的Web Serivce接口。

 

============================================

好了,最後終於回答前面的問題了,Web Service相對於HTTP有什麼優勢?。

1.接口中實現的方法和要求參數一目瞭然

2.不用擔憂大小寫問題

3.不用擔憂中文urlencode問題

4.代碼中不用屢次聲明認證(帳號,密碼)參數。

5.傳遞參數能夠爲數組,對象等

 

那麼,第二個問題,Web Service能被HTTP替代麼? 答案是確定的。

===============================================

最後,花了這麼多時間瞭解一個過期的技術,真是日了狗了!最近再研究接口測試, Web Service是個繞不開的技術。固然,個人瞭解還包含了Web Service的開發 和測試。

相關文章
相關標籤/搜索