定義SOA中的服務
服務是一個被過度使用的術語,但是卻沒什么好的定義。服務就是一種能夠以分布式方式調用的功能,它是定義良好的、自包含的,并且不依賴于上下文或其他服務的狀態。讓我們看一看構成服務定義的一些特征:
能夠以分布式方式被調用。這很重要,因為我們不能假定某個功能是處在客戶端環境中。 定義良好。正如早先討論的那樣,重用在編程語言層面上面臨的一大難題就是難于發現可重用的資產并跨越各種技術使用它們。一個服務應該能夠在一個眾所周知的目錄中描述和注冊自身,而希望調用服務的客戶端則應該能夠完全基于已注冊的信息來調用服務。 自包含。一項操作的語義應該由即將進行的操作中的信息和服務狀態所決定,而不應該依賴于其他某個服務的狀態或上下文。這種隔離使得理解服務提供的功能和對其進行重用變得更加容易。定義SOA
現在,讓我們看一看一些SOA的不同定義。W3C把SOA定義為“一組可調用的組件,其接口描述可以被公開和發現”。我個人不太喜歡該定義中使用的組件這個詞,因為組件是一個被過度使用的術語,會讓人聯想起特定的內容,比如ActiveX、EJB等等。然而,如果我們使用服務來代替組件這個詞,那么這種定義是合理的。
ZapThink是一家行業分析公司,它把SOA定義為“一種架構準則,其中心內容是把IT資產描述和公開為服務。然后可以把這些服務以松散耦合的方式作為高級業務流程的一部分,從而在面臨IT異構性時提供業務靈活性”。我較為喜歡這個定義,因為它使用了IT資產這個術語來定義SOA,范圍更為廣泛。此外,它還指出了SOA的一個重要特性——松散耦合(稍后將進行詳細說明),并提及了SOA的優點。
最后一個定義來自于BEA的dev2dev站點的SOA技術中心,在這個定義中,SOA被定義為“一種設計方法,其目標是重用應用中立的服務,從而提高IT適應性和效能”。這是SOA在業務層的一個優秀定義。它強調了一個事實:SOA不僅僅是一個技術工件(像接口和協議一樣),它其實是一種設計方法,具有最大化重用的明確目標。我想為這個定義添加一些內容:它不僅是設計方法(這只是前端部分),還是涉及到服務的整個生命周期——服務的設計、部署、維護和最后的停止使用——的方法。
希望這3個定義能夠讓您了解什么是SOA及其目標。在進入下一節內容之前,我想談談SOA的一個重要特性——松散耦合。耦合即組件相互依賴的程度?梢詫⒎⻊赵O計在一起,即緊密耦合;也可以動態發現和使用服務。松散耦合是我們想要實現的目標,因為它可以降低服務或組件之間的相互依賴性,并讓您可以輕松替換或更新服務。
SOA和分布式技術
從有關CORBA和J2EE的討論中,您可以看到,這兩種技術都提供了構建SOA的方法。這些技術已經跨不同行業進行過幾次成功的部署。然而,如果要在企業級評估重用,那么即便是在已經部署這些技術的企業中,重用也沒有達到應有的水平。在某些企業中,從業務的角度看,大量“服務”實際上都在執行同樣的任務,比如驗證信用卡、查找雇員等等,這種情況并非罕見。
為什么會存在這種重復呢?主要有如下兩個原因:
異構性或多中間件問題:一家典型的企業通常使用多種應用程序、工具和技術。同樣的情況也適用于中間件:Java領域可能使用J2EE,而Microsoft領域則使用DCOM,諸如此類。從構建服務的角度看,這意味著可以通過多種方式描述接口(IDL用于CORBA,MDL用于DCOM,Java用于J2EE)。此外,由于每項技術都定義了自己的傳輸協議,所以有多種使用這些服務的方式。盡管人們曾經嘗試搭建“橋梁”來連通這些技術之間的不同編程模型和傳輸協議,但實際的用戶體驗還是很糟糕:無法理解的映射(試試從Java到IDL的映射就知道了),這類“橋梁”的糟糕性能,供應商由于互操作性問題而相互責怪。簡而言之,無論是定義還是使用服務的方式都不是通用的,從而影響了互操作性,而使重用難以實現。 這些技術的復雜性:這些技術都相當復雜,難于學習,需要了解一個新的API和一個新的編程模型才能使用這些技術。使用這些技術構建服務需要編寫大量的代碼,尤其是對于CORBA來說。在這方面,J2EE做得要稍好一些,因為它支持使用更為聲明式的方法來構建服務。然而,即使是J2EE也無法讓人滿意,因為程序員要掌握數十個API才能達到一定的效率。復雜性的另一方面體現在管理這些服務的生命周期上,例如,部署服務、對服務進行版本控制、停止使用服務。這些技術在這方面的支持很差,只有J2EE稍好一些,而CORBA和DCOM都有其各自的優點。然而,對于每個企業來說,有效地管理這些服務都是一件傷腦筋(且開銷巨大)的事情。
文章來源于領測軟件測試網 http://www.kjueaiud.com/