什么是SOA?
SOA的全稱為Service Oriented Architecture,即面向服務架構。這是一種架構理念。它的提出是在企業計算領域將耦合的系統划分為松耦合的無狀態的服務。服務發布出來供其他服務調用,一組互相依賴的服務就構成了SOA架構下的系統。
SOA本質上是服務的集合。 服務間彼此通信,這種通信可能是簡單的數據傳送,也可能是兩個或者更多的服務協調進行某種活動。 而所謂服務就是精確定義、封裝完善、獨立於其他服務所處環境和狀態的函數。
雖然不同廠商或個人對SOA有着不同的理解,但是我們仍然可以從上述的定義中看到SOA的幾個關鍵特性:粗粒度、松耦合服務架構,服務之間通過簡單、精確定義接口進行通訊,不涉及底層編程接口和通訊模型。
即SOA是一種思想。
SOA和Web Service關系是怎樣的?
SOA理念被提出之后,僅僅是概念上的,並沒有落地。而當Web Servcie標准成熟和應用普及之后,SOA才真正被用在工程商。所以,幾乎所有的SOA應用場合都是和Web Service綁定的,且Web Service是現在最適合實現SOA的技術,目前,我們基本認同Web Service技術在幾方面體現了SOA的需要:
- 基於標准訪問的獨立功能實體滿足了松耦合要求 --- 在Web Service中所有的訪問都通過SOAP進行,用WSDL定義的接口封裝,通過UDDI進行目錄查找,可以動態改變一個服務的提供方而無需影響客戶端的配置,外界客戶端是根本不關心服務器端的實現的。
- 適合大數據量、低頻率訪問,符合服務大顆粒度功能 --- 基於性能和效率平衡的要求,SOA的服務提供的是大顆粒度的應用功能,而且跨系統邊界的訪問頻率也不會像程序見函數調用那么頻繁。 通過WSDL和基於文本的SOAP請求,可以實現能一次性接受處理大量數據。
- 基於標准的文本消息傳遞為異構系統提供通訊機制:web service所有的通訊都是通過SOAP進行的,而SOAP是基於XML的,XML是結構化的文本消息。
即SOA不是Web Servcie,而Web Service是目前最適合實現SOA的技術。
即Web Service是一套標准,可以使SOA思想用於實踐。
什么是Web Service?
WebService是一種跨編程語言和跨操作系統平台的遠程調用技術。 所謂跨編程語言是說服務器端可以用java寫,而客戶端可以用其他語言編寫,反之亦然。 而跨操作系統平台是指服務器端程序和客戶端程序可以在不同的操作系統上運行。而所謂遠程調用是說一台計算機a上的一個程序可以調用另外一個計算機b上的一個對象的方法,其實這就是普通的暴露接口,如騰訊qq把相關登錄接口暴露出來給其他小企業用,而第三方網站可以調用這些服務功能,但這些功能的代碼實際上是跑在騰訊qq上的,這就是遠程調用了。
實際上,Web Service是建立可操作的分布式應用程序的新平台,是一個平台,是一套標准,它定義了應用程序如何在web上實現互操作性,你可以用任何你喜歡的語言在任何你喜歡上的平台中寫web service,只要我們可以通過web service標准對這些服務進行查詢和訪問。
即Web Service一種跨編程語言、操作系統平台的遠程調用技術。
如何實現WebService平台技術?
實現webservice有三大技術 --- XML + XSD、SOAP、WSDL。
1、XML + XSD
WebService采用http協議傳輸數據,采用XML格式封裝數據(即XML中說明調用遠程服務對象的哪個方法、什么參數、返回結果),XML主要的優點是它與平台、廠商都是無關的。
XML解決了數據表示的問題,但是沒有定義一套標准的數據類型,比如整形數代表什么? 16位還是32位? 這些細節是非常重要的,而XML Schema(XSD), 其中schema的意思就是概要,即XSD定義了一套標准的數據類型,並給出了一套語言來擴展這套數據類型,webservice平台就是使用XSD來作為數據類型系統的,當你構造一個webservice時,為了符合其標准,你所使用的數據類型就必須被轉換為XSD類型。
2、SOAP
即Simple Object Access Protocol,中文就是簡單對象訪問協議,簡稱SOAP,如下就是一個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不是簡單的XML,而是經過SOAP標准改造之后得到的,SOAP可以在多種協議上傳輸,而大多數情況是綁定在HTTP協議傳輸的,所以就導致大多數人認為SOAP就是HTTP+XML,或者認為SOAP是HTTP post請求的一個專用版本。
WSDL
即web service description language,網絡服務描述語言,簡稱為WSDL。 它是一門基於XML的語言。用於描述Web Service以及如何對他們進行范文。文檔主要用下面幾個元素來描述某個web service:
- <portType> 執行的操作
- <message> 使用的消息
- <types> 使用的數據類型
- <binding> 使用的通信協議

<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可以看做web service接口的一種標准格式的文檔。
UDDI
Universal Description, Discovery and Integration",可譯為“通用描述、發現與集成服務”,簡稱UDDI。WSDL用來描述了訪問特定的web service的一些相關消息,但是在互聯網上,如何發現我們需要的web service呢? 這時就要用到UDDI了。
- UDDI 是一個獨立於平台的框架,用於通過使用 Internet 來描述服務,發現企業,並對企業服務進行集成。
- UDDI 指的是通用描述、發現與集成服務
- UDDI 是一種用於存儲有關 web services 的信息的目錄。
- UDDI 是一種由 WSDL 描述的 web services 界面的目錄。
- UDDI 經由 SOAP 進行通信
- UDDI 被構建入了微軟的 .NET 平台
UDDI可以幫助web服務器提供商在互聯網上發布web service的信息,UDDI是一種目錄服務,企業可以通過UDDI來注冊和搜索web services。
通過前面的介紹可以知道: SOAP、WSDL和UDDI構成了web service的三要素。
Web Service體系結構
體系結構包括了webservice提供者、webservice中介、webservice請求者,這三者就對應了三個動作發布、綁定、查找。
webservice提供者:即發布webservice,等待其他的服務或應用程序訪問自己。
webservice請求者:即通過SOAP消息向webservice提供者發送請求以獲得服務。
webservice中介:即通過代理,把一個webservice請求者和一個webservice提供者聯系在一起,通過UDDI實現。
總結:
web service和http是可以互相替代的,但是web service也有一些自身的優點,比如接口中實現的方法和要求參數一目了然、不用擔心大小寫問題、不用擔心中文Urlencode問題、傳遞參數可以是數組對象等。