天天看點

[轉貼]什麼是面向服務架構:全面解讀SOA

SOA,即service-oriented architecture,面向服務架構。

  SOA定義

  它是一個元件模型,它将應用程式的不同功能單元(稱為服務)通過這些服務之間定義良好的接口和契約聯系起來。接口是采用中立的方式進行定義的,它應該獨立于實作服務的硬體平台、作業系統和程式設計語言。這使得建構在各種這樣的系統中的服務可以以一種統一和通用的方式進行互動。

  這種具有中立的接口定義(沒有強制綁定到特定的實作上)的特征稱為服務之間的松耦合。松耦合系統的好處有兩點,一點是它的靈活性,另一點是,當組成整個應用程式的每個服務的内部結構和實作逐漸地發生改變時,它能夠繼續存在。而另一方面,緊耦合意味着應用程式的不同元件之間的接口與其功能和結構是緊密相連的,因而當需要對部分或整個應用程式進行某種形式的更改時,它們就顯得非常脆弱。

  對松耦合的系統的需要來源于業務應用程式需要根據業務的需要變得更加靈活,以适應不斷變化的環境,比如經常改變的政策、業務級别、業務重點、合作夥伴關系、行業地位以及其他與業務有關的因素,這些因素甚至會影響業務的性質。我們稱能夠靈活地适應環境變化的業務為按需(On demand)業務,在按需業務中,一旦需要,就可以對完成或執行任務的方式進行必要的更改。

  SOA是傳統的面向對象架構模型的替代模型,面向對象的模型是緊耦合的,已經存在二十多年了。雖然基于 SOA 的系統并不排除使用面向對象的設計來建構單個服務,但是其整體設計卻是面向服務的。由于它考慮到了系統内的對象,是以雖然 SOA 是基于對象的,但是作為一個整體,它卻不是面向對象的。不同之處在于接口本身。SOA 系統原型的一個典型例子是通用對象請求代理體系結構(Common Object Request Broker Architecture,CORBA),它已經出現很長時間了,其定義的概念與 SOA 相似。

  然而,現在的 SOA 已經有所不同了,因為它依賴于一些更新的進展,這些進展是以可擴充标記語言(eXtensible Markup Language,XML)為基礎的。通過使用基于 XML 的語言(稱為 Web 服務描述語言(Web Services Definition Language,WSDL))來描述接口,服務已經轉到更動态且更靈活的接口系統中,非以前 CORBA 中的接口描述語言(Interface Definition Language,IDL)可比了。

  Web 服務并不是實作 SOA 的惟一方式。前面剛講的 CORBA 是另一種方式,這樣就有了面向消息的中間件(Message-Oriented Middleware)系統。但是為了建立體系結構模型,您所需要的并不隻是服務描述。您需要定義整個應用程式如何在服務之間執行其工作流。您尤其需要找到業務的操作和業務中所使用的軟體的操作之間的轉換點。是以,SOA 應該能夠将業務的商業流程與它們的技術流程聯系起來,并且映射這兩者之間的關系。例如,給供應商付款的操作是商業流程,而更新您的零件資料庫,以包括進新供應的貨物卻是技術流程。因而,工作流還可以在 SOA 的設計中扮演重要的角色。

  此外,動态業務的工作流不僅可以包括部門之間的操作,甚至還可以包括與不為您控制的外部合作夥伴進行的操作。是以,為了提高效率,您需要定義應該如何得知服務之間的關系的政策,這種政策常常采用服務級協定和操作政策的形式。

  最後,所有這些都必須處于一個信任和可靠的環境之中,以同預期的一樣根據約定的條款來執行流程。是以,安全、信任和可靠的消息傳遞應該在任何 SOA 中都起着重要的作用。

  SOA用途

  對 SOA 的需要來源于需要使業務 IT 系統變得更加靈活,以适應業務中的改變。通過允許強定義的關系和依然靈活的特定實作,IT 系統既可以利用現有系統的功能,又可以準備在以後做一些改變來滿足它們之間互動的需要。

  改變和 SOA 系統适應改變的能力是最重要的部分。對于開發人員來說,這樣的改變無論是在他們工作的範圍之内還是在他們工作的範圍之外都有可能發生,這取決于是否有改變需要知道接口是如何定義的以及它們互相之間如何進行互動。與開發人員不同的是,架構師的作用就是引起對 SOA 模型大的改變。這種分工,就是讓開發人員集中精力于建立作為服務定義的功能單元,而讓架構師和模組化人員集中精力于如何将這些單元适當地組織在一起。

        SOA技術

   SOA 本身是應該如何将軟體組織在一起的抽象概念。它依賴于用 XML 和 Web 服務實作并以軟體的形式存在的更加具體的觀念和技術。此外,它還需要安全性、政策管理、可靠消息傳遞以及會計系統的支援,進而有效地工作。您還可以通過分布式事務處理和分布式軟體狀态管理來進一步地改善它。

  SOA 服務和 Web 服務之間的差別在于設計。SOA 概念并沒有确切地定義服務具體如何互動,而僅僅定義了服務如何互相了解以及如何互動。其中的差別也就是定義如何執行流程的戰略與如何執行流程的戰術之間的差別。而另一方面,Web 服務在需要互動的服務之間如何傳遞消息有具體的指導原則;從戰術上實作 SOA 模型是通過 HTTP 傳遞的 SOAP 消息中最常見的 SOA 模型。因而,從本質上講,Web 服務是實作 SOA 的具體方式之一。

  盡管我們覺得 Web 服務是實作 SOA 的最好方式,但是 SOA 并不局限于 Web 服務。其他使用 WSDL 直接實作服務接口并且通過 XML 消息進行通信的協定也可以包括在 SOA 之中。正如在别處指出的,CORBA 和 IBM 的 MQ 系統通過使用能夠處理 WSDL 的新特征也可以參與到 SOA 中來。如果兩個服務需要交換資料,那麼它們還會需要使用相同的消息傳遞協定,但是資料接口允許相同的資訊交換。

  既為了建立所有這些資訊的适當控制,又為了應用安全性、政策、可靠性以及會計方面的要求,在 SOA 體系結構的架構中加入了一個新的軟體對象。這個對象就是企業服務總線(Enterprise Service Bus,ESB),它使用許多可能的消息傳遞協定來負責适當的控制、流甚至還可能是服務之間所有消息的傳輸。雖然 ESB 并不是絕對必需的,但它卻是在 SOA 中正确管理您的業務流程至關重要的元件。ESB 本身可以是單個引擎,甚至還可以是由許多同級和下級 ESB 組成的分布式系統,這些 ESB 一起工作,以保持 SOA 系統的運作。在概念上,它是從早期比如消息隊列和分布式事務計算這些計算機科學概念所建立的存儲轉發機制發展而來的。

  SOA 可以與許多其他技術結合在一起使用,然而,元件的封裝和聚合在其中扮演着重要的角色。如前所述,SOA 可以是一個簡單對象、複雜對象、對象的集合、包含許多對象的流程、包含其他流程的流程,甚至還可以是輸出單一結果的應用程式的整體集合。在服務之外,它可以看作是單個實體,但是在其自身中,它可以具有任何級别的複雜性(如果必要的話)。出于性能方面的考慮,大多數 SOA 服務并沒有下降到單一對象的粒度,并且更适合于大中型元件。

  除了可能離不開 XML 和 WSDL 之外,SOA 并不是特定于語言的。可以用任何程式設計語言來實作服務,隻要這種程式設計語言可以生成服務并且可以與 WSDL 結合在一起使用就可以了。SOAP 本身并不是絕對需要的,但它是通用的消息傳遞系統。是以,可以使用幾乎任何一種程式設計語言和支援 WSDL 的平台來實作 SOA 中的成員服務。

  SOA 和 Web 服務是獨立于程式設計語言的,但 Java 是主要的開發語言之一。可以使用定義良好的 Java 接口以及各種協定豐富的 Java 實作為正在建構這個模型的開發人員提供了優勢。Java 在此擔當了開發每個服務的功能、管理資料對象和與其他在邏輯上封裝在服務内的對象進行互動的角色。

  SOA 與 Web 的另一個重要的關系是自主計算和網格計算的概念。自主計算的概念應用于管理分布式服務體系結構的範圍,具體來說,就是幫助維護政策和服務級協定以及 SOA 系統的總穩定性。

  另外,網格計算可以以兩個級别與 SOA 系統一起使用。網格是分布式計算的一種形式,它利用分布式特性和服務之間的互動來為 SOA 應用程式提供計算支援。在這種情況下,網格起到了架構的作用,其中實作了一些或所有單獨的服務。是以,SOA 應用程式可以是網格服務的消費者。

        在另一方面,網格本身也可以建構在 SOA 之上。在這種情況下,每個作業系統服務都是構成整個 SOA 應用程式的成員,而 SOA 應用程式就是網格本身。是以,單獨的網格元件既可以使用 Web 服務進行通信,又可以以 SOA 的方式進行互動。總而言之,網格系統可以是 SOA 本身,也可以提供服務來在其上建構應用程式級 SOA 模型。

繼續閱讀