SOA是英文Service-Oriented Architecture,即面向服務架構的縮寫。
這個詞彙最近一兩年頻頻出如今各類技術期刊上。可是一直以來對於SOA究竟是什麼沒有明確的回答;SOA有什麼特色?適合用於解決哪些問題?與其餘的技術有什麼區別與聯繫?Web Service和SOA又是什麼關係?SOA的出現對於軟件架構設計有什麼影響?本文將就上面提到的這些問題,嘗試根據做者本身的理解給出SOA的定義;總結出SOA特有的三個基本特徵;而後以HTTP協議爲例對這些特徵進行解釋;最後簡要的說明SOA對從此軟件架構設計可能帶來的影響。
SOA定義
下面是做者給SOA下的一個定義:
SOA是指爲了解決在Internet環境下業務集成的須要,經過鏈接能完成特定任務的獨立功能實體實現的一種軟件系統架構。從這個定義中我但願表達的前提有下面兩點:
1) 軟件系統架構:SOA不是一種語言,也不是一種具體的技術而是一種軟件系統架構,它嘗試給出在特定環境下推薦採用的一種架構,從這個角度上來講,它更像一種模式(Pattern)。所以它與不少已有的軟件技術好比面向對象技術,是互補的而非互斥的。它們分別面向不一樣的應用場景,用來知足不一樣的特定需求。
2) SOA的使用範圍:需求決定同時也限制功能。SOA並非包治百病的萬靈丹,它最主要的應用場合在於解決在Internet環境下的不一樣商業應用之間的業務集成問題。
在下面咱們會詳細討論Internet的各類特色如何決定SOA的特色,這裏咱們只須要先簡單回顧一下Internet環境區別於Intranet環境的幾個特色:
a) 大量異構系統並存,計算機硬件工做方式不一樣,操做系統不一樣、編程語言也不一樣;
b) 大量、頻繁的數據傳輸仍然速度緩慢而且不穩定;
c) 版本升級沒法完成,咱們根本就沒法知道互聯網上有哪些機器直接或者間接的使用某個服務。
基於上面的前提,下面就讓咱們一塊兒看一下SOA的基本特徵。
SOA三大基本特徵
1 獨立的功能實體
在Internet這樣鬆散的使用環境中,任何訪問請求都有可能出錯,所以任何企圖經過Internet進行控制的結構都會面臨嚴重的穩定性問題。SOA很是強調架構中提供服務的功能實體的徹底獨立自主的能力。傳統的組件技術,如.NET Remoting,EJB,COM或者CORBA,都須要有一個宿主(Host或者Server)來存放和管理這些功能實體;當這些宿主運行結束時這些組件的壽命也隨之結束。這樣當宿主自己或者其它功能部分出現問題的時候,在該宿主上運行的其它應用服務就會受到影響。 SOA架構中很是強調實體自我管理和恢復能力。常見的用來進行自我恢復的技術,好比事務處理(Transaction),消息隊列(Message Queue),冗餘部署(Redundant Deployment)和集羣系統(Cluster)在SOA中都起到相當重要的做用。
2 大數據量低頻率訪問
對於.NET Remoting,EJB或者XML-RPC這些傳統的分佈式計算模型而言,他們的服務提供都是經過函數調用的方式進行的,一個功能的完成每每須要經過客戶端和服務器來回不少次函數調用才能完成。在Intranet的環境下,這些調用給系統的響應速度和穩定性帶來的影響均可以忽略不計,可是在Internet環境下這些因素每每是決定整個系統是否能正常工做的一個關鍵決定因素。所以SOA系統推薦採用大數據量的方式一次性進行信息交換。
3 基於文本的消息傳遞
因爲Internet中大量異構系統的存在決定了SOA系統必須採用基於文本而非二進制的消息傳遞方式。在COM、CORBA這些傳統的組件模型中,從服務器端傳往客戶端的是一個二進制編碼的對象,在客戶端經過調用這個對象的方法來完成某些功能;可是在Internet環境下,不一樣語言,不一樣平臺對數據、甚至是一些基本數據類型定義不一樣,給不一樣的服務之間傳遞對象帶來的很大困難。因爲基於文本的消息自己是不包含任何處理邏輯和數據類型的,所以服務間只傳遞文本,對數據的處理依賴於接收端的方式能夠幫忙繞過兼容性這個的大泥坑。 此外,對於一個服務來講,Internet與局域網最大的一個區別就是在Internet上的版本管理極其困難,傳統軟件採用的升級方式在這種鬆散的分佈式環境中幾乎沒法進行。採用基於文本的消息傳遞方式,數據處理端能夠只選擇性的處理本身理解的那部分數據,而忽略其它的數據,從而獲得的很是理想的兼容性。
HTTP協議:一個典型的SOA實現 每一項新技術都是在一些舊的技術基礎上發展出來的。正如XML根本思想來自於在60年代就已經出現的早期標記性語言同樣,SOA雖然這兩年纔出現,可是它所表達的觀念應該說在網絡這種分佈式系統結構出現不久就已經普遍應用了。例如咱們最熟悉的HTTP協議就是一個很是典型的SOA架構設計。HTTP協議的工做過程簡單敘述以下:
1) 客戶端,一般是經過瀏覽器,向服務器端以文本的方式發送一個請求,索取一個Web頁面;
2) 服務器端接收到這個請求以後,根據請求的內容進行處理而且返回一個符合HTML語法的文本;
3) 客戶端接收到服務器端的響應文本後調用本地的程序,一般仍是瀏覽器,把返回的HTML文本的內容展示出來。
下面來看一下HTTP協議如何知足了SOA的特色:
* 獨立的功能實體:做爲服務器端的Web服務器是絕對不會由於客戶端的情況變化而改變的,它老是很是穩定地按照本身的內在邏輯運行,響應外部的請求,管理本身的資源和數據。這裏一個很是好的例子就是Web服務器對緩存(Cache)的處理,不少Web服務器爲了提升性能都或多或少的對數據進行緩存,可是緩存數據、刷新數據這些於客戶端徹底無關的操做徹底由服務器端獨立完成,徹底不受客戶端的影響。
* 大數據量低頻率訪問:對於一個HTTP請求來講,客戶端與服務器之間訪問的邊界很是簡單:就是一個請求,一個響應,沒有任何其它的信息往返。不管客戶端申請的網頁上除了文字以外還有什麼信息,對於客戶端來講,它發出的請求只是簡單的告訴Web服務器它所須要的網頁的位置;至於爲了生成這個網頁,服務器端是否須要訪問數據庫,執行Servlet或者其它的CGI程序對客戶端而言,都是徹底透明的。
* 基於文本的消息傳遞:迄今爲止兼容性最好的系統可能就是HTTP協議支撐的大部分的web應用了,咱們能夠在Windows平臺下用IE查看互聯網上一個Linux+Apache服務器上的由Perl腳本自動生成的網頁。這裏的關鍵就是全部內容都是以格式化的文本方式傳遞的,無論Perl腳本如何執行,只要它的輸出是符合HTML規範的網頁,就能夠被客戶端的瀏覽器解釋。而因爲不一樣的操做系統上對於相同的HTML的解釋遵循相同的規範,所以不一樣操做系統下仍然可以看到一致的用戶界面。 咱們上面基本描述了SOA做爲一種軟件架構有哪些特色,下面讓咱們一塊兒看看Web Service與SOA的關係。 SOA與Web Service Web Service是就如今而言最適合實現SOA的一些技術的集合,事實上最近SOA的火爆在很大程度上歸功於Web Service標準的成熟和應用的普及爲普遍的實現SOA架構提供了基礎。下面讓咱們看看Web Service中的各類協議是如何互相工做來知足SOA所需的特色的:
* 獨立的功能實體:經過UDDI的目錄查找,咱們能夠動態改變一個服務的提供方而無需影響客戶端的應用程序配置。全部的訪問都經過SOAP訪問進行,只要WSDL接口封裝良好,外界客戶端是根本沒有辦法直接訪問服務器端的數據的。
* 大數據量低頻率訪問:經過使用WSDL和基於文本(Literal)的SOAP請求,咱們能夠實現能一次性接收大量數據的接口。這裏須要着重指出的是SOAP請求分文本方式和遠程調用(RPC)兩種方式,正如上文已經提到的,採用遠程調用方式的SOAP請求並不符合這點要求。可是使人遺憾的是現有的大多數SOAP請求採用的仍然是遠程調用(RPC)方式,在某些平臺上,例如IBM WebSphere的早期版本,甚至沒有提供文本方式的SOAP支持。
* 基於文本的消息傳遞:Web Service全部的通信是經過SOAP進行的,而SOAP是基於XML的,不一樣版本之間可使用不一樣的DTD或者XML Schema加以辨別和區分。所以只須要咱們爲不一樣的版本提供不一樣的處理就能夠輕鬆實現版本控制的目標。 SOA對於軟件架構設計的影響 不管您如今的系統是否牽涉到基於Internet的業務集成,採用SOA推薦的架構都對提升您系統的擴展性有很大幫助,下面是在系統中引入SOA後須要在軟件架構方面作出的改變:
* 使用基於文本方式的SOAP調用,擺脫遠程調用中出現的函數參數類型等與數據無關的信息,保證全部SOAP傳遞的都是有意義的商業數據。依賴於Schema,而不是類定義對這些數據進行解釋。
* 傳統的三層Web應用將可能變成四層結構:傳統意義上的商業邏輯層將被進一步劃分爲存放每一個會話(Session)信息的客戶邏輯層和與狀態無關Sateless的SOA層。
WSDL
Web Services Description Language的縮寫,是一個用來描述Web服務和說明如何與Web服務通訊的XML語言。
怎樣向別人介紹你的Web service有什麼功能,以及每一個函數調用時的參數呢?你可能會本身寫一套文檔,你甚至可能會口頭上告訴須要使用你的Web service的人。這些非正式的方法至少都有一個嚴重的問題:當程序員坐到電腦前,想要使用你的Web service的時候,他們的工具(如Visual Studio)沒法給他們提供任何幫助,由於這些工具根本就不瞭解你的Web service。解決方法是:用機器能閱讀的方式提供一個正式的描述文檔。Web service描述語言(WSDL)就是這樣一個基於XML的語言,用於描述Web service及其函數、參數和返回值。由於是基於XML的,因此WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的Web service生成WSDL文檔,又能導入WSDL文檔,生成調用相應Web service的代碼。
================================================================================================
WSDL用來提供對服務的描述 ,它的主要構成要素有五個:
1)Types: 定義WSDL定義中所用到的數據類型,即XML Schema Types
2)Message : 對一組消息的輸入和輸出參數的定義
3)portType : 定義Web服務的操做
4) Binding :描述特定服務接口的協議、數據格式、安全性和其它屬性.
5) Services : 制定特定服務的URL和提供的調用接口,包含一組端口元素html